From dbdf7d00336bb4b73ec949797c6b948a813bd487 Mon Sep 17 00:00:00 2001 From: jiangzhixiong <710328466@qq.com> Date: Thu, 16 May 2024 10:31:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=93?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 282 ++++++++++++++ .gitignore | 2 + .vscodeignore | 12 + CHANGELOG.md | 13 + README.md | 107 +++++ images/logo.png | Bin 0 -> 156686 bytes package.json | 128 ++++++ snippets.json | 225 +++++++++++ src/helpers/extensionConfig.ts | 16 + src/helpers/formatters.ts | 22 ++ src/helpers/generateSnippets.ts | 94 +++++ src/helpers/getPrettierConfig.ts | 19 + src/helpers/parseSnippetToBody.ts | 23 ++ src/helpers/replaceOrRemoveReactImport.ts | 64 +++ src/helpers/snippetPlaceholders.ts | 43 +++ src/helpers/snippetSearch.ts | 41 ++ src/index.d | 15 + src/index.md | 11 + src/index.ts | 47 +++ src/sourceSnippets/components.ts | 365 +++++++++++++++++ src/sourceSnippets/console.ts | 162 ++++++++ src/sourceSnippets/hooks.ts | 122 ++++++ src/sourceSnippets/imports.ts | 200 ++++++++++ src/sourceSnippets/others.ts | 451 ++++++++++++++++++++++ src/sourceSnippets/propTypes.ts | 291 ++++++++++++++ src/sourceSnippets/reactNative.ts | 196 ++++++++++ src/sourceSnippets/redux.ts | 109 ++++++ src/sourceSnippets/sharedSnippets.ts | 55 +++ src/sourceSnippets/tests.ts | 159 ++++++++ src/sourceSnippets/typescript.ts | 253 ++++++++++++ src/test.ts | 21 + src/types.ts | 28 ++ tsconfig.json | 22 ++ 33 files changed, 3598 insertions(+) create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 images/logo.png create mode 100644 package.json create mode 100644 snippets.json create mode 100644 src/helpers/extensionConfig.ts create mode 100644 src/helpers/formatters.ts create mode 100644 src/helpers/generateSnippets.ts create mode 100644 src/helpers/getPrettierConfig.ts create mode 100644 src/helpers/parseSnippetToBody.ts create mode 100644 src/helpers/replaceOrRemoveReactImport.ts create mode 100644 src/helpers/snippetPlaceholders.ts create mode 100644 src/helpers/snippetSearch.ts create mode 100644 src/index.d create mode 100644 src/index.md create mode 100644 src/index.ts create mode 100644 src/sourceSnippets/components.ts create mode 100644 src/sourceSnippets/console.ts create mode 100644 src/sourceSnippets/hooks.ts create mode 100644 src/sourceSnippets/imports.ts create mode 100644 src/sourceSnippets/others.ts create mode 100644 src/sourceSnippets/propTypes.ts create mode 100644 src/sourceSnippets/reactNative.ts create mode 100644 src/sourceSnippets/redux.ts create mode 100644 src/sourceSnippets/sharedSnippets.ts create mode 100644 src/sourceSnippets/tests.ts create mode 100644 src/sourceSnippets/typescript.ts create mode 100644 src/test.ts create mode 100644 src/types.ts create mode 100644 tsconfig.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..10b3143 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,282 @@ +const path = require('path'); + +module.exports = { + env: { + es6: true, + browser: true, + node: true, + }, + + parserOptions: { + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + }, + + extends: ['eslint-config-prettier'], + + plugins: [ + 'babel', + 'eslint-comments', + 'import', + 'prettier', + 'simple-import-sort', + ], + + rules: { + 'array-callback-return': 'error', + 'babel/no-invalid-this': 'error', + 'babel/valid-typeof': 'error', + 'constructor-super': 'error', + 'default-case': ['error', { commentPattern: '^no default$' }], + 'eslint-comments/disable-enable-pair': ['error', { allowWholeFile: true }], + 'eslint-comments/no-aggregating-enable': 'error', + 'eslint-comments/no-duplicate-disable': 'error', + 'eslint-comments/no-unlimited-disable': 'error', + 'eslint-comments/no-unused-disable': 'error', + 'eslint-comments/no-unused-enable': 'error', + 'for-direction': 'error', + 'getter-return': 'error', + 'import/export': 'error', + 'import/extensions': 'off', + 'import/imports-first': 'error', + 'import/named': 'off', + 'import/no-amd': 'error', + 'import/no-commonjs': 'error', + 'import/no-duplicates': 'error', + 'import/no-extraneous-dependencies': 'error', + 'import/no-self-import': 'error', + 'new-parens': 'error', + 'no-array-constructor': 'error', + 'no-caller': 'error', + 'no-case-declarations': 'error', + 'no-class-assign': 'error', + 'no-compare-neg-zero': 'error', + 'no-cond-assign': ['error', 'except-parens'], + 'no-const-assign': 'error', + 'no-constant-condition': 'error', + 'no-control-regex': 'error', + 'no-delete-var': 'error', + 'no-dupe-args': 'error', + 'no-dupe-class-members': 'error', + 'no-dupe-keys': 'error', + 'no-duplicate-case': 'error', + 'no-empty': 'error', + 'no-empty-character-class': 'error', + 'no-empty-pattern': 'error', + 'no-eval': 'error', + 'no-ex-assign': 'error', + 'no-extend-native': 'error', + 'no-extra-bind': 'error', + 'no-extra-boolean-cast': 'error', + 'no-extra-label': 'error', + 'no-extra-semi': 'error', + 'no-fallthrough': 'error', + 'no-func-assign': 'error', + 'no-global-assign': 'error', + 'no-implied-eval': 'error', + 'no-inner-declarations': 'error', + 'no-invalid-regexp': 'error', + 'no-iterator': 'error', + 'no-label-var': 'error', + 'no-labels': ['error', { allowLoop: true, allowSwitch: false }], + 'no-lone-blocks': 'error', + 'no-loop-func': 'error', + 'no-misleading-character-class': 'error', + 'no-multi-str': 'error', + 'no-new-func': 'error', + 'no-new-object': 'error', + 'no-new-symbol': 'error', + 'no-new-wrappers': 'error', + 'no-obj-calls': 'error', + 'no-octal': 'error', + 'no-octal-escape': 'error', + 'no-redeclare': 'error', + 'no-regex-spaces': 'error', + 'no-self-assign': 'error', + 'no-self-compare': 'error', + 'no-shadow-restricted-names': 'error', + 'no-sparse-arrays': 'error', + 'no-this-before-super': 'error', + 'no-throw-literal': 'error', + 'no-undef': 'error', + 'no-unexpected-multiline': 'error', + 'no-unreachable': 'error', + 'no-unsafe-finally': 'error', + 'no-unsafe-negation': 'error', + 'no-unused-labels': 'error', + 'no-unused-vars': 'error', + 'no-use-before-define': [ + 'error', + { functions: false, classes: false, variables: false }, + ], + 'no-useless-computed-key': 'error', + 'no-useless-concat': 'error', + 'no-useless-constructor': 'error', + 'no-useless-escape': 'error', + 'no-useless-rename': 'error', + 'no-with': 'error', + 'require-yield': 'error', + 'simple-import-sort/exports': 'error', + 'unicode-bom': 'error', + 'use-isnan': 'error', + eqeqeq: ['error', 'smart'], + + 'import/no-unresolved': [ + 'error', + { caseSensitive: false, ignore: ['vscode'] }, + ], + 'prettier/prettier': [ + 'error', + { + bracketSameLine: false, + bracketSpacing: true, + printWidth: 80, + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'all', + useTabs: false, + endOfLine: 'auto', + }, + ], + 'simple-import-sort/imports': [ + 'error', + { groups: [['^\\u0000'], ['^@?\\w'], ['^~/'], ['^../'], ['^./']] }, + ], + }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: require.resolve('@typescript-eslint/parser'), + plugins: ['@typescript-eslint/eslint-plugin'], + settings: { + 'import/extensions': ['.js', '.ts', '.tsx'], + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'], + }, + 'import/resolver': { + node: { + extensions: ['.js', '.ts', '.tsx'], + }, + }, + }, + rules: { + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/consistent-type-assertions': [ + 'error', + { assertionStyle: 'as' }, + ], + '@typescript-eslint/member-delimiter-style': 'error', + '@typescript-eslint/no-array-constructor': 'error', + '@typescript-eslint/no-dynamic-delete': 'error', + '@typescript-eslint/no-empty-interface': [ + 'error', + { allowSingleExtends: true }, + ], + '@typescript-eslint/no-extra-non-null-assertion': 'error', + '@typescript-eslint/no-extraneous-class': 'error', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_' }, + ], + '@typescript-eslint/no-use-before-define': [ + 'error', + { + functions: false, + classes: false, + variables: false, + typedefs: false, + }, + ], + '@typescript-eslint/no-useless-constructor': 'error', + '@typescript-eslint/prefer-for-of': 'error', + '@typescript-eslint/prefer-function-type': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/prefer-optional-chain': 'error', + '@typescript-eslint/triple-slash-reference': 'error', + '@typescript-eslint/unified-signatures': 'error', + 'default-case': 'off', + 'no-dupe-class-members': 'off', + 'no-undef': 'off', + 'no-unused-vars': 'off', + 'no-array-constructor': 'off', + 'no-use-before-define': 'off', + }, + }, + { + plugins: ['jest'], + files: ['*.{spec,test}.{js,ts,tsx}', '**/__tests__/**/*.{js,ts,tsx}'], + env: { + jest: true, + }, + rules: { + 'import/no-extraneous-dependencies': [ + 'error', + { devDependencies: true }, + ], + 'jest/consistent-test-it': ['error', { fn: 'test' }], + 'jest/expect-expect': [ + 'error', + { assertFunctionNames: ['expect', 'element'] }, + ], + 'jest/no-disabled-tests': 'error', + 'jest/no-duplicate-hooks': 'error', + 'jest/no-export': 'error', + 'jest/no-focused-tests': 'error', + 'jest/no-identical-title': 'error', + 'jest/no-jasmine-globals': 'error', + 'jest/no-test-prefixes': 'error', + 'jest/no-test-return-statement': 'error', + 'jest/prefer-todo': 'error', + 'jest/require-to-throw-message': 'error', + 'jest/valid-describe-callback': 'error', + 'jest/valid-expect-in-promise': 'error', + 'jest/valid-expect': 'error', + 'jest/valid-title': 'error', + 'jest/no-restricted-matchers': [ + 'error', + { + toBeTruthy: 'Avoid `toBeTruthy`', + toBeFalsy: 'Avoid `toBeFalsy`', + }, + ], + }, + }, + { + files: ['*.js'], + parser: require.resolve('@babel/eslint-parser'), + parserOptions: { + requireConfigFile: false, + }, + rules: { + 'import/default': 'error', + 'import/namespace': 'error', + 'import/no-named-as-default': 'error', + 'import/no-named-as-default-member': 'error', + 'import/no-cycle': 'error', + 'import/no-deprecated': 'error', + }, + }, + { + files: ['*.config.js', '.*rc.js'], + env: { + node: true, + }, + rules: { + 'import/no-commonjs': 'off', + 'import/no-extraneous-dependencies': [ + 'error', + { devDependencies: true }, + ], + }, + }, + ], + globals: { + jasmine: true, + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67dfeb3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.vsix \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..7fe874a --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,12 @@ +**/*.ts +**/tsconfig.json +node_modules +!file.ts +src +**/tsconfig.json +*.ts +.github/** +.gitignore +.vscode/** +docs/** +src/** diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..14fb9f7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# nicecode-snippets + +## 0.2.1 + +### Patch Changes + +- 初始化仓库,发个小版本 + +## 0.2.0 + +### Minor Changes + +- feat: 初始化 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0ea0d6 --- /dev/null +++ b/README.md @@ -0,0 +1,107 @@ + +## 下载应用 + +> 在 **vscode** 应用商店搜索并下载 **nicecode-react-js-ts-snippets** 即可。 + +## javascript-snippets + +> `imp` => `import xx from xx` + +> `imd` => `import { XX } from 'XX'` + +> `ime` => `import * as XX from 'XX'` + +> `exp` => `export default XX` + +> `clg` => `console.log(XX)` + +> `deas` => `const { XX } = XX` + +## react-snippets + +> `imr` => `import React, {} from 'react'` + +> `useState` => `const [xx, setXX] = useState(XX)` + +> `useEffect` => `useEffect(() => { XX }, [XX])` + +> `useDispatch` => `const dispatch = useDispatch()` + +> `useSelector` => `const XX = useSelector(state => state.XX)` + +...more + +## umi-snippets + +`tsx -> 生成` + +```jsx | pure +import { FC } from 'react' +import { connect, ConnectProps } from 'umi' +import styles from './index.less' + +interface I${1:component} extends ConnectProps { +} + +const $1: FC = (props) => {", + return ( +
${1:component}
+ ) +} + +export default connect(({}: {}) => ({ +}))(${1:component}) +``` + +`mts -> 生成` + +```js | pure +// 2022-08-26 - by dev +import { ImmerReducer, Effect } from 'umi'; +import { SubscriptionsMapObject } from 'dva'; + + +export interface XXModelState { +} + + +export interface XXModelType { + namespace: 'XX'; + state: XXModelState; + effects: { + }; + reducers: { + save: ImmerReducer; + reset: ImmerReducer; + }; + subscriptions: SubscriptionsMapObject; +} + + +const initialState: XXModelState = { +} + + +const XXModel: XXModelType = { + namespace: 'XX', + state: initialState, + effects: { + }, + reducers: { + save(state, { payload }: any) { + return { ...state, ...payload } + }, + reset(state, { payload }: any) { + return { ...initialState } + } + }, + subscriptions: {} +}; + + +export default XXModel; +``` + +## join us + +[Nicecoders Team](https://github.com/nicecoders/nicecode) diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3abac1a9728082f73bf91bc39782c4121a85918d GIT binary patch literal 156686 zcmeFZWmuGJ)HXaINOvhn2uhcv(n=|fbRzssqvYn|)73DZzhB*Le~2LJ#>uU^W%1^}>8-`;7( zy^H!{H#6#u`hw^D(!dP>AZ|y0V01bCvPAt5!|k==3qW!IgG~T{3Ghnpx%PY0omsqZ zkKcJLT==rg#n|sAXOU+UJ$e)c2$NTsB>%(2k7?O}KP~wKIMsEynR9rb@O9WzZO2u?{sIE#rPyxq%r`E|M7{vFp#?1N{H}({s#Tm9{@~r z7?`+Bfq?(_6E-yyK!2e>+xEYHiAxHwr2DVC$^2}^!~zh^)Cm#&=M6Cf9q#<+1u69d z0p?)w_?(CTb1Aq?GJq(@|Ja)h0E|gM3gC8L9~Sx_8%Hk>7f??0AA7@P(lE!s48-0u zP73)S8%Hk>L#FyamydhJ6V_)WOt-&rfYCb?!J^gobLmptltp{}Ccr$wcCz%7IeSA%V2;;cTp7UVKCuj$MS=b?<%82i0p!u*DvI^0%Eo_6V#Rv%`bwspH} zT~6HJ%6Yv+BIURd-NUY|*9 z5m@$q*ARi#NM3e$Ht>nk*lR2ANS@6mwwN4=oq9+mOyuz$O~0(!-6wo5Rijqq(G3(Q z=AGkS!;CLs?S5~HNI%T}$CeuRP!-F^O(oi(o0Q-Bmu7=f?g>rDU+k9x7?gaBqE^&=JnrAgWIkdHa^svz}2W{;? z9oLlN9O(=+WfU2%zx%|Qnb|6#61(wA6eo*6tATFF!UrWH?ns0+@2~M{S^{jJis|R@ zbf7^_9n1!MZ)tM&s`Xgn>r>e>9;W+_S#ARj*j3oIBfChI?aE2Svj0Ce3Y1|(8Oed> zpO>YDm=}cgKu~U5japmE&N~4vX+8?>`BJ~A#|B>sDDP^{&CoP!B-#8hW>HiS?HO98 z+dbZ_67jK{OirLLS9sg1SMVYK@sktP7xQiyVjhX_c?YSm1%%<^-(q}pMMm-yPQtna z^9nWN9zLNLsCr0spEOpAswhGKF&yz!gVL(@F*r*IcPw?3Ms%ktwaepyUCNO}vLj1> z^=CoS5hgv_nJ<_hG)XnGcn?6rWGPSZa&;{Ks<36ISqSTtSksP69?)73Q z3%?Zq3-}@IhBScC+$T`ZE<4mXard8IqcF9#*;%og8-3h>w5isTDOToxf`91Is|K-t zkn_Az?S9B?(8t*jK0Xn4ZxQ-7U$TFa9oT!lE$aW21HBxjt^4yk`~%)cjq+qAGc!&E zMP9jQ)j?q_EU6L)9~j8<9AGfUgn(119ly9Z_jR`F;$YIQX-|t>@WP8cQ4y%S;}@YM zdv3xI?QBj~D^Ze<>+j8@RpAms~(+T#&2u|gpuE0O-8W2^td)P?YH$s$9Y!XKW zl^mUu%5ztx#=|EiC0DPtc0w6HC~lo3E>9h^UMpF-=9{L~{nWMpD~y8)UH=XvKg#&& zxE)Od@JxEgFD+5qJ72WxP9__*ZdIG=$aWa;Z|h+G1heF%|G=U-`0W2!CR(PZZh#se ze@(Df0G1*>I&9TBE4|d)M*kSvFd>&po#&{Rm@?LWQg6z{tVl;xYiRcZyIa z{N^)ID<5=+_SRK-;4@oKEUREZj*s@<8Sxh@v%KCOFFkmsOrYbgpsgO><5IDYP3HZ& zBNb1Z82(yphFzFd^nF|9XM<~J5a|8$Y;u3(Lo%poQPKl3%fs=Ssm$$(=@S~$d)?ik z1TPiZyTplxAa?;Y-TU@*N`4}4TD8wXS%b?%uNe!4}QaHMh!cu zhtGKLsazc66fCQMA^v*+C1O1kyI*L$>6=}kvO*+cWR?r2tEYq1tcUE@2bv0SPZ(2~ z3`Bg|tDi95?^X^{fpRzPGR^8(!9Fs@HaX#8uSzp~J36GlAr zcU&vQv={5y$Vu;AS)=Wp*ZUa)58R5n`=clEF>|OAV$bR#J6EHZf71bRU2K-}sT-93 zXgXI#_tk8KP&WiFe*Oje?I&6I7-?lYss0EzRk(uX&An88y%P1_ViQ$pllUQ!?sc>8 zSx{W)^xV8*(dm*<@9-->ynmY2<1ADcn!4jj`{mXd4hh_8*TiY+Y<1K<)>+ec=9haX zSPNqL8u=F(C8s75eiVv8IH~5(gb15{=_~XI5jwuq7ERhDrt&XHY!m4reA}u%dGC2S#GNdb%{}kQEp$8U(U3}cS#zoi0Sgz3l5&HD@UP#NTCgbh8GFuf_GFiaKon1=Lz|)p%RW zBhD?GJKx_fvWuPr>b2WWRTsDpUXH+|#!M*a12tGQd;8 zi}?|$FzPg;G`0IlE{rt;4I3H5Uo^7F26#5`zit#JjHx>6>evG(OT#~hZQyD8E5Prj z;_)`_UqF>s6CKUq!`iG7RaO0ocE5`{;C_NthDHrCxZh6XlqFCDfQDohUJpVEneM&+>;dL@q0Dt~g% z>BVg+51wF>xw~NBx}15t`9cw}9)-h(MkQ0CE{~FXM95Q5&cWy@IgDn1-@maW^agBv zjPu-l3{Y|r+B=*OrF$P9#~0J&pL%E5ztD@;TRBOewBqzB3w7w#?t_r5_UUzZ<18$l z4N$FYjGLrjdf8IXTih{o?A<#|2lghNT@}EG-5Q?odd968Sf@TsKI#YF2d7jZmds5b z5bpfgP3-Vs$#QS#MgjFS2nw^AXVAGLn0zAl2eRU=_3RfjU&7SGdCOt#ce6i&RV!ML znv#6xvh?=S66Qqw96T@M-qL_hE2^?aUr9|upK16|gJnY=q)me!aMRzME_jT|S%l4^ zAYHPM<)3JGC+pUmg-}Dg@9vjFU#6_>Ds#f>f2I+DIDlAC>VtxMUX={955UpgHR|y{uv3|jMTf@Ah#N3Z5R#hZX{-NnfCNq7! zlFfFf@pEFXy2Zv-jh9P*i#k6J6dBv`(bmj_X z-lxC#Lbt&Dgp7hGEqeLdrc#=DpUqs4ARhPcyO5n$e{NOLj2=INzUhR5;t8*G22o}e0w4yUE;hM*ozDtQ(H_$4*zwka zWrcnz=&oE}qY)B+{1{g1XpDSq!ud($>cmXl9rv*6THH|O)U5uqo*<9RqR+>>w?ypV z9drx#GuD>*);;oMSbe)C;~1qjLQWK*N_FWWMbD5K51Z$a0p5P@?i#`7vB245Ye%7y z8pB<IeoNNP{5%s033TZ!i!1i1^o$y73txQ}SyKwy)N&5{LY5J5q` zq$wQ8%DViH5|u&nTX%4W+R=G-JM+k5mo1>QXc$W(XEBnSOGd zZ)$nSti=iEiF0o8S;fJj{gP`nTmOm%OXU;ZJH(fF1w`w2E{}r19M=}7c%8efhPV8( zOc|R0Z2;NQ-&&Cetkw>4li2hI)5CY(UEU=@xVvp$#LrphDwK>RCPv6-Tjcn23a~TV ztFFADnr1qf2kJXX{feJ(;%VtU^TfY99E?l(%G{KnAMd=*ZVdReH2#Xk1=f3a$V4-$ zRZgv-+l4~BIEPI(u0FKi$6`4h%28r`{i@V*eMs4LJq1!3^)l(p#NXalAcUj$}s+vCvsMiBxEbm~+25&^Oil zQ*+{VX(}`%&O{{Oc0atIO`<`ldnfX}!^jpvXH9-q~4EgeW9;4dz z94tM%jgZrj8lMcBkIZA1p>Gh4ZSve1^-Xy84*;LUO5yG={grfR%Jj6GoNU-hu%`T` z2(H6gkE}bLK2YsC2}wBlKpLtiR{o@T%vN#z#C?fTEs%6esCvw2mj)8H~X@EH$)0bvmfB_VTHd5^1Vn(p;ps>{Y25 z1nh!;*8vnyj}mJa?eyMVliA=|-tn+?E}>AbX6kPY^kt>vXVh0gdSWXWKa5Ta{hZ&O zmCzqL#UYp%=A)SX`XUuLxj#7gl^*BhC@n23@?Ss_MXl~sL3%{#wlP|{NOszr77(dU zU%Z_7mcMF*S>a`q=@OPyBp4eWR(H`gQ)()jW|s7E)Un&bv$kX;C4TH13rqxQhNw8E z#FVG(#yQP6Xm%V66tD3~4>UieNa3^6%~S zst~3=yT6fHJc#@6P>cN+sss)4DTzE5J}$>Y}%^fA-B{@(k3A>>C_MX9PW!jfm0n;I8> zr}nuZ#Z9+&VouV@=8Ig`hb&~5&EaPjOag1(i=RtOH{$Yhx9IMwVa1#HTeLF<0AExI zcOYj9_KE(fmz?{t`rVmb`kNE5Zxd0V47a)UP?U@gQ3bg9_{@Dz>da@Ho00N!5Qv2Z zv9Zziuw}7HGu8iq^?pii5A8{f-H$Ons%R~ zzCQ07>r0pi36H{UI<&=px@cyo{{0q{S|z~8OCtUcn*d)+J}&<>H3ENK`I2~6B}Hoz zy3YG^WR>x{73c2V95u%?T2KECZ^l^uMup$bMnbt}SNqzdZnFM)mAxV1G6T5o+=a0c zn?Zp&jE z>5(sAQ#T*ehTrxT&rl=B_g}#V61Py42r&D09dkW>J-1ocXlTUmJis7XX!I z1i*&q-G27u&3266NKP6F-3R~1bH@jGlHezO+$)w7lMf6ZRk3^_r&f=w zG)7eG_Ffjfk(MYwot&fs9jQn{+bo@cl~$tfoXj7!nPoNRjCn?F#kRrjvB5k?fMniO$hSNGrLg5j~|&Swdp>@rttj)ru)M}#(-c8(hX zLrb`@VpPWGH!Yf{T|i}V{+m`5O%LWH^FjRk#Fn0gXyiGtl|I&hro zvg?I^OwABp*ZkV}R77UX2KggGHv5y=io%V`UpY~QzT#J_;`Sl}NOv^-QCOVur!T=e zHcfu%{=ZrP$?EH&nN*6^9d8>ZkWp%E3nibt*D?+#PWzDZeMT)uVlPuP!yc?bZi>yv0yE9(ckZp?DL? zO!W&QUPUt(m=k-oZ_StX7cr27>3{p2drE{H9iNUg_8%R`S|3uA8NgUaX~<~Klhaa` zfBPpsYY>pVFr1j#++Xe+aDVoLpfrqm&==EIgAY`~Bz{#x^}s;~mpW{1Pniq%-KnCc zu-lU(xs#vaGjG#pGV|4agM%}5^F9POOLN#y^mjM=r*~YoS7vzIOUYmcHq|^Fwm|0# z@G8YZ7U-hzg7xMV164Q4h0YkiH?J76y5IS@*LKIKZ+l*kSC^HLhrXOhVz&s@rutfU zIPaekZhGZE1YX@!ZcZ*V%bO2^6Sq&~JpwNsJoj4V{X<0`2DXM%>07>Vrkv;{K7;Iu zi|y)_6RDYbJ#WqVr53*7@!(UPLePU)p;3>8;z z_-$2N8jf~>jD8E98(K#!t&jN6Itd{Ufa9kG1R(`Qm0F( zI_$9#Q=j&Duwv-vlC4ixA}?n{E?ojj#YBb2X~BYcKWv)^cBI;PxEdH;N~&~Vs?FTe zaWeJ9;IMIRhvC_EjS~i{IHw3b__$n!_kPecFgZG!jOL^lw4ONC`tQVKpA+k88;Hur z4-4H4{5-=tjN=~AT{v$!r)ifRkZzIk+pAMe?=~E9eoEQYD(IUQ)~wZ0y?yoU{4h~G z1pzdQvjmpxxIsBnBk%yJjwA1-F>wnSz=GHS6J@d4d)+mq+r9#Bcxz5CerU%shHr>M zcDhVo<)~&AgTHRALAr2?O$GDQX7%i+y%UwmKa;0<|HFi~+M|fDb6Sjxr)Y4NDZ@I{ z;TXZ&j_r%*7YF;-%5@fV#;Xho2$_YBWE#G+r#wzS-bd7XJPR1g#U1xY;SWwH>8QrNHDW@@Y5jHauRYiMpCoQG)`l<b7)?7GgjjCKFebHGq}o8*gnq zM94NdBLBpcX0&1X>+onKV-qLgF@<&Y2thl+%vHdvR=&TqeJTx$YfW}KXOPD412O4t zXvAU0wLEhymK>7ekHwx0fXNDLS1?i9{_0N1pR?jLOWvx0IbNQUsMYqh^+`?nix9C_ zb5b@enBjMkE-*X1sKh`o!<++Ml7D2rC4SjI$e<>aRklEVXlQ)j^T&!HFcW=y4&XJ`-ppb403)$8D<5Zfnzp?3qRLS=6^n7zcDT@@t%WTKx)Q z{auBqLk7EfquEym0xCR?(kK6@j()15mO+PgyNvr_KhnX|y`paLowy-B(6juh?YPww z+HStQty~pL<<}6=`u7k*+g_3*lkTVVzrX8tXG!0j5q>4kMc)#)?bwcLjG9(@j=bz^ zinCM}i^EVjylXY)>X$Boy3p3i+8P33P`6tx;|T*6jGM}-Onta54x#v@012ZfbCKwm z8v5WXQuBCWfs28?_ip=t7n4sG(n<2`y$jq^!c2ZLPse<2*&rAB6hnk-&1X0=zaCNt zK{~wgx4nmndtBIBkmq8_`-Sh-e8f>+>;*zQ>kV^kv0-UwwV`E{)ctmd#G&J zz9exhnhZ0jz)|^)|4r)rt`Z1Xh|w%(x&gwYhf$V0b%91t^~xqxk(8b58HzQ4H#x3Z zs)$JBd#!suHCvIXSG6h=#Uev7;YDQ8V9Q@l5)XLrud5&i9#TmVFJ^Ry+(+Y#(Hs)0 zlFpsxc!3=k}E!GQA5wnoL z$*D_u11)re5zEdlQG9d@;wb9D@1S~s0=k*;A^pqe_iw#sJ@VEsMU|mQ9@|mA_*QI0 z27XNOzM|oe;PiTjAT-qdCExfaxtmHLSIKHokps`rJ7lQjpRo@(39FjF-s7m5kB^Ri zAL=5IBAY8?c6u*Xdd(7PYVfF#=r&YR&{T@mP5vwt1N-GD)U+L-0f1A>8hI(Lg&N#d*-`7>Zf!|!0xdE;64&d0Fww_U)Ic0~}RkCQq? zb}Iy4pWbwE^?H+kzMm%E#Y#zZCjke&J(O{5bV&LOzc;Mmjjn|Ll5$EttJKNAy!t}N z==ly38{VOGV0@E&dL$+88pz8Yd_wY%$g7J)U$Ys z2Q}eCsX+1N?s&)2yBXz}78j)}$OdQIGJBBuGYMVThr*pKSblWyr+HDA2{RsF!<>JeTE$aHF^k$sf{b4iH8v}*Jl7G zHY!2KW*#@O&x?z`Gs}To5I)!2wPmHePK3|Nu5H%zKHr5Yv~Tqg02>??JYi~1h|2tH zasc-vwcJfMWguTz%KjvloP!QUdGeR*Ct9tHc{MnK zBS@7FtE-+hmCKROq-WYbWgDq(G~Pq5G45nF4re|;t|z3V&7+^%qS?h#TI?Aqak_nb zCt1%ldSo$qCyvp5@Me{UxwWv4x3L_ex6tgO!F;wpzGi&8B8iZwfB8q=(v@9@Wy%fI zg!7=Zx0Bb(+vt4q8}CtKfTMx0t;c+xy1%PEznFiD6!L1ia;Q;Pu0*I}BCoqN?3=jG z@k;@PVVQ*=dNHqJ2+wv!^86P4Y)R3p`HQ{gd6E(#mJR78p&(YZe9>u2J(QUN5B=zh zOgcEYTupqpRs8a$A7l4pqJGJ4T;o+Ef&z5*IgUbcQ4CuSNod-FQl2T zSq*dYd;4j9TU>QjH?i2n_D!vO?(?tuHwU_+N zKOZ7S`3(fq#k_wE7-lMV$lpGxAb@+GI9o%=+$!#6U& zr~vru$>agf!cJm^;;6k08etkY9_xZe3{fcjQv*|R4vA>9tElVI^G{JxX;l8b#zQ{k zD__K&0nKl|@bpr-+lO^$gs|NY9OeEDinmH&rSukUR2|l+wB#x+^8qWD2GTdV7Z^uJ znARncYI&12qm2!ieD8k~H1^~n5EMr97yWn_!O{sjW8*V{1%02#Zdusp=*n(#Q|LZA z7IZjU^YMLG1Kdb1yOic1y0L82km_nKC7wyVejRIKfgGOFVdFIz&j1;C9Tg93Xy zTW^IIg=%08d29KV$}qLiNxVE=q;j^?LbCt-)mlZ7_=}#>g`I=E=>xuN75JQ>PL)}T zL!mIr3W2Rks2-)3-1nmgI=JzfNpbd1y_v<^ulVyEocTaxtB8Kn2ans|8?~W&lH8IO zM1AXo8C8W@G=HOt+?7h(SK$2s?C9+KH_5e^DT?|Ne&-{~xTN=REwbwfJ9aNU2LI!C z&^nBf3!B&zJF6%!d_wEB3XiS^UDh|bZq2~&iBn%n=g3@a{lmXj|EV`=t0s#+td_wQi21q_I61pilqB~ zo)Yuup?jez*gff!8um}jC*Ff{EgZB`%u8uDK66~s@YS~Vn$J5c_rv{vgR_Qhv$WJ70DLip&_pfjhgFLU+19407^T?rrTb~o$kNsjPgIV){UGK>x z#WS0X$mEjwUnZ3YPBlO&Z^J#m%FS|2@tJ))6EBY>@xeaBw$^MrtlnGLXW~N1`FC%t zZYY)*B&lE zW4n%P`K7ay$dd`tLLn{U_Un9_Em{K5(x?pc@L$y8~YDnV??KW{qa6?a*>GfY@a zUa`yU>XOr{_|1eY_gel=z{v8%3%BbhBn!_r4XDwWef&YD8M9P8rvnPojN%g`UMj^rvOS6^8*8Ttpz8qEo$5)ypn>YVEe2yjkZ2NUu)6fgIqpPZNP60P=t96UN zIDipN!w5XWQ{bmT*PEib6TjBnjCMmg7$8&zOl{oU(QV7GYvA_m4I!5!Jb-z6zcAryg(Z%Xl?H0$O3YZm+12&5mWe zOiG=-mo!ss%?LY`x1|obbbxoO^irz+-V3p*o4^C`8aS2RmhWnqCTnS5UIf#B)#44m z7dly(k5JTUFp`C}wtf^~^^b>aHTy%;TP?54dT#oWAA+cJS^xa~X6n&N)op$1k=QMP zKfcO!Um-|I5r5?yXOBEPEM1-F|6#r?qoej2P{ zsUjD^nm_-2v8_bkYN4mDiPe&X#4*JponFH z!7w2-lIR1$YO&wEl8*Qir`i9)V^?OrA8HWVpHb5#A6EhQQWJ8 zqRvpqtBUBpT2K)58E$;lbHDpHX>JSEh1UAO!-dgFx4%J#cA=MKS5=SOTeAN=0!dM~ zN)2jUx{evQmM$I{Y3M8D%-{5#`S_Wxx#M7?@r;)XRoCG%Ie*1I9NSFJG1RKi8aKNr zBqo{>lxW;cbT^f$;Y|s_dN=VT#VGz^>w4|FK6)Ud0l?s`#sAmbYT$l@08Id2zI8&A z{xjFzs$l=s!-laD_4gLA3Z}^zZS}rlfv$|z9hqi=n_%(7w>zWIYCxA zNDuuL1Mih+Yge~I9ge476<>lLu2;}p08u6~r^0t0s=^olqJth?_1DOVEHlxOekQ*- z-97n(*om09$fSs$o;>f&IV7g?{*+)GW7=mqF(0S6V(#AT`wezOb?LK$*#Y|W7;|gqxZNhlI0f3LF)*Re0I}Syb>SbiJz4~+Ag}H@M4=s7qNxB zsL(AaXwf%9-FTsqAj|ElN&v&Du9I=P`NR;m$^xs%+dNac*Qlu?lBW-1EqKVVw=ymj zkFing9urK~m31`NP>A-Uz}7nQmtVbRIZv%CmS$nXWZnjHAZE@1zj4Y0p9BB$EG@P*Dby?~MA)QhOGZKqfH zaE0_{ORK3!;obJs^6lOywg$eDd^cJ1DG4S@4{)*kMu_ic(imjr+jph;7`qEzGGsGN zjU!!y4{S~Wjs~Z6nhW$88|_eK|Cd7r_O8Wlm%!5UwRuIWj0#PWpA$^J8}WHXFC&h` z3QKx%-4j6%KJ|OOJG{ODsa}r3i%A=5){oDJRa%eF6IlO77HqH>9v~fO2}lb0NEl-; zVQIU%9Pgjeb$H!COCd1^Z=bjh<1w{6v<0AFF3RHUI9##Eg>Mfd8IbTn}Hs zK|A$bMqza)T|vE#OxJ$hn14pdgUOh-0DjUT4l;4Oe6LUB0Up;Zk+6YS%Qb8jv+|vT z6o)`Ih-CY*R1)PWHMr&P1BN+dxyU&hmwqVAuYR zhQ&kDN#AMmo4NICbm}L#dH?3epyUF+J|b*tXoVt4=r_+9w}ITCp9dIxl?AFhm`@_s zPe*>$@^w*Ev)pd4|4U%9sHoT^YorasbE-rlom7nhq>l!N|Jzxl=k^`fqnD&Dl#rI~ zxp>K9#Q`!b3DJ~}*XUv;j<*$iS_$@W96fJ%+J#xC(qeOXpi8=c7El5@W|OWhclWu< z%yBLF;QBF?FigM7gN)qld)D*T4GWgK{e^pOUoXFQ-gNbprcCsAe^8UWimlf?RXO6c!RhAupUR0 z9HJbf^*AA!!EA&Mn4a)}OugA@>sqcL?vpZ&1M+!GHyKLB-jsWS8trh32S=hE7n^ip zsSuFzk^>j!lck8=L*to; zfLUVtQ<*-hdfCbS{HwshEKBOw_Uk7_sfbAl80hTkFN-XyQ9U@4dk`qr_|pw* zeBjUg;3nF9j9O3kj@b~$qxHj!c?Ch%%gd~bzMU(7AH~AP7P6p$dlj=GJWWZfhxc#& z*GGX#6vx~Mz^}K!(v;KtjwrB z0>_r?{fFo0=TT~@%?fs3=BcPe=jW@(iI^+i*A5y-lbq@KsamX+U(F!Oe;bsL-;v6x^qQ$JnT~t|-jJT36Q?79(C&wIClu8|%_9PwP0_ZYMfE zFHuq~5)Tno6qjs)_lU|j^CDpQjbssLvx_;e__Ox~2So$^hp}-7dZzFMQQ;Fe5pmz5 z1e5HHZI!Iy?B9xrgdy923}EN;@Q>>DHT;$WY|vZM=!zf5H=Y zCK@s>QHp533?NsXSj@o)Q~X%f|F|5Yw2rekI(jTD=q8FO9uVLidVV{Z>qI@NZv2@X zhVDFdf1;+m@x`Wws{_|5c=$Q(&Y7`Cmx>BXFrSU|h@g>N5HIC4$MYk|IAL|(q>KQ# z_VT^YLo#}{zLZHp#}51%eEr9_=aTW((|u!rkjOI;&dVk3EiX$Y{w80VVgRXTV?DcU z|F0GR9xuYb-&ddP#1KE*kU797q-gHbAMLM>kofTIE|mNRXi%J%v(*`iJ-U|XW{+yP z+*6w~qCyC;tsTr>`(Li?gYS%`<1qS}JQWUzop%V3aJVb_t9xpN`C)x)&$twz&paYf+@O?VM1G?w)gg&-L4k)pDud`4WopBz1<`%OOr#()69_DdUOcWmip)AW_V!j9lx&M=FF~2 z+5wz~@Ny!Z7W%!(JUqz|JVMctj)gs`l47U(?e-oHJ4A*h z*L>7dzM~GR#R-b1FWx-Szyi=@cKF_|0aX|i&=;8e956xF70PH<@TUUgW@8~5C!zUg zHT9kg^Tgi%e1DtH)Yu@-q6F=g{J63K17_=o5R^}}+M{}(bHn3vZq%tdGhi9F@`*q5 z%GF7z-OLev>2^9xK8cc@vp$)gTJ%p@yV!O&?k1*Ns&!$2|0ucPu4K$Hzz&0a(xalj zGyRMMM=-~vE#;g;o+mK-F}st+W*mn197gQif)AelJ>S-T^da>ovFRsb8h01<1-vOj zpT$?q#D}7eY;#3#S{gjP*+}T8bRGK;uI#7wc83vA&cM1Q)BqK3!>B-6LexcAt$Yg_ zx~Z)%z)e?W4MwH>Vr=|+vwD`gaxjq-#NPt#JvtxcrF!???7{nmx(fgvptx~2P#Aq{ zYRUzRuS94yi2h^Di~N>NjR!UGA$#A`4K&wW`ntehTllJr*~bmo?KCy~Q2;(XkrCFe zheuQpc2k|pln}TlHHg~B%uOZ}0Fvsw0Vdjfl5^{(BMsSENSF7DCsI(<^Qb5>u)qnf z8{z~`t$0Z$V?KtW$&5Wr{@}9&$_!y0f}75bjT>~fBa)n|CupFXYR#FkUegUDY49_g zd4~#!*^{`lL}(mm{X+_X1Xp!M%7gtv>i*=L#Dr=ujB$VLE>2rr)#10LFaQnMPd>&J~c;yy%bro1dhJRoj?9v*2J7n@ko%Vav$&1%06aF+|atoRf z%iHrLmlVCS9+>Ys^Gx1BH7v;F1G+3*M(rW9CuP0bS!oX&9IS4N16-zkT5MMN9lR$O z1SMH!j8}-a(n|57PLEz3z7P{N2Tny7KX0F?4e)z_GOvtzG>T84!Rtip^1*H#QHj$7 z{;Kw-^k<62Tc+E@^|LOD-aD)DpRNulXeQm4W0_BTnO$|(PNgr;-JrJIbm(iK;*?Ay zy6Z(W-zTtt-bMXH%FJSn(lU7-gwXQ4Ki*lro14{vSmFx5E~ zdzfNr+%Mq3}5T7iJ>ht z9>MAVs0g`BWUBcSxmH|^M=$I3PGNDb^N~0cMdH8AuD3oIW&6FUFb0%*2)cRer8(X7 zht8PBOt&r3x+atOSz0f^_!slOvbfi&lZ5vQX=I`RevnFjKxtY2P=Or)eflUQR4@``a3ivK-Y~9~+5M-)Iv`*-?-f zVX>r&vQFzEu4PD1l|H6?gREf_i_U5)~`Qr@WQ)8MbS9iq?HT&{_~(0HTdcHE&8ZE*vLsW z;31&<`>mb=fT{dAO1dNgSwleTGlxL|g~eZ&jER`-r>HvlPJc_L;irxNiINM5Q(+tA z$5}qRIr#_*6!G+wZ4Ny`{^5oZQE`zGR+*{NiW-;ZA>kiYT{ApWgx?{h;2Oz5T zaQB3+L_y_q4N;Xh0gbYWX-Xi$UR{vo!PRf*j`UfOIO8kEHSLQQ$(3r z6LJZJ7_h%cP9{Y9dziH4qQf|w6tz>zaBlQew;Ok*0A3#-v!2mYGE(E2@IX9ZGZI-V zCg|y|yv)}O-xd=*3Lw}OBQuD%M3l{2+uwK~8bo-bW>k%LROQc_bHY;zbr|C9kWJZ< zewMJ-?>xCHjMtga;~%+NWffTu-P{+1da_3?(d@SjkhkTOV$MIc zyPx0ap%cSos^n@I8|Z!5XSF%j%*+;6$Xc?TCBK{NXY@=1jR;Jo!&rtG;uMJ*EyuD( zHES(;6Hai$lP^wwuM`!w5?{Ony0+TX$M$)@7U|`;qkG;OH{MxDg5rccQI1^Dgku0g zWt(Wso>xG3QE`*Dt1t%v?mtZrP!s)bdarMM;{NcU;j;D?_E@b3dCP)O?O3Z?ink2^ z+#6MaQt`XBgJ*KV>Lt$#0*}Q3Y7*Y;U>}H?2R8{=ZcE zCMe|9(*u=Nqn3`3RSs^-Vp4Q3r;~>pyF?OuRXMJ!f!4}RLnf-iPleC(h)rJG~GWv5p?-I@u;p<>x|28v0C8vMT_8_>}3( zx0gCC{0Y~${bm5%8=L>9ks#3NQ&1!v9bu;Vp1*857YMnva;7FVJ29*!*i1M1U+)YJ4ke#N*r$r=;v_xXzYWv7ek!V0UT3iFID388#LMh>LDVyADJs7E z8ZYPV1guILXVcYz>K5e~xVliPMk*XnWgYDHa#tk8rQv$NCnHlNziPt4!Ow-Xfd%_I zT9e>8)4Gil@VdQ8`go$+Dp9rlzu*MKn6$A2{1tlm*t*q>15VlYfx5~T^$)h~Zg+qn z94mb1mm&`>66%fR>6YUI1mh@3Tb7xFM-L#o?PSsEb%l?M&GcQsQj2Lk?TlSqpVWwm z9_x~=>s^{ETlvo<`Alqn$$r2~&J?emIExqyQu|+E0?rb7(QZwpa|xZse;X@ZliWd# z)^7407Xc<6`uNaYxmKVz|A<;B6mA?t0gVO#M6~H5d|q-41d6JW9{U_$A4q;4#_@f9 zjn`~qLVl3o^>hTC8S(N*MLr6WpfRT7BL7EIfrwURnKUQvI{6vFzXp+*Qw4c0Jv_dW zoM+g+#BF)ql0+6TnZ9(Yb|Ozg0eP46mUm_YRa(GOufWq~LO(Dyoqv9(eLx?xG^C*T z7*`ajZ4mW*=v9@nq&E#*|KOy5n6eg5M}?~C)cu(Tw)}rs5{79eTp1GP%Q-qjA_E|% z$H3Q4PIuAQkt^Zn74v-}rMDcMoZ^YqR>>WT6*&fm(0~jY<23h`pxSTBsW``Bi4olm9oH%@__o9Zed~rBzInJDp ziE;J3I~Vif_|hc#f$)u0RcZp^X-RDa4Sba)2nY8#Ic;G=J7@harrnY#Bl>LRAY%P- z?{xi|#YXy{qHO#j@l z?tG9@pmO{Aw_%u}==B>9zen1KUQ3CxWr+X}`|1z4T7LgmSxj-HY)cBy(-jp+VlDoT zaI82#%@ux~CtTQQu4NO3Z`#0Z=GCw0;()mZj4FUzw@ZTNznGW?l{nFw*9nPbQIo5$m@O0M|E|&k-4j_fDpbogC1zaU zFT!cLG$H=$_1ovUeXn~Ky&?I2c3gNXSlE?)6WzYst2em>y)^#R)JiJd-2%zLK$D9wT=TuYmcd)TFpc4mI(PtZL8&cN#PTv%*iX}sYrFfI^C z`j~PK(xu2a{V!S{DObmoZ+WN

(lLh2aB(ysG}4wMt%h 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

i<{PaxfNL5L09%nllu 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 )SzQjklw+hvM>#cx z-z31#VVWRZX{#7u@MR(3K1Xk92G%Djy>`K)o5ztFRtNbrfJwJVCW&&!O3tZ#T?u|( zxR$FDPwMFgNoVtP*^)Z2%fywwhU(;$OfS#WsA8JfAogH6Qi<%8or3-Xt1=7_F$=~U;$lE>W!20M~ zapf&dUlPoJ)5O8Ddowy#g0lscCB^V+Gq#BcAUq-oV?grXqbxS4oh&G$Le8`E=MyIv zo01H{M1Svxg^x`;m5GV1cc-*V$3r2V2aY6nnv6>m(GZI~>WNP02tR-OlCN!Lz}%q! z9v21L^KHW*7Rfz#8$zsryzO0bTxxn11l}HRS^usc(u9sk3WH zVzL+qM5yCXKc98!@bA>axb$HAr*}_+EIOYxOh)>e-JsHMyousUbEHpEd%+O(`;?Xqxz99RrQ2pmkq6_e6D>6kuobrkj=yBCqx>uA@IZ)ms zg;K}E(sc2<=!MlQfoGX%$l~HG@C*Ll#84@mRLqf_mcPp3`2Cy$t@V)pk7JtBRi^2P zi0kd?8shF4icp{Z28xg3b&7A^U|0NyY%uc!f8h z8n1My$VIl>3o&r~2))|N2(l~CfZyHvon)sS^DXf)K>mHG2-GKi$b7Azu+;Sdar42l zZ2cUqqz3(rFf1=k&3koW@IF6g;R?ELQo5&^sDN;@T6uuxMB^`FnmcU&NEY>os5 z`I{Tc(~h2V7y75kft-+|vcN~aI%Xkq4t#Zxi3@dw^BRXaY(Vte)*)SwW7^~qJeNhr zWVZJBzm_9c2KC2n3CP^%$L408p?Jp5-*Vp1Ah)SMIZ*pB8w(7^hlU+dzp}OBjDGd? zXL%II7YqiS`BoZAHBWI`zY}(w;p8{Mgsz~_5D{?}WFg_Aod4*Es|67j9dhw4>XEc` zO*`*r{s>Lth?86U)Ww-rEE4skl4CH|FV_c;8y8J)jtu>m=_q@L7Z!%ir}`FL<* z`R|O4<>mz(&udJYK5or z1ZI+v7HVGG|5UsLU71ztsZg?MVr)r(Mp^5LBRzh-G04Z)W?NE0RMf|Z+tkSQ_MME% znmu8r8GE0QvlmbdY=HaHJO$eh9~1F20@8PHnUeX*AMnRHEjRkdrc8O)6bK1K*L2io z)B2F|OLlF>Ma(a}&AMB^6j1Vx#f|$lg6DhsDS=lOX2Gfc5>*T;cefu#=ehyu}QSCW0l2mM@$ z!$dHtr5kk7Me0>oO|;=Fbx!=1-^s;=C={RSz4%@|A#rys+-AKC+l;EsI1}yPFpu~N zOH53Bu~v-db@-*O;`Q$b^>Z7Z3Y30Z3~AYhptq%D1AS^8vw9vUs>;~Ptvj8mQ0U?q z{ZKkJg@*C*6`zv-(J#I8!`lpe2X(!nxJbT*=tXt_h1NK$a={_!?)IT z8N>C=puWDJr@_)@R|1O@`Ohj;emmuLN8X8=Mhu%ekX#aRIsUA7X5t4>CckY*Z|~x) zv;P6e5YTj0)W&hgT5)HtLVx+@_gFxb)4lFNny|5EIPfqnE9&l5N~z-Qm-O=oqO3Gi z=gM}FgCEtSUF}O=JU2I8`_Nz5MZE0SPiUEAnSm`>Ian4t!%k+*Bl5uWZHg;Kdl5

MunTk?V<;XcZN4BM;|({nGx~H1RT3{LEYO zXdjqLyXxAiWB$YOa-k1s#9~OZzjg(p(^>4dbQBgB$84Vee8@d#-5wl8GW+3UjB?E5 z!ctW8yQok$M&b2~WdzyrvllhZX;Oc-7M3e|h7_-~Kv9`|B1Ev@NRV_-heGnr2RI3q zFB7K4Z4w`3nG$UM1`$H;OOi>n#E>+*ab)LJ(iwuzLJGikXxWLy)5a!3x(9MF|0>7y zP`i8$_}QN6@~>x<3jbgT0#gVuCU-A)Wm_&8t2(c4!gTa|Y+n$#m%So|$o=}j&(;$| zRrxF4K}hR5a_=Z|b+dSNpF;h;0>y;c89;g|&iZ+#(!AF)ruXTloRvpLB(&?H+7fQh(=MEYkE*1(cV)%0ZL&mcjMT0v%#5>sxI> z=jXKQ@c&M(531w7Sow&}|LiJYd1cKG(0d=U53@^ja2@jfwr{_4>un2;(pfc1d&VS@ zhc{J13uQ+Dz5;fue)9!}j99Hs_at@*Ad81x>5+9(r8jHTr#g*6+yP4JN z#kmQ30UFu73DX_QL;_}L7reu#>Lu}s5=@uEE2IiQbaX8oYcLNJ2{mDUyEAodcvbn9 zLp*{bRkr#D++WouD|I`n{!8z?3aFLCWfbzW*W24Bue+Nyk#|S-CgA7V<_jcL4vtAk z3=CF$jvmY1xUo`w2&v>%f=jaLfR8%deAd7B z4wjPPkY7@9ilp*ezhZ}V5`z7Ud*TIOt5_0?(A^ZY)G9`+l%42!BxqlQi9WN$<$0h_ zgzU2k6+)}c6z;y8ZnfKWk&0}bc2IT9Ak|rkjcWS35n#WA{n**q+nXzTQ9~Zb|IP02 zalv&>7{+yb?R2+i6ab-3-qrPT#Ik-fIpWCf?UR+5Ox%G16}d7JV{5nzi5w9D!dUj( z$l_IehmACkkbU7dpCQd@a2=THmt7_a>~YL}U*f#1#SB~(h~#@onqJ0u{U#J|d+&67 zwg@Jm2uc}KH@o}w;Iiq{+vQbRML5j=szlP8WKkNsPiynI$DTQ-_}ph~lfmocXV}PY zoAy6&Pthn2kza-5nX*2dro^Wbx3QKvBuL%jgVAM|MRO zJ@5GkhKQ|k=H)SW*xR_cd~^7(F!d52T-|uHEPkQ$3-u)P3nt|nZ{IjBVYH9WRufdL zj+lPiI$@K)^hS|VY>L~v%e*$2Ni&1t+OA3$-sVhv5YIPw>$Z*n`*fP$Y9~19yyAy- zG613Lys49(mgrnT5*Esa)0pbtYsPp;UKQ<|HDe>T`GVn~>&X5b%P6 zLxA^RZt=2!nZOXzW{lvQ-2k6xnae~9RMXGTQjQ~Vk&ESH2&o+Z4bq~bfQb)Z zaj3cU{AkmPoJfF%$%zOUb)PlvWI!2}=n24^)KcfR+6fEf{-su?Kk;?PRJBhca|Cgv z5+k78Koeb6j4@0mR#8)o(IvGa_4VX?Gv>GN9z^T2EAzD1%Moc_ zfX;TMqb`mYdMab}S2lkpgr*lLV7aMRTDW;*v)bfYe3c}9Z38~_5hB9kBq@~E%Ms$r zxm=)u9MSz9oXL7_2d?v+z(>jT1Z?e5wKVWmf%M0c=ue4 zCNGK+#t|sP*>ZwW(Y(TBDY}*+Rg?war3wQXYJ9prPmIl!F*E%fdz4=S+@ zK{Fg8AvG#5gH=8A+i5My@9<`SF6LV1W~5lx zLsMY8&~kb4zo)z>k2!Z;WMl+{9B+vNuCBPwT{g_>O_B%;@`I&yr#vH=NUe4`>KT(R zZW;H2{|{B~84uU~y@Ae*!HhbH-bVB;LWnxL=n*Z59zk>>M4Qp0j_6&8sL>K7(MA`d zBs$S0M2QxnyW2VE|GW3T@$rVe_qVL|tY#xU zeRRzagP~OD230;1C$0eTP(;aL-JS*VHfiP^?I=c@aas|FUEJCi*2!i9-!`zoRh7w_ z{HW-8%hz!E_qK(6GX*6CaBl?UzY;d>wK}#JGQyLSZ=?@8;ZZUEgOWk;E&{M2eq%ua zWmW5ukle8qe!c4)ewFTH8$iZOgz+)DEu>pxt!^sXGyPyhy8Epgo;^FpjSV4iUaDjm zq22(cQBV5e#@*yS{q^~hB029X;6DlhcC%(vdMFz@M5XsN_{W*VT`j_43&J)ZTJ){M zj$^#Z7rV2vlpL5C%94G}isyzaEuyp&Mh1nr;@765i{-&j=@cXE-_yIytS-;{yY{^E zs#4pWct>|atJr#-dASbmJfULR1&iiv7C}Fln~(QrCH?CWnKZ38oXXPGqVFMxZ6??+ z?d{%LC(Gi0=92rZGPLP&>y_yn%VN@3`k{zT4lTDniNW;xB=$?fuq6jMY~M8GiXTp`5n8sgGAOps^L%H zo_h|)7(_In7uOZ^FEyl&6oqnd@MWiXu2r@yhtty7T$~C@ z2EIl5?#66?f%PwY?tLti2~OiQ^LSiFiuWLCL|&YJE~%ogKHX%UT~sJO?Y>Z*k~$HN z-KD;BKe|=7GqF{2m+?XLDM^b-1Z>RK3G)6HA%Y3vUuBWdB4GJ9|FeufmU9WDt9$5e{#S*6KW8Gmfd6vmy_2B6pSJI z((h?C))(;IqnDKKjyKW(-|Bz345*J%*EcndkF#{96>j}QBX4`K3#tF~6Al&Z52MufW~oMY~iVZTB{DN3kMD^hQMc-mkxqkoxkEBKNY z^91{1n6FMcAq=))@jSGB$y*&c0mP57;t3wDaJBr)*$)u~;G9CWFCh^N?GHxbnf5B% zW*;MdLo)D0mW=e)NsSVNpU4CW2$px%?rQ{C{8EjBp6ho@iM=a**T$|!)-m|LsvE!; zQy-H2#QwX@bXlm~$pYWY?(qFV3Hh#`xLFlEGmNlgee1)G*MkDkS5OgAS$tz@{afRS z5%qU&8!V9n?uHOtdh^uDutj6))loX~@-~2662=drD8ZY#4b+||02FrY%v zEDXWbbQ9x_Xf%)vM3D%vN_p4A_k&-bc!2}YsxA%ZaI=qz&`a+6A%~?Fn=iy(-ppfN zYnIFYb6ovV--X=AwraNgs`ZwlmHsPIr_G(`tj(mO#c@h!WG+;(9D@Kg3lL&aUXYE= z-Sd{o&s0ykB4gy++j27!9uyCCtn5ulTrvK2bkcnsUsPYVlRw6>TFm)6bTE3t=>6px zM^YnlO*8x8jo%XY$jJMU(?`@=KMSkVgIq1!JnqeTMHq2I2yR|6c%9J(5lcegSey!w zI#^x4&fhrjELU9u68Mqx>5jB;F3Dv*(Qdr_qRasW z?9eT6V9SK8M9E^?q8h9Lszc1iTH`iz6y%-{_PPw8BHoIJcBrEln5@GFD(@i;pdl)_ zPi=X_HLqJU9)%JNMvUO&WKxO>f4jWTm5*4qENR9CF({!7$>c0nI*<4a1>O)?8v46W ztVIq~wZFU9Sfm`6+&B2NXzk)`T(~vi4)Y8yGkGliw;##>c?~geRTDvRLSDz!SzeoU zXO9aHpFjlP&%}z$bm*2n)r`sDdXjS|dW^$7BQ;E?-t;TLcXX)d2d(CvJ}ezg{d7x~ zk_Uk$f8soSSt)d5g63l6iXjU6hK^2^yyht-3=9rR3IpA20ze~`0}5mS_j$VTZ7|ox zhea+R27Sc~P84jrET{|)EYHcpoPS-)6+P3{gPhJ4B=2e%is}@Yj=I#D$C1f5XHjje{C{c3H9Uhz^KW?`^@$H;MZi0(}|P! z`-da^pUd11wsUNh2($2cxsq~chxzi2|NKxg>kvqEpyx{|AY>bgd4X=lu3O|6Ql(@?`XiBV_8GN7qz_oDtw5ul{E zf6)rFD7eMPP;K7v$BjPi(Gksjz$jz(mF{55*I5@^XMPjm2@_>&7S7r~dE+2)D2Q-0#iq?MVEuGaZ z^tD5*7EPZ}TZNuV|1K_im9ka`As|Kjj2_;&TAp7L!~O#q^6x|ASt1>m{BiZnsQdR^ z=J4-OMhReu^T^+f>18?fF^R=}5)j^Rd%g6m_h_4Nqy7p|H{6tdbggn3F$Z$bS(@={ zi6|%>N*qLM0J3NtSp{m@o+up*Q$t2KTT3=ACr{tmjR^bAsf|2mDvL)&Fw;%3?jM;U z&DJ2FKP&%}aK2s^z3m7|W6<8W0IOc1{0dL0*FZuYS#>k)Mx=-@#RXv@n zUx@hG-v=OIk#<6fEDT#HvNs`u={BXFe0daLOs-Q7U`lmw$cFg41@amv!LI%~Tw1G|KQPQqF`RTbB5k2jZDX_X?G$u48J?^8HGfcOv%DGI?+b2@Qz%lK$HhfbGZz zG_%+k43tDG|8-v*&U?VEr6zKutE#(nbj8k4yquSADgiEA7faH|SQ*YFPO|JJO5 z-VQln!zgnC5zKvA-6q=z6!I!B)7@PG8-36ARGl?f`Pm`jIKc0gErJ`ktDd!(pg`mk zOY%~_%eQYh;stz_A4D>O+BVv+4A1!-FH$=db-^W0m}&-hEnjSsmIH9ysb((3jM9Krk^8RU zMd`}n#pmelYeY#sk>EfOL28v@H7ce_to2ovZMyJaeT@gZIz@W19df{5D(V7Ri}j3J zHA)y9gIcxRO>=a2C7s0bSB;6?vV<^)C-WjYZoI-w!{Hyo(3DpdMt!rckV*#d^lRDf zw$$C#kN+B;muje&Xl@;F-n(#LTZ+X)eW+Hmp_N_C0I~+JoIfpW8KP|bkRMc=i1LQN zc?+5oE*Cug+Qg0h74^Sk=?4P8ow zEY=R$nqm>T#rgPVW9}UwegytQSO(fMRML-Vx$`kDdKlfW@e_~awx>_9BLuQrB9H=E zzI5_GeA{g3Z+_#d(McV7=Nea&%6p`8xaXp0F3moAJ68UA(R+{W3WlUbhexR+oq#4; zR>xL-pI6up2t`hXo#Gd9{~i@U=eij_^?_Ouj%K_Ama{a^yjN%wiUtKx@`%9CzpswV zY0uTH7&w2)eh*0U@G|QX@MM`&C3yD%N|M9sXE&2=d~Dh;E>5uD zJLFC_-gFx)Hicd|^()zbMpuLk^GZKzTbj)xll(>sh$X?}XHNzPCAie*48lW&TeuJr zJZ+=DT|b;9k)VR2bfg}cNasWiBJCgbzT_stpoCD5t1LjPfYRAW=I{5qZ)+dbV7Dkx zqWmE4ekYOq9OhZ2czU?sp)yi9%`BL7{ie=;NeD8S1B3fdrmk9Dq>&p)Cnp}S&_OYl z602W8gmZeJ@$J3JU)jbt1CO4MLumzK?>9-hP)7L!Mqp*WTTFxn2HkgB-0KaWUEAC; zYxwE&tD=z#n*&Pc1@(lc*^UrI;(4y4`lfGVd|W`(r2pvwuhknYz_oBc73d04L73I! z{TSMf?X8Ga2;k*?QCK0BJ@9mt-GP{QU<&C;IY`JV5+iEe2MLVMxAU#g%ZK^Ga3ZnQP#rcRSgjUwHe=;@@1 zUin=u&&-ManjTbcF^OG`>xo0FJWM-_Onb9peVx+E#)!kb|q71+sv-XP>E`=v)}8-!+76Z@|WT zz+88POj+R&t_Saqi_0!8ZsV(K#&wl2h5ipVutBJWqPkg?DlEvEq#z|4?Eq%E3(JrvuYj9Bt)5O|<|I7DG{sM+p-KQ~~-A$1JRPi?!}~ zQPZ{{*|_f^%YQ@23|5v8nJkPs0(LyN)@Pc7l?cXvUf6zj?5KkOqhA4H;G5t&!mhQ@ zsm7u^tc#h4_p?bNbx@EE`c(lmr%%%gTZMV)8pw_f3pIy}-L;45iA2#GdlbCXScHH@ z02PIzLlw&ACP=M7^z|GC7uF81_C0cK9-0x%iJj!@pjveQ*Z2WHX*u=uU^R|rE{2P* zL~$!@0+cXX%qfO2oYExI`uTTFu!wozwDA8QjI@6Q>8`C6zg24GV&jIP3@!C0Mc6@| zin%!(P=jPkSAMI$lo9(ukkoUIf2vjfft-aDlAa`QRahZe4PX^cbTk>@MnreAEJ3K5IfIiq|yC)n7Q;4N8IB2xuh1~7q=l6b%SX5DiRPxXH z0BB_M#H}6bY;+BM$md9>rO4IqaRFsp|Eg-hg%l-~5t3eH%dEqA{zniNr(3FC_nC&& zWJ8nTfO!0qPg|4HLaR8SGd3!CsiZdg=9mqDdqDyBG?%fsNl5+;-*XR--#O3q^<93R zVCl$_aTGv0$h$COteAFnDiJ%WgI{4pb19M;Ect&A)q@(~FJ>}Ck*AFt;m`Y{&DD|F z(2Zz}dK$v!qwJi=TF3YA8(FkMV+Vj|2f^u*K=>%z)A08%lbgPIJB2D&c?o_nJMw{(?n{s3w53Yu^w( z(ESd$jRU!@T=`w{hicS(6$I6_pL+atEm+^(aQnSSAYiq^`W&oE0*W%hor=m^X zgKfUrSnUMi27rea4a{%Ac))s&a0_*3M9{W>uFq%g+B7XMc)JVEoRh=K0B|UA8}vgl z&OM_xOQq-K-!IpdGKYa^H+TDR7$^Aof()BvQXM^FGYQQy{7MzpK~<1$$H? zramz*7oDIS{kD$)`VPhnF3l_nJRRYvR&qGjt{becIqZpBQ?GPb{AJA75tt7v|-nY}{&(+62+{}X3i zLkr&)1b`%oX%qrJGV<`n$N71s)+nONWK>=pV-S>-gy53`g3*pIf@Wmh(G=O-aE_bc zXo8pP&t{kawb*R%;b*za#*YENzJWW|KI(#QgFdVrEu_2KZfSpW3TGN2PxpAX9XzUU zJ4`T?{-2$r%s~&}*91y*5o%&`{2QqyzfLOoZcP$nV2iOgmLCZ6{?MJ}(w&zJnwPQk zjj*i(&VnEis#F(2{p8@vXmr3bTy4B~p!Y0BGnlMz9<=qWv+SuPHZ*k73mQQ2SLwr0 zXto&H{siMw_N&H^GQS_`;Qi}2m$7I**z%rY^C?$XaXBWWLsIM&mkI_gbc&CEvm|c- zy!Cgj{?v_xwNC2kd~+?&ml!1gu!)6$@IzHm%WND7K?p_=*PU?LSmiQ&nX&(;lofK5 z7Q;KLyPGHJ zRsL)1N2KFOj1>bO3yGDpjxy2saCNVlq#}MEI010%YWAgu?FqWK`=I; z1bhjBpnS}C`MXsntq$ZFIm=-o=mPZJA?NJLbnD#B-rK^iL~Be_5I0pLKL<)m}( zK`7YuZk1k~<-E>l?3!b8*rC`?#*9Ld1YE zxO@WCT@(wA^$L!hZa!VkW6-(K8Lbt~Yxv+PpdP$3r`sVz=%WiT4_d&b$%4lhC!#pu zK#5ZeE6ebs5}yQ;{*&Uj`Qz}A=2Z4ySYJl|yYTgKy#1!X6Gj)>_u?gp9m)T@ryN3< zGN-7dVz$c@nd&Qq-h-q@0SCWzn0o2>kLZa!B|Fb=iiz1W@+(P(I}xskBV_p0V}9-!yG2FJcZ56AY~68%|Jfq&8&~h!d^;W;EO1WIQ2EyS z->-zLqmodMIlBm16)L7dOfuPMgo9@k9Ga_O&`_5dGJT$SV_CenN4qM*SHMRNc-l?i z6P2K^=CCM9c=8X+6Jn~a7SJbgBxqlXjQia8w;4RJl=sC~@|I(@Ng?#~jbWP6|FIZa z5INSaL|a_s0Mh6kURfDs65cy9YRsu$-}vxTwr+lUvj#b;G6kS09E);*>q)`{b&pgb zY@CP^$QF~>y8IjLUwHo0IT|Z*9d|bDVxE!|p$|73mZp4l-J{dECfgO?&{vjKki>IgPiosS%-q|^RI?!ZC4y?lx67VHV2GiW|uqZSo z$k2GGJ@k?a_)U5Oj>a^&Hb*FRNiBW4|26pDJ#51~G?sy2x>TuyEx-N0qk?sSc70vJ zeTqX=wc-1=2*6%B5F@>hg4iK?AZamP3m@mX)7}x%&fM#$`5t;%fyc2{7${=F?4M)W zC~$$44*X91F8B;pOCq-t&Rn;Dp(cm0&xgXdrb*T9ml7KP-X;CF!U&0R0z%gdgm4R( zNt&#Y?{gS{obq3BaR-96-)l_>a;G&qSH#VAeWkdk8sauE8zQz(MzxS4Lif=iIckI#dO31X~A z{?H&wxFP+4Xy0451NGddBiy<`0szJifdBvT*icl_SP36#`=k&)P7kA#9Hg(0UJ7Mn zZ6^Mf2sROTX>)h`zs~?u?!I8_=SN;%3RL?s>TPpTQ91}=7T2($i2d-`!P%?gk2!lX zfDB>xIuN#Ky~b+FNG#rnILB2RvS6THF&P8p1ggEHt^;i$1xl_A-puj@C2 zjrCTh_tgKx7E#Y2`j8+}n_r$$DNivuO}2A4hvZ*CfmX(a5a0IJ$Fpt)63o{bbs(k~ zBW;vZ$KkFOB+(!!VhU1W|3wB(aFk_T{I>q`Er*hYJhNv9UHDFdMp+i&lGuV zN8J@U;8Y0uNG-{hra&BbX$ra_$;*-3;5L0^LVULR3pgv*H-UquWi>4b4+{Z~S2*HZ zhWsuZ_MIGFhu?UaYUv6l!{1U~Xa7v#{Tq6cGmY(x6xkQ12+(2t*W{}&+CblgnVjA2 zI&Z+(a)S~gE7bFApibo=&4*bieOOAty1<(NIor)6%RBW{EZ6t-A#h*W2eJwiQAx0D zT43_lsjO2B+KvE<3f!zZ{YHIysckW!eKRYcaLrC>UX<9=L2jhgB}6g*Ke`=w>os_` z4F2AUeH4BSy4Ev<4bwweLJitv(b`~9CIZW()jXaRW|)O10D(i40N_p&e++(A2ij0% zpM>T@y}=_M?MIfS7IXR_XPPl(>Cd@je>T8=f8Sx5rPs|c|CKuc7lSez^-LVNMhM|% zGA0=kgGNdw*q|E+<^WJto?Ctgd=a$V10ef?D=*`0}~2XJ+qL8AQb-)DD0 zw}DN~ce4P#2R}=_mp`uY>@hGgM&UX%(beSGbmad(%YZ9_B}=oV29WGczgXP8kD`WK zvtu-=U^Jldg>lwmXzp|8=_Ar5FoNB%x zT<{US$^p!S6dU=qV<2mLON$ZAkL-+q|i4B370@+DMA6^R59 z>}c%YTcqzzby;A)_Bpnc`Bqk1ZSF=u(F+eytMX@TY>XoFPq{e*Fuauk0rF$^Y7x^y z3e$T2aqs(;gwbJcJWSgJ)cF6>-T?J6X0*uO%O+!E}ZV7siho0F@UNEu~}Js|h!yI=2y#!WXTpV?0?0|CZ(WlBZ!IPH zDbd*y!v-In40Da{2c@AKA1YcrJ`hu`>;m6rP<`0tNp-0M7IZL%~}mJ|nO z(Lf7d;IN z%KAz3h6&r=wsUAzPYbBuyB9H+8~^1C$!dMSYSWR+2p>1`uV1Aeona9GZZMTsQ7Mvq zb}A4}qJ=Lt_LZY2oqHEl_) z03qO9Jnt6vT>Y%n*)^|p1=ijqM6TSN4JrjQj78qhNF5|F_rqVUd%za?1CL7%tJ+P@ z^r0L2{Wn8$nlYeQRJ=ixQczN2w9C&csP@qDr%jW&YvmBtwo={b;a}BAeMVLeIuSL4hJZPcm+_ zcz9`RTJgq>8Q$o!i{|W)7Wxc~LRkLS|Pf|Ux?#?QDb{}oC*NZ#K`GQa9c1ap1d#Hi}+#sp( zks`$UT9oGOFbx!u#-hd(g1^t3`MxLsT8Yx`o-{$Kf9V1Wxww!*5FXy%3s?I6DS5M( zf$=1LW^N%&qA-VrJ4Y@B_&~b&<#UZLua9Lw1J1aP4jU%vAR_-GCL9K@*L@urKqDW- zU^wpTkU8Nj#CNkg@a#^bCyJGXSqc;=yz`Qbd1n27$mh@ZKJ|6d1VhJ8%PK3sva9Rn zO2s^CI$DX*o~^O%HI{s~k#+mEI~bjuna#vvJ|{hu z9KJp5X8FftKMMm`whU>F$L+37H}D37WBU^~gP+3+o!X0x3a~F=I@i^$JgBKEkaie2 z-gBmeF@o3r?(DpL^({lv`%mxg*#QI3@#|La@dwpJd&_l9cXYe-dikPDAE-H89U(^Q zsH|$bMpo~RD|72v{O-EMQ>(G=G;*Fl=Okm2EK_szYmxH}lneB)nt=rDeRqyyr;A#x zHGTI9Ia;G+cCF!iZ~rLnT0=By?Pjhf!}k`JoN~9ue>h0M^aDwr+xK`t-LVn!esU#z zcwzrp(fr^;0sFwLYQu{f(~(cwLNAWiqtDOzMLfHZ-aGRu3CfSzG3jiJhv3L~+@IoL zQ1K9G{C9eW6gR^iNZNNlWnhQD13MfR22u&dTG?@PAYMQ!n_Qa|%PT%nt0gQDw#hTr zz1-TgeE*`AlnDKLjWtQu=Qs4O569}C&nTZekC)QDZI-o66$?tLp@iftokKbPHEvfF zvdcSL84%gFy#DRtdT?Y@>AFB2smaURospznhQ_4r`IrlDaHQZ7oF~z3vwqIx{ZC@& za~o+g7MbXd5F6Q7V&An@lKI+&B_s%4W>*Wm*2vb!-}9gT-HCIZlVUG6q=7ChgwK+0 zwQ)kn9@*cg=z8@7Q9g;+t6Tp@B9~Df%1{QXkS_*O9jx4=uZ}r@lPq_kQND~uod`;h z+#2`&J)x7A!5$FQs{%!(cr;kV4M>XQa*5@j2MO-lA>9W^v3#e(8FvRW$r7K0Wuc?z zADo;5EiO7ZLT|QfnEHnG? zcNXel%S+0Jkz~iIbxC^h48CNAP>*sYq*yGF-~XL$0*n^Slho4xlwmh{Ot%!V3UnuU?enP9f1kJdMbcie)O(%nreJ@Lz)y^S6& zS!OFk4mNspCd#i9weX3n;N10|usxPKIPXqyQ*wGa4Sn+lHScqKH9Zk! zQI7Q)9#YQ-4!F?*(752&a$f&I!&*6z>{}+`D=#zq=At}g*zskA4bOcgZWL&n=@59v zrIHbq?{c+o zNCcaECBkOhH0s1{oCeQY#j3NBi-;=m8E@1^3>xTkv`9jB526h)zSX=RdVna`Fv%h(rlR}sDAms%=f4TdS zIh)VcF;QM%Jw;xnc@^!Ei0Oxg20spNZYn$i^Z2~;b&EhV5&p&?#+vm@f1riSY{O1F z>(#M<&u`KBqXN$l)u8{h0Q+u*h4oiu%}G?;u^s8RIz{q>-CAC`n>v+QSf|H93p7v~ zQQEUei$@@)yJU@>mg?MPN1nR`@G*Z79EQQz@`60){=c~$PCdEf{$GljLEt_NNPqJt z2+wUMBx#3Bh{Kd@^@pN`1gYnkNWPLZB^#!MO7G^Ep`5ebef}M*l^z$#z|-v33sKW< zSyPCz%K7y6ug1NIa*qMQ$qgX?5vyqh2t9pm+X;Q2d{rx{sED5yFRp*x;I_cPu1eCu z+^~RdP5b-i*!lb8G?UxX9z-_VYXD&aj@FSH8j=r8jG5*H zT05VgKZSm<1k-_l$^be60Dv|}Q2EB;?D1Zh6P&c1Aybai7)-ccl7!c*g`z3{%CJ=B zF6_J?XRKK|aFO(0Pq$bse9KkOuUghu4m2oP0d&LdTUl>6gP+`{0oPq7kDT{}knb&P zx{bda3bNI%efj>Lj*g;_57(z>n_-FU`-f4u*Gi{KKgd>%{&01yF1=>gGsO4Uf_5$B z;>9!J%gkSA^p^pm6W8d@9v5W`xk0`>^-)Z)9xh2pn#sl%EEu*<*taV6)Eg{PvP@I8 zH09$pV82jLx>~J(%kg3x{nmKV@L0^x=Qg|qLd>n3J02rg@u&%I={$o8B~0l4?z5no zQ3XvaFOKidzI)q!F7`9xeAVTr6MWc_uj9`Jd8+LtY;$Z}i0da9C)Kv)~DfgWl9Zx#0O2frJMmfuy#i8Dfvu9c6pnpThad-G>8bW>N_x z<9NVpi~Loz-~Oa0?|Z^H@QKlfmqP()fE`( zSW;QmlgQ3}DewOTY%yN)F4$VnSqD5^8)2cZyUIO$TOcnMrKO~DJ{)-?_R0z+8o@Z&04x-FP0^;sfm#)$%>dL7EY7yt1Fq!E~uP2>?XbREG%&V^M%_1*i9pWc8+r6&yZ z_#J0ttpBnIrQ9GqqSTK~f{cSzK&zjE2^OfX+!wm>Yo9zpR?xmlqqSNFB&@Q|nn)oz z3bXnxqm6gl(}9Su4J+7;jMDP0^6$#Oc--CfT$;~@4ob`#K7FH3kGz0?Z)J{Dii}?w z-IE7;d{O0diM?RrN3~B_Q3=VlX$bLD|k0py#EAN z9ii0!mJtK=YFCXCJuA5f;Q(p$>9Q>bSAo*Y;jojQ;TkS>b5tSk+3+CgejF_l?4Znh9VZqy^Am1RozpIi6=2ZJ|?281sf?)Uy(2o4jn)S| z06Yu7A5?}@w&d&qfz4kl9>OdFJa`}wzV_LHq$cPrJ3`g`_Fa`yFwf-y9ySq7ha~~zCIWs&WwnHw+q2#z(L&zhC`m{@HUOpU$U?qA@-Y$-2@-m;pjT2? zMwL)^b_kvu!R*JNjX!t8B6oVu+l&^^PX?lo)#x#*%!R6?$_u^Hg+RjvRh4|Aw&&Y& zQTW70Hv7qU%c^@>RQ1xVEG>nP&y1B9 z|9t7iWCexZ*l?NV-l`T-P>>nGn+BiGUC9>0Tl~q{q-QH;RayPwd^abwcgJw^>j%EY z&GQ|T4>7pr6Mhk|2}0NB}0@8VR4eZp!aN1`-~IvM3`fgRIiAHqH0)L!h2S+IzR3 zt_mvEU4?8a#xoH;tfgCgHOko2r#JQdDZs{YQc@+kUk2RxIb?QS2)Xhn<6y!>BgxCC z%z&&j_gCavE;H1rAJ=&VE&27OVc{a)ag=ruDDtS6Ko#*DRsBq;-_Eo~wYip<)G*1& zM5Co(2f(VbVN=OG4rsc%7BEU`V7&3LIwD;c?b9j-^jL)+Olv<@QpD7(vbs(SCkZ{4 zfUI<7%8t`vx=u0H_EE$5dY5e4s7C(ko@G-WFU=IR^Vb`mQx8Bd$wGp|Xrs9o&QXx$ zlLi-m=;iT>@YcK+qNc{9uYdXG&Rtw~cD9JkF{t_PZr`T@QfwHO+J*6Gu$CDP~PZ?3t8Ogx1^DcX1wwT!_`a2E~%2GM$6V!x>Hz!+PV6JMrL-}JM4U?2q=phlu zEK~fuElucAH!T&HO?!u7g#4=@H<*L`>B$LCPMP#Gr|`;0Gq|}qQZn<~6J$-}behqF zv&e}^ye9V8B@zF7&_)8}4jxy&0&rZNL>!!JZ^5cT4zZGJpEdjcczK3w&EnN6G3Gn} zl9}tFy@fePAn*S;jWe67+XVd_wtNXhIqY0_$Ean_ul+|n{);`@XTAaut$OCelyP`{+Q13hsVEulq1R|Py(hw zYjh%y3HC>%0grUZVtu5W28=izdu%ezD~ssk1R3G3oIvxN46NV@rE1n6p@pH}c9qDO zVbh;Dafbj!5PKz?2jw}~IXyI+YPDs(JR7$&kN*^%JoX`A$fjZ-OM$zL{csilm5B;C-=Ol91m4&$QUshr8AV(Toutf~Jn(nmw<846|ZKo1~{I+0~KRXMgvi={` zKGqgBx)vQNmIlR;vxb_~vDoywA~_8&j%op34hONahVNf!;mCjm{eb6f@d~~g4uYe( z6vRQSe4w9?`C3&6pzFtOH3itvJTyreaWc=_$8J+TDHQ73+MRVzC2HKiIsqV!I+83; zuS=dKflIH>>9P0k8_{VN0R*kB^9ik(s%kn6VB9qb7sa1;cpPo1#0-{CzAUjXdjI}* zNQhH`?OE#jg|Aw&zy!y@z`; zk(M9}2J&7kemC`AE7E^(oV&5pCPAYTbNcfaOKYDf)b)E*4|iTr!r)Sq$H~6< zfR+>bVRlY7s^c(UA)!#^Afm*elqm*H5Y;qj{-qDyh``_5R$lz}7%4kvuX&)j!3KEq z7dGvwBA7D@D=_viK9wFX@S27UbY@wGZ*Pns>3(9Y(NziWjMommwHCi*9GH9xkZnD4 zE&FzowgKAjlLkALj8r(nTF>`gZV3NQ`^$LJuSk_&F+RC)%+%z=it_f>dcAi08#F$i zOhawa*pePo`DivjI#`AM<8Z5K7RsAM>-HL$f)KMQQPILMT%`zH;W7~(XG#Ewpz%@j zWLl^qV6zPzt(;wqteE?LGqWj$fS*g4RSj+a!h)FhWc`mq^mp6_GX*8Rj%2>r!#_V_ zJfL=AWfc~4qKjf}y@GLS+!&l}3Gi5g=?(VR2*-9_UZ_#f=IJ$lCh?JACVcw|eOGO& zRLMPsk2;0DL*`Ne`JB-#$g+R)r@BtWlt0Mkm(yZjP4j&B)Qcv}T4Cq4ZCjygTlrXpmWGDVx>!W(aC>`LrZ{Az z)RzCx`ZP-lUutOa6AGo)p|XP z7Zi8j*d{9|)a}l$!g&nKeA(=m%?>n?d>afAalUwJ3Au_I8m2*RYnwZi`C2%A&KT?C zU9iJs{l{0->dc{jJlE5l*Hy8U%fo(%r*}XSuGHQ%t-9q<;5Kw?qdqXm*3W{V$8q2O zeYZsxu*mZbTKR?<635nese_Do+lp*i;{AVH0`RCB({M|j+%;B9d|z_klia#h1Gu@& z;P7cqj^wd&GrZBu<7j+b2U-Bvl2%Y@(}y+oI6tO;;}LNm47=Q+;pSF5J~^>jOp@L6 z-H9)G)MWbl=jid^N0l}vJdB{YU!$$|;1P(-!R>2od&{?vUoz-i;M;A{eJ_4X ze^vBT(7*~*W z7E45o&V(^CI@&?b+wE7^-|v)hp&Xnj-JT;2GnnENa6zp1Q^e}>Z zTpmn$RWiF1ox)h-yJxDL8xxXjelSd#SWJS$y%68)9lNRpIl%Kz(%GX$L6NNyw#nf1 z)Z7H=lW&9+NQ#k#wwo{hZlD2o%oC>&eZxcIW;GK9b|I07>S9bR>XAQN&?RZURE_~7 zHj)JnELCqwt?nl-9INXmGGXcB#}JQ0yiP5|3fN$k1SP0e3##{j0RbW$G8WLo7AG** zqFFj9S)eV6o1J=Zr@X2d$u8`;6bd{`2?)rva?kNKQdSwzsjo8|9u^2$c1BUS zE$t>I0g0KxS?z#vb~qNc{`+UNu>~_`2!QMFoE{h1iU2!=fGkhJqkef|MiWu``U-Cs z{l|2Hn{n71C1?k^0&X$V4aSwP4@3$?QF~kfc+CEt`FXfPW99Mv_x;HsTi?L7DpdJe zyfHe1N%Wy8dwZH8RSVqrj{`N{(^BS*?%@d+rjmawELa>6`n2*_e|VpR>qTbOw4a~s zKa2G{dc-8-%``Th8TkXI_k2+!rJp|oZ5`NzTWF(XVrCX-01ewQL5wRE!*&3PGfkt% zsALf1z$mc)=qxndQ^M+oOm>`2$WO%{0>*HZjk=ztV~;PJ-hIfB>fY>bkbXV>( zejmfDY7iKHW7oy*v>rB_1&Xe2P7?>CT&_saOY|7Y8{5d#XqZX8GjHJpbXEI49pvRb z#G0_;xhQp%jIQIa@Qk>faTu6wl|%P8q$1Iw2B^FSOd>_$klfP{^i7aP02f*VfMqxB zQg6L-5*n`}JlQzFR#t*o+iFRSL%+Pr&BgS2(bhPw=xANKkQEeEvPow(U6`_;bDWC1 zF@(UW=2iEWgC)wSNn$d|-gp8apG0{^2L(PJ2F8a28%@BK?|SWLq~)A*FmR3t=wYIM z5J6P`A_;0`E3BV7rLb-Pb1NE;wMkTGQE=r~QAxQ;t({=du?K^V?TUgL#?K@Yb+TXd z_3bmNfZfX&9@DW&shHi0zntzXs$z1NtJ2p2+7JH8j8`czNonc!$zEdN7BP~!PjxCM zo<;9IQ0kVOLFnm41}$LDv-swXC1w)SHCNXz_&LC2NB}N)oSC(L2nYQQLm%J3*#gnG z1G|_DY`Rp?t`ISFd0TIac#{tv*x&|qPub!G=z4absrhTBvlN4z$VfvN)Sxs>huLf? z#W*4~9`B%<8DrL9vwJAvN&DmV|(Ir&Td^E!Ned=WWcbX z7l9<_+Es@b5W9c%jJivVIfkNdkFvhh8lVNt;g9v2ZB-;L@B4qW#LM>f1Wh)1@FF=* zB}u3Hs~`8`Ds=1}{&WkK-FsEPwuCA%0kG73R(5tscg&>COe{VyR733B=%_*gl6;fO zVY-%$Kz5EWN4idt!fC#<(;f;0wAD_}B;RVAp|_=vO|_x#@T%ky8~o|!b;G1t4!mPcU# z$KuoUR&z}+mgVpU!<~v^7`u$K8j_Qf+W&~9V_1F|H}lNQrJ=grxFA-ZvdOH@`3+O> z&euZblKZfip)%>XPFU3F6Sj^9JWV5rd4ZxtmdgF}-+K}GsJXB-=C1%!z2VJZ;-h)? z58-!uCHzf}QW2`o`^YP}XZ`}$vanWp#4J%j=pEZXOT0gAjm10zS+cV0Tjc>IZOU>R zyZ!)PI6ofs-kS4=HP|li`$|~a^FpkxAMI@nbS~{!f_0MH2Y^Kt6%|F$`@tB zn|tgx_Z6SR^d>if;Cc7^d)-3SIKJJzz2y~L^IaAlBo~d%6YPH#o8aD6dAE}@w}IBneYi}I#pg4Z*TAAvDJ5p zbusB?!7gfW&_iWu5Urx}*6HufBv5f*xzgZ#Z27 zmMVYYgM{l0hEsFG<|H~U-_#-F{O02WW(BpN>n?RWEfO>U?9aZiTY>4(I2#$!$Q|!8 zY5@_TL~G5hVAJ?dpa%z8EOWC3##QnE4^L+u6=nCm{h47X>6R`jkuK?>K}l(lkd~GZ zkQy2uQbjsdI;FcyS_J8qknWE6u)gc}{_k=PGxvSY-q-$I*S49c;1MdVm7(IVwiqW# z${m8n(4af^+Vr~#o&~`7NFYqXX*(qEoQe6sqBTT1_^AJrsF1-+OOCIS7Rm74LD_a0 zdQgTvoh@KtgVh!rd%q<%gZe(U;hIMB9jWUEXXi|{;k!F&t$>XcN-Tve<$s?Z^O!-5 z{od*=Gp{sa$ssFDl^{*;cdfG5ms7D+vs~7WHs{#1{)Mab1{l3g!;&ChEO3I=n$rn7 z1nD&rJondFY@z6CydGyTgO1YuuokL*`EW}1#BfXs2VBIpaUwk@pAcA}&B5b-&+whQ z4!A?ATk!H-UN{@|npqvE3p#s#tE6D@cKBXLSjb7vuTHs37L{RYurY z&dav$WI4oygQCFW_)jnbFR0lS)zYX&DN255lHLLuW`L400lK`QpKZoRusZqWLw7+) z?1js0iV8byZ%>E+HI&W@fY0r7wg+aC=*_ynU{T1@cJ2GYNM~dO-OII^bk27_thDAb z9h%`t60^iDeO+Jr&%9Mw0o`t*@V}>bBpSKON}gU`tScB1^gz+7b6)0EO&1BnA}gh1 z63}*k^Y2eJPKM`KmWKClOGIX)EJnvHw|T6GUx6GeeQn3z#_wHS<!3$}dBW8~Sc!P1Z3r#2HL zHM1$;6brB74|np1*6jWjLH@CDn6KYYjEk#ez(W499I50BkR~z(OPesfV9ch}FeUnc z-O3zKY6Rb*Bs7lHoM2R>Z*%x=kRS;T3Paf2I4(PXgs*-p;$cSps{ z+vysD@t~0#FVQr5`xv2s8cBAnNnu0Gwt{O-Wq-`!BkqB@as48cWhfvV`xMl zbkxt7eJ+xG*!~ zF`qk|a=FzexX(;) zLw8fem=$5P)L7V$iX+yCD6`%KHRKzd@~k~}9{$*O4Xn_!#TF=^SS#GOjd!NKF<4a7 zr0nej8Hi_GeJ~BAmPzV2$LsW&vXPhLzFjhh=_&Wc?8%7)V%(tAx1)5d0o$VZv;NmB^ z;$uZc@t@^(}E% z*-oqfv>n>da$Er2^3wU@hWYK4LwHnE_%l(g`ODLQ(!A9+4g>x+L#G(2YTLVm6V?u+ z3M|;G-t+LzUZi^}u$hkjNCXIo32bRT@uO%N%QMK9$i+_D*+Zju`?vyKgeh*c{0$c7 zWfQlxN8q#%3yONU=$E7YMSR)3CnviJRCoNNoWvFRnJv_o`$uvQg#bDpb+4|8T6?w( zi}UsSV&=;GO;(HAQioqfy6ExG^p)R+ACwojqDy_XM~HBG9cg`cnRA^iMR|cEV2DR3 z1ZFN^1(~(Y^jCV;}h!qNV86qRA?#@zlsG^J6d3qyjN zvUob53Uxi(3-;gRq?eGtjBP1+Y@%5n;OXBI@7T$-!hBL?KdohD9YgrP% zN9a4T%m1+e*m{*8o9&)sqGx2peG5g@*gSeJ`gWeNW)ajY<5SJokOWSn*!tr{Mz#nF z_|$oyou3h7c9}(l*<-OfJQ0saaziQ5%k&kK$6#1g&Y~h89VQ?j^98nFJI|c+?P87#D|)KKfl+^OXA|+-B=WM4qDcQ zgGgMQY`2N~e#J2L&4wtZHDpU{ZYSfDW{)=zB}}i!#XT>-f6T0wTrv*s&*xR=)%=?_ZqpSx z+*u|%mqW6hU0r{rVA+>_!3fv1-W!L^RiG#; zR*gLsE5X4WZN#{ZVI0a8A`}i|(pM~hVo)+nLgG%6+Uda_&6$6RPJKJElK;A1Or**w zKxpxC3IETmLDrYCB`vL3clJ|^pK9tESpuhF zY>}W1hV&5iOtnMkek(1yE*Y76E+ZJ&_YDuDMIgDFxN%d3_NAL}Dk3&nJ9*ss8zuzgSnpjqmJM`b7`wnkVR_>FTVLYSW40w_pHxSTCrmQ38DSTD zWJ^cd2y=xwccQRB;iIh23LbaH{XdPbFEO0kM~{q@+pgexh;j*Y;{Z(Ja76#q@>)gd zykl%+;sS}4t1#yC4GiQbTl=}>FWV5(@X~ZAm-lFe=xsN{MaVKd>ZI~Ysivl8jJblh ziP6-e=j;Oa`J1f?=$1cmXvWb&(wr;;VOjK_g^<%i&z?9sH)ylpt#s)ZnHL$)(~39N z_8K}xv$;L|zINrPtcH8XBmNx~B$N&=*mbJuww~7|)?e01yCe0>fmDnWp_@kzYqgz-M&b$`nB!jZ; zk2B)0EG`DJ-7_-E^|TNBS@Pikmc^S}xh2QK9u4)os<;=2SKl+T4(R)tP~q{~d<9Z_`5wbT((H z*Xn0@=g8SMp^^e$os3x3_$sSW*I-aqO6@C!=$*emUQ~J!-C0~*4AU#hFnp2lEY}Uy z?`~R()u`b~T6#$$eKAeh^e1$}@W`;YWBf~PZ|DqWGkwuwT=w>4PdLp&+bqgJUyswo zGUfh-$n+Ot4Qh5A^^)%W+)IfV7B2J@#*tRW!F4*wI7TokLfk$A;@_vELhtQ{mQTrz zCqtN(c$uGXmn7`Uqf)2krDK=CNb=h7_XTveV1{%5Zikkikn9@ zPO*qwl5PT9D+G0P818PEEg%KlN7ykf^Hei?;}_Q-Y7hNtFWiW^>=Fv|8CnxIu!T-^ z_LI}1uO!Lh{Q)}A*aXs16;Ba%TIawY=)mo4sus_tNf;9oQ#h+;9~X@=%CnSHM3+yX z_}7b)qkljzsjV571(f^dI;`>#o?|!VHW$z#R#Cmoh``i~N8Vgn*8ZI*E9`eAGfA|X zeuSuR#QIy>ETygK5`$vs=9@A20d5gQm-Q08FSH$~V(V`dVdE#}1AoLX&Sn=0+%G9u zzo`ra1;;%i>0bhe@WJ4ypWr(tMn)o;(3V1eH6i!h1?U9j5^s*Ka!XR{U$1kCH zIy`fxpL4(GvaKuvcA%7hq+AEx!NWtS%4w2H)Bm1JS@7xN!S;9k3qVSaj$rdqr;i_i zqggKJKTE*1jbwRMqOta>Nbyq*NvC8ayw4-(JF0HGlL<+Sa;ilM@b-T^|BECztqYb# z{k8oiZ-5vWEON(YUGOrS+QD2F#KNkSKKEO7cQ-xD*?B~_REp!XGx?{z{NO`{FDw2Z ztO_6DwqHlouQ=>E)vQrrPgI}1u0m_Q;Ux--O@mqj%cN`k^IQa@#Mv(D6+xGi z*{Q0x=qsxwzn_OxG*Jj(cjarK{K|37SGie{dn9itQ69Gj|P?53PcdNLA_jXJ= zr8B``M5jW#JwRV<0ZC|0gLZ?PO_g3r;ubt;*8D z@@JrNaj=?m3JZ5XwTQ=Vs~O^Pe`*aOCFZ^@J~&_v1S(sWQzmED@Uj@TB67I=`*&&O zRGc3^0&xYq6p8W?OY?g{=L2_*u1_QQAkh^hQ)2tlX4)TB>iSRFUm zbSeF!i&Yx*2vSIO9qMNJdmhQYg?YN`GmAsDNS{ z%od#gHczYC3P0m%Nmuy&!AY~%YOo)3Q! z>OuG-G=rU{z-^dRsa}BE7meU2zxI!3dQ|~o0&gO-%ujjBkOv4Wg8#Ze307OEeeCw$ z)s9|y#S5bfJE{lDJ?eg=J${SX;BJNd9q}3RU`SwR%E+OCs*! z=62DD#clcGBdbk`l-br7_DP-(gN@-+9$ild;+DvW^@vRTE(K|dUbh$C>2*VcR9;M1 zk1KCf3-zpSe$)()ep&t~02B$_hZ`fsoCY5ywPuebO;kE!B~>SV$d;~AgHi(3gVF^Z zQrOHyzYs3Hc?P6!v~cZh1mqL+Pg;Wn{@Pvx<$D z+mW}E;x%cQo2lT(yNcoR&U**zwf*D9xw`Udrad?o&W(U^p1=F|hPI1>C5!Kvnu@OA zQehw$(Pl2<8Z!@c@%}r*W)Z66dxL;4MS|?fVg~!`mvsIzh5|jvyZK*vYAnx%e|eDp zA%C)WBjHY?Q#uu1H0fyIL!h9b;I=bL_<#pZ6pHus5^<=4^^MFdc`M`p6qS<>umtVr z-h3$*?$_EL%fSi7+0EO*vBTNIZZTc99ZaqyHmu#P{=@q|JyC@1_m3@r8qgIx>AG!> z23A6LDF{TL`H8$DxbJG}ey^97_zWZ9wL64_V|ma2_x%vQwCY*Z^9vuT^)+vRYm`fX zs<&h$N!JvH%1qbULA9cmapL0qo(j*j9QddB$gz;9%=W94)YSBul(^H+;jBH=vVyrz zwQKp5|E4R+h=15lAK|<>%gj*7`EPBs#n-jzbp5fXw|77cs^N#xABu#s5|=0FX_B;- z;HFsX|01uaN7i)KulN9N<-K}|{_DlDMwo*L&0Tk}Njaca){^RS&;`mLifDyKQ6QWiFS)f0EYrSWEp?>0VE zdYmIE42of4fsmy_UR+25x(%Kef?ofs;aYH@V3ZY5ttHyksYDJvNI~Bo7{C>X2?!FL?xfB> z9~|t7jw~N8q^lRa5}xl>j>UatwF$7tgEfCYRLsLFk7web$&L(AJ9~AfkX)Kz`$48= zZ`K3es+tm_lIrm^8TqGtaZK!yD6If)At;;6nneidPq(vVF^A*1o@uJgsih+UDRr@r zhp?xL%gDy8obH=r@xRX{z*`b3^F=qdlu$-u=6?on@>Udc z3@L<(JpZ#``kI1nX%`iK(J6NGwym`S4cm$c>m@RV-f@v8fZU(+mGKG@;ipHUIaYff zfM<|xlTwq68BRA0;`M%XjfIX$r=;|As=>XC;m%>Y0X?3{@}EZ6yozw3q6&>-*LP-A zu_^^*Mk`qAvD^yI-Q-HLc=PrIn(=amymiZg1e`Y!!(dCE-`@kJV!e6-|KZnBhP94C z{TPoeFD^XUMyPLhZ04SaXG(s9-<{|uKc4U>;hnxt!!Sr-F#9Bs-JkJlXFnC}{Jn-_;7X*60AVsGTK-PQc zX1yjSdECXUm)iDY)tcLB!A1Gfp_D;Fo%GW$d1q$_x7{(cW^Z@dWL_pjhpAM>_st7) zd;2sO;!iP}`#_bPEFQfGvS-)KeR37zt{rp#N{|q5m++zS{)GD6W5FfoELWgn)25Z* zkvRBGXFh$nBv7uf#&1*Xzva@7k6JBvOz73S5CKDbuF(Z*Ra%A9{Jas5?cdLvvw2vy z-`PwQ@`(NS z*MHH%%4&HmhaJ?5q=NQS0j?Y0ip|P&R!o{dkOZIZM(G;U7-wX1pgwf&51yp}v1vZ)u$reY6TG}rphkDiDApzBI16VtQ~ z{@aiv4kvskO2))%$(n?@fLC)2@9_scoyfKE}u; zJk`c_-~NM$T*n#Be}iv3exSRxBmRt%8`u?icn+WY{C!emKONmn5cclK;>pS?QSl%A zWiUd>lDQ`JysiG2^(`D1H(}qjIA`kZyv~fwc<_egeR}XISn=EuGNAJ=;w&OImPN73 zb}EYo+{WP|_gqgTpHjxPu+mW~rOj1e)73aEM#_Y#F0BvQeE+U@*H@vPRy+3nNsEvp zRTNll|DgM?dHu~chrK%l6ugXbCQ6#XUZNF6>+1~lBZ&4wrvZ5j`B_SsGLU!)I znD(4}yDalGu(hch)My_ayH^gzyRrd6;<;6@U^AObo|c|o6`tbI5(c3znlFEcZZ)Wv zAC4TC?J?+_m_S|YPXMnQ$9UoYMi)Q6`W+mdAybQr##n=8C1-jglzxUsNB0h;){?xr zUTQbbs({8<+Xx!AyospxsabCVN6D)$EfL(;B{Sx)@kUe1cf~zyDY}LX@fVdrYH@k3 zK$G7B#!V5{!M)J4s6c$pX2!GFfmvc75^zY=05l}4B;xpkaux(mCc zf)t=%zcdI??Ed7#`s>(@8sPcKfl3&1H{Xg|BgwcPQ1d#se}%8ehGv3z2_i{PwJW0K zV<|9zcSPd7jl-s3N@hlTaMzQYn`1XnBW0+FY>oN3xVy`TJhFTcvw_TqC22ytwqNlx zBUtuz^9K|FcCbzRpHz0FbbOCiH}oO@ti&owx!}9u1#H?>B<%5P8)GZ++Pv8Si^+f< z9>PuU-?SkGT(t=!I+E$TgxS_;7p`%AUe!fhI5M}viy!z)yN_#L$w*Ypu1UPBF1HN~ z=bu#21IJ~Y51|E>klUXlm8i*vZiNhcaYGbRErJQb1`l{tK^UaDZ6vu-nSdNnDeYV* zco;Ylj3;LMD?8XM)}Ztg>GR52AX54(l%$1$D=%jKzV4VQRR2BZmK z9fqlO-Ho_yu!(lT-K3F=vJb;>nMF8ZP>^JBT;~u%_;8;B=>yl>UFOn;0SK(`qs+J? z+pI1Erq$+u4%`#Mc0d}L3I~m(Up5!rOT$HZSWspr-h$V)@Y<$Ry-SY01FXy%1*V}f zS?+i%$RwJ`d$5_jmhA`gNGbNrvW|TZN_#xei}h6tPtexD3|X1)a6wp@^Qu+A#uBB& zi=~Bzzbw$3jh~SEfb<{+W5k%Hzr&~jzdsjsf$a!;%h!r`4u`JGo z53bm@6WFHjq#~sTgNDZKR}VgFUfe`xeo6WC>lcq#T_l$VRse-SVU}y2dKCFFu}@R; zqj8nj94+NQG^bmC1{Na>M+H024Ft`hDyUDM`3 zF=*EYSP-Jds?&0(+mr1txg>&^RRT4}M|xxa9E|;8MoX4Elg$?aG@DsQL<9 zVLN@tpL#lUq*iu|&O+H~dG-m@CKeQUGm+$m_S`U#zid{?+!>cF@OXX4>Kp@kgKcLj z+2;s|$X&W3onOdmdow=_S$X5GiZ#lE<1TV=sBScvT?SZh*eQu^f|uywCfp$MEB6A~|z8`AReZRS3^q~Dy$sUDL{3v0m$|7?x?Vn?r2 zGMQ+8b+Wz~fq|P#GS>bk;e1%U^5h?{cQ?FB4cU#d+Z!i7Dh#Ce&mvX3jGCI6^0o%& zje9O>AIb6WPnY&~^q6xE?v%&tWgv}8wR6ajC+i9+Rwa|=Fl+Un^J1f}0+U^0%+c{E zI`rMHNV&a0*A3H^v*Mz0-)j!!Kl=EN3CjdG_w?23H^(l%jl&B(&|ShMHRT7CLkK^h z&QE+cV)hV4?)6Ppqa*t%)O7;od+Yj!evY>^t~bTzFY>W@l^oIv{Yxf<0%qA_xK0cq zr+x)4@Qz%j2bR?`LQPDZ#O^#!udH>M_T;==?OHA*-+y_CD~ z96GAuC+{?}fWj^4BJ$rm`X9|1Df^dhdDnwxj8nuj*)qc%Hc~YPl<1w_(OlKQI zYspkshlqI$pRPt(TFSDro38P}&%*u+W{PI*f!fbqPKbqw`p`waO$@$=i-H2ESJX*7 ztgS8OV6}(#3^&5)Pphve>Gc_P`vsR@Pcq-e$FxC)79*GjQjTr4%($82p>ECa`HC*t ziE5fZV^~p1pHLcjajQlrj-u`|=$Rkg=4<=W8mdU#9qE^@Upn}zmF;(ZWaLa>&lz_> zBY5xrmbAgORFUwusaoS_`)-@E)?Vya0?_y`2-T)XdCyV`#)fMkMZ)F8Me)v+*krOKOFCk#;2j$}VjT?ed3o2eI%RPaG+gN$-2N>>kT z`oxYCPk^9K;YM>o5+29ERGRc(;>Da+*_OyTmw#O`bLuoHxIXU`kfuHjN5SD2>X2hK zR9)CAg-J<=CPIQ;n`eo2Q&mQGIAf1s;KIgEqCF-o1%@qFI5 zR^?}M1qRuzR_lf_KCi>|z^V3@9k+yt&w_xPE}_MnP+#;I20=k%BeV(uJSNcc(0w@H z3x6|mf)a5%{v<udkS#77g8k0SPkvdfJ zy|fJ-FQct4wx#`-d7g0NN#*f2i>R zL#p)iDR;PvCp0O$_M-(P~rUC_M}98^autz-_OiY z&DW+`i9tb0Y)l52il8LJb9W-9b?Rg3q@zSbv3yxHt5dU=4F}lzo9_PT3-cKhkhK78 zNSsdJzHn$3SwR}y-U4+uBRDaU#rpm&le1vWXIa1go79T|{(f28$_oU$5airI18~80FOfl8! zFEq*{B|%{mt7v0Aw6kOX;5~I+f7baaXFDz~t}7Wyftd-)-Uqe1cJTu#@DRl_ON#No zSkmF|x|6~GoQHCVN#WjsZ?)0n|3uov0#ssxMvL$} z`n!1&7y;o*0>))tusu7Z?BP<-+SXxRN5AY~?Ms<}?x#5yOz72YOTkNxn}NzKv^pfz zs?K|#{}%`El!y*WS8l8lMRED$!8p zSRGhm&ePM=xtAkrM}Nq?jOR3xzLl>GIcLGA#e4S`-gVvz`|(a$=@xDl(q@Z?w{MM4 zkpdhxS13KC6b}MU+PxXE|`vWZgR<}5xYr)^?nL({%V8z-Cse@Rh ziCz^Pv=@r9Mh&4jl(nm$)%?|Y{Vw}jDHx7zC>8(iPgJ60JRYUqoe}Uq!SM+Z!349W zG!c};?plO$v4{hIjds01!PoOxLqfeZ)ZfmsvaHqj!T7IPx~IH@n{|1hq&QksRD#i% z_yMh`2zqCB{;F_8vks?MeedHA8Wp0Kz?o^7Yk}GK&Pht=Dc*CD!Xc5G4FXW;_<*J&7`P^NY=<| z`r%Geo<^k=MCkU10{){$<}cF^VjcP_For@L8?^Pl{%Okm>Q3I~!j)t!D=SON(F4m8 z_;@_0oaGG6a8=-gI5L|O!TckUDya=%b*Kt_6pA=(RPa~vflo2N>04wNRz-9lakrj} zsOM_k?X4AQOCjON#k}DM9K?C^08@LaOI|DuVtEayQtI1l_s%39waUF=%3O8$=FnMh z=G}wW-uYznZRx!}Yf4R{Fn2jA&Hg+AAgJ1bJhw}_{^gkh-PR-J%p3GN7m_8Bw1idL z>15UcF2hG@pJ4+{jb}dSw0?cmNRELdYjYSW3y@2?KOO}uxADSVgrM2vU+!u6`@|2s zewBTfwT8yGS~K}&a0D&zR@OB_wP}JbPk$f^J|!f7w*Em5wS_yMZm9q~Deu8u?QvI4 zei_Imd)f*_M4mHn;Z9egzzVgVURe0B5Y@e00%D0?xhVZLVI zEj;99$S;J_i$8y}nP8w72D3*vtaMhl%FY)J2Et&vV0MMTiDUPP(2( z`6z*8^N5rkQufI{?Sf#oUJ$Ly_ynbH|11NTP z$>!tGZ!R#oxq03(jT55?_AIYd7!o=Jo##FlK^Md(F&F}lD`mW6*J{MjFs{3 zk#Vw19kR;7hD^W#TS$#dD_kH%=DvaF4k<#|YSv6-z&-n;qTEF-*Dx#*1om z*R^eQvU}zoJ;)AYUT8ER_SG2!%=n^TF42-BS9_8PA+$fQJ#2gGane-x!Ogr;P(P?AaO2?+0G#&soLpOm zFL>T5c;~otKeZ)7!?6xdl0K2oc*ZP-5tV`|UD8G6Hwxyqz<|)8-rViXHpwo@Em*P7 zGV>rN4lMP>+Yhi;xFksS&Bfp)Ark?Ih(~M4T%0$4O`?cXh?h-h+n|0VkJH^FV8r_q zH6+hJJ~1Kp^X_`*_vEi8FAShtMTH0W*6;*O)xp6(>G0maC#!YrMy3QGsB;DUDM@8D z!3W*CQL}u7Aivd}i8+S`ghjK(P1(A zUHh&ma;$d%dbi{Hc}x}v{D_vLlEv%`-cI)PR?CJC4@RWioFb${BQjD$&?JM*hZVZ! zSq3MB`0Sg0!iwAxb`I~BTo6!3P=eZOTt02;MG#?~5DNE3=jn&}2D#TpR4GY=Nesv_ zLT5o%hSP>!6U+)=>EPUj4lBQMN^{Xq`1ldC@cw+b(ZpE>`_}F+hET9)%*PY#ouqb4_!P9%Uw$q z5--@HXh41O|`hqSFQ+5IqWe_CwVsv`X8**|qE zya@u}Qz9_-_a)w%D1w6Su&^=~rvWdZ&NIB4l3vgem0^UB;gp~c*(JA(B>36V&G@3k zD79FEXqw@nsRoh&Vu4H8}n4xR1v}FPC zGeMemJ?nZpqjGaP`Qm|X0G!7}=r6R&PZb{h2^=AlCe#HO$R}tZ$LEY8E+HYN{y1TE z+bMUc{|n^{O?;XyM)k(`0%AN_VPhO=TcJmz5a2}&$63bT7DBNee%oeho}52^kD{6y z-1(b^fS@+h7XU0PScbD3Sr;vn-Ayrzg^isQ=&}_43qMO zAS?m!-IA`s0jZE-wb&*_vRFe3xe)g?n>*837b^oM<-Xo<07w>~e#Wt6bic?+^w`>( z2IVyzuC-Fy8ae~ra{Xg3xH?{Ntk=v;1tx`vlU=>h#Y1(nfC|f(U*#f0J-4HIKz>D9 zLzKDQo*K}CR1E3=IKWgDc$r8D=yKFBK4P$`VJKjqPF3IkH97`Zc()`8YNW~=*g43x zpmV}v&T@gBZ^Mf*knQd6Ihenhmhg}xRS#b>3Y}<;#ulXGx6DK5e2$-$cn0QeraO_V z&UZIVPgwGJ8NU#)f_ZL=KuPS65j-i74N70~%AMczwZHjQCE zc0on&MpOU$6p&kBbo+ou<$&Q8LKTg>&`>8_`IkM|G)Q2@+yxv}0)^7=?XjjS*szec zkwd;aN=ho-fDbwxEEkfhhSVn{HU!Em_!h)WE=l>0R#-BQVu|B1XOY4%Bb25HThKN0 zhIDzu|JiWko#JQBWP|XKmGi|G*`T5P{3a1v8SBKB5W|9ZXtw$y+-eWZ&Rhb&n>qo6pbu@dN0 zb)ZibdIMEQS#AJl*sH$#=JQr*7v3*5%h}8@_bshn0RQj+ka=xw-eSeXWSp4x+pIKs zS3$wQq@!7?2OuwoCMWnYjV%L6jEPW_^ulp45YpHRKT;PC2$l_Z5C!5gx@rX^zr)5T ztPS@c=i<>LNl%^d`w7V3X9yDcNEI_!J;s64XcKi3@;}VKju4l!WF?g?-Nfl62pgsJ z*RJ^!ZxU~F?%%}Fa%zjn9wa)8O`-VJg9`N z(9z~HY)=t0AE?2?@G`qV!%Ivb*P__h-)|-Rlpdkq`H;RfLbIz;tLpwmuiHutY|?`4 zHLycm0+ajS{}+tEkrQV(h^rze|e~Dg@(&2p}Qn!Wd1?x2j*nx9KOW*nZ41Is%r4s4+%+lp*RZm zf5fLI9P{!2@5;?!!UCY(wc#ghyh+}VS`w02?+m5WqW5cycn ze8a%Vexh{qjWZ+hTWP?S*I~J20Eoo+)$DDEO-+af=CW~geLHnfZLH&J3MKIVG7Z;aRw}s!>>uu7Qa(GxjCaV#$R;DZ84V6NAH|9mLrXrI>iFLA4_7oO(( zGorW(GCJjYs;`_zH&L_f9pDI?tqriBPeVm`chkjgTUl9y<0o%r+sRMnh07xk$S|Xj zoe{{Ij<;_uZ!vnPzH*Go9=t7CB(Uk}=?99zYRDi^E^>0|Z1?$Hz1hZ+2FntI+}vRg zK+gnnILzUrXbAbGw2l|@P${rSKgpbxX*X!p= z>mS_y-LW9~eJJ{k23DZv{bLV;l~IzWhdyT zM;2>MY#XEyee5c$xIG~c0YZoj$k2f_i8(ZjlqD*_P6q5>oAI{XTK&fW8}mOdr-gn{ z$`kPiF14<>cHhx@P1Z>NGc5G7*BG#Pr6!+ldF9j^$ZXBNwr%9mNTM{Px~=5ocx_@* ze&uo_tZlY4Js2BnuwPT}Au|eW2r8b%PK&7OClvc9iShStjb)=ftF`gmh=G!@6$^dv zY;(qyy(jwf%CJDc5|bmmqwzn?{7i`dQGukqJw4II1`EIC-TdYI7zvw7%b}EE%soz& zU}6*K*tH`E;>v^ccBkG0c0)f~^XlO?-z5(ZD@%6}Tphd|0G>T;6sp1WcA;8nhpJR3$)F5KE#y%%lX9XylYZw^u8ZfAl~@<`S95^Z}Y;w_x@g6180S$)!Fc%H_h2}NApJ0 zhR5*W+;yu{dqYX%!LZ@+!OuXZ!NLg4D!W-i-KhGy$Q~iBhUt?s;2RuBLm&iHr3M!~K;3GYKS{+muRz zB3r5sB-W~jm;KFs-Dvmha^Om?4K3W?E!Wa7t=gwPG7V>HJNBG_D4YZK48QBohac6L zs#yunrXQZN%v_(QGC%DiqYs?3WYzQ=ntb0!8P^Q^Rvk7|1q;QIcb>DMOQzzh|M?L) zveBDZ^k+HfoYd@ctZdE3tYa$vlUaK>0olqQ!&150QtCIn^GG!Cy@8I zSJxMJ*U_vT9I=Z(d)fwjRGY9TjfGIZanWEfZIFK1|4;vAwq6D7;tqXj^WEhPxk*CA z1VE>~Aa8U1AURSRb-#}iTc34}7tnJ_MZmBE4y(yM1rLEGz3sxtFhf6$FrO3l-&Z|0 z$l1Ot34Ga0LlzCvkMj7%)Jx*Rjf160pQ4SO@BK(lw{yfsz+hx}X;Vh%rR{Hs%wFd3GleyB>S-^ztk%0U)wg7aw!9T6waO4rEw+1BRMPA&y3L6$*_ChDq^e+uJ+Js%D*;dbF;ES z%UbEj3zByfukoB=VDk>pm4*9B&Z5rJB|Mdw=kA%_vb#++!QcDW^~P_?eK=7jU<+ zunT=?`4!?OrA+j!hdMbG2YWMeNkA7`z!tq7ITG_28rvH=xo8;Njn&%r2gi_65ZA-U z5mr#}6D%)TuG>pd+FWd9;inkB?!9KZ1FP8TDuYpPIDv1V~m?JC;J1Z)39iyEh&O7bQubL2C^e_LR4{Zzi z5?tY(T}6H~YSUE0fIUNd(#3oH#QY0FpiJ`7srYfgYfVUTopT$BH1~xr59=8|#Ju|Q zh1yYJ{bATsjNYf8rhbUBqip`hYTveoy#A?Gv%P-ic{pZxd^r7;>xb)rT17RVF%BQa zDS!%4_FDa!ug-Rdwf$G!v%QQ7p@ol>>DxvmuF=kRC9(59yKK5fG6!VbdYg~^9e6jX z@>?Gg#e8uUqpb(;ZgdSO5k-Doxyl&o6-sLp4naJHFtCzHvcZ>mRvV((i|`1Zs`r_h zcD5fUE7KW(Mkk8&Eln8a_-6!b9@^SuT)d=4G3UbVvyo7TzPLy^dQaN9jBE_F&+1;d z)M_1XHr;8i)bsW(s!c{t^Us&x79d6(F&2Ep<38%_|Go^~#HWKEn3N5*e^S#m-B)Y; z%Eub(5{l@>b#U$`VRYW7bqehM)MWwQ8lrN8frFc4r{w{XqIU;$x^zwv18_E(j%kV<7(~F!=q%>=YK{G|*MVi-c=zbBN zrhBaPIh7PCl(Gfl!%P&81|@}ll}he4h2elb-G^U@MWqV24Be^34PK%aLP^$24N0W}CBVgwooo5Y@3pDx-;Tm5 zk81_Vu|FucxbRyoh@k+T4QZf)I#|yWaKVgtiw+=|@JW-*pb-g^pT8uBd4PtWe@gRh>n?yHLYDOl3rYR-zI0KBQ_A_z z(zr>Jp&#JIgZN5>V9I`c_#c9YWOxEX@i9W6ncJ`bA5B-`)@1v(#~3iWLvr*e2_+>) zmvpFfgCO1Af`oK;NehT{w}do;ba#Vve9!wkj_)skZO?Px*Lj_F_dMCLX!3`8kY{9&I(-_RWD8E6pqvoTTOd zukkv2#dIV!a-zm`LFTf*m?v?oTA>tSRMEY_`th%VAmw|W(^c+Y!wZ#}}* zLGC~SAll8_v9(dSu9vR*qlK93Y-PkDV*D8fTZBnWhe73XHuL2?1qCPtbQUB^A?Z7? zn_WpnZKhT9(8hEyLY2taz4>guC9>LVg6D9twT;^HA`hD}Hr_=1+Aiy~p=0?AP%+}T zYcDB&?#ZnL6!e&G^dH>}h#7VPcG5;xheYk#9TZ>gwV~m&FbXEgDmBS245P$fv(Bj- z%y~EWgh|8!$m*=0>?UYcwfIj*j4r)ZiK-RwLU12^fl#!;BMU-{-|Ny}M!inqZ()bP zF@W_({Wuo=H8xTlogW(Zf{&sU#+b%JE_)8ko4=2L7JpB8jVdaVfi-HgDL)zY%fKoOgVad9y zKiU6l0SE(ITP1uNyhIFq|A`#V`+~Y)D;l%tdh|H^Z#KbiGlfz44Ma##D^V3t3`uyw zmS)P>5E$@)8UN8hsG*B=ejO25JZOSWLym)CBk0hf6y*lD!{d6RhLj0FB#74nxzXTs zoBhgR3GRR)=!~R0L~9|dFF}J^V58lS)E&zOZI(P!w4y#Vy+F}72KqJ=8~7YAZrwR%9Al&E5Cm<%uqw2_H11L9DYW0#kxq4&5F9_xa+A#5Oih%x=ke~X5T&Ir^p_Kxd9r~KlmpTLJKSg+Ui27F%fTqekLFYCi z;EJ&Yb1(8vV63rpDozuHtdOWtTkGs37ioWp|>7 z%XePjZMw&Ypx@cW!w_p`M3bD@ho6)*zYT)`sd6=`Q3(H#bc$gR%R80c!nk1L$9xrJ_Ju;BTX)7%7#8IUOi~s0mj01F!m0TIB-XBcQ)`K4aIboi8)+kp<8Gma5la zDR4URe{V%xfEb=s({OMSh1+VuwP-(oj_-$oSGU!71gfmWa`N@7qi^gxqsp0KuM)CV z9DqL>00ml>Hi88sPfz^)K{g)+BLnakNeY-^`hFgKGnz&b0WLS#j*P3mNoch#TFC4( zW?~Y58JlR60Yqw?@Jks*g!MJ<05L}2aDUB)ArVj(JXeVI0Ji4i3xCUY}vF;>TrT=NsYTc0p1RA<$|N8Ey3<2cZ=Pm;pSGs_)Q723=%_^mS?R zg@~4fmN9$NK>|9Rx@nFbb*HGB`IXunmC<*tSi{R9a}Q&3T+E%vmcV$IfkAoloWHKZQrS((!sO^E@bUm z?3N9HVAsh64|cSWzxtl@*?{Af@uU;f;RYI3Q%pYqtN4JnmcR(qvG;#%Dt9Kp>w`fE zo=4&STGu!ds;aBHh+FN+{%D#BUsTM1)|gbpCtzK`RX-b3X$iK3YI=e&hzmHWDjk}t zu!Zzz6`F(~d6O5ot2{p^mN}USdnZUGTg}MEYkYso?wpNE=Bk4(jV%q(Nk%_}jP3Y= zZPd`EzW2WP)0Pky7lHY5H`-s=PYmcWKt*9*!eui&W*3D*g6RM$_t&uJD|SBn<-m25 zmwtGoNkx=}r7!kUZ!$_#g?+)zTiU=M|`3tEMW^A4?F*s_G%{U>TnNK z?Ar`AP6ySrK}*W+1SxRzX20GxekL5>3ouxMDU<7_p~YrYKyQNSG7V__gtUTa{@C^I zn;V)g@!PCktC4XvIN<$~Q|U{3_qBh?{ShZEZ7ES2lsYmxL z_qB^Cm=-B^5;F1F&7y|)j+S?e_+qQgpWry_NXQWF;TiZtzjA<|>)epOJ{CPQ1p$BH zPi(F5*i}uKJhH2lITb`S%7v7a---GC&PlN#!yUH@sIP=6=U_SRh8iEHwqT$IB2+_$ zcLuIB`sV8HL44m0!c_zr@v6(Ui;cg9we-L2(zv~MRX`5ZtOThP$C0+20(r= z(xW4ZZki=Fh?J2oSNQB}j6R-??cbhzuKn9cwngJ|sxt$IreUzs@3 zXlMJ#W1}=>)$LsJSZMXl32mawbC=jNP@Ze}6^L@mx%LnZK<5fn0N>+Mb`8+@2UjQ20tyj3h>yf}Zj3b9A9=0K6Y(WU!7QxJ z|F~KkYbZ=8Ontj_iqkV1g{pi2c_A0Had ziAZ=ujxTX&@x_{>^KxE)Mbbox>_R<9(NITE7;eafmDO8!pO=Jka4=37p`rf;a<=D{ zYbjUw)ZmG1^k0xr8_r*j^tEqjcCy1)wy_`i@(jzdSe|KCpuC?yK}NArX?^Oky5Bg1 z?kK;rn+$LWL7;rZAhqxyqj%x!JKyyBez*9)T3&J8r}qntz;OESg55?x-7y&9q*Vz( z&tz169He~wL@|D?A5Mk_Ya(a%TatC2f`WtiA5qtD*kHRX1Q{8bP*qwy0+3=B^=6hp zwDgHzh`z30P+iG;WsCkyj^F9#Yh{D)jQXR#>@KER!vnqCEqcDYRl8 zC8EXWHN4P5OY>as=jGJPg}q-xza`4l!k#L51Rvggek1MDM9Z!N?t6v@g!Xm7Iq}hb zAX(YkDWLBB!ZSjwGCHAnSo2(!C~J5UbKh!#em*`&fWE(MVQ!?aGiD?TVJ z?Bukehnq^Py(NSME{&xd>F+AAa+zZEIu_)Oj97s&J$@O|BSH~y$lSh5!Oyt}4jcZ} z^1fjQmuFhkSp=BqZlPAzQuw;6Bj0p@k1In7`|yj3Dfo+GZtLRbr54=vcC@EJ5pNtP zxC4E?M9WJmZl`tP-8W_+_R>K){{2EcBb;Yj$TT#I91c$u1|?mP*1B7SkmZywlx_Ow zQ3edajEpDyIj+OD1=QW-+An%8f8{k872}dL_!*&KxrqCX*YObKgworx^VX!2(2`B z*C+cU%*4-+nW865R%@{oY!>-~HR%WK(y8EESRVS#BT^~GX@#s|r+fJ=$In>3QM&dBYYQPPFOEqiuS@IXez1{bp3G_M(t^9>`)079p>MER5rJNzU{H0r zJ4b~0_*Baf80Jz{t)dAR&D1s&Og;0yu`r#2XiR3B#EJ)7Ls) z*PH$dy+-v7{0K$8d*@pc_I7>NkBDS|n5gFOT7PL5DV_O_4LEsO+e{g$jI*T%+31v5%{!)djURyByTT4rcY6ko6H9#WMPbcB<@%qTqdn zm~|}RGVKr9#U7=f`2y_H?=go}jhwsp{weN!dS6Fkqg~Ox&3hnt_+6Q3jJj~5256(P5!|`M97@!ouKecfu!i`b%^MV5&o5L4Z+7ZZfn;sNZu!AwlS@bm*c|dph$db z#kUA99nsfS@6RM{aZqP^f(oo@aDk}|QGi}eGHw;Jh(s8R7WnG+SxU`Ie=4k2z_o1I z?{b&eq|=`eq9--m&MS4go}p-0mhk)^Z2=xjEpaD>^hJ-IvmNTt+lAeHhX|Xfs$y@ z4C3_u@n(#|`SfIV2Z)FV`-zopXw#mlwX`IRqKh%OlHmc_~&D+EnlvFa~evg z(2uBXWXQPO#~}GiuuUX5dO)oO3u`imT`_c(C%jvdE*2%A>RWy_d@B%EFDUG> zD#h*d;RV?%KL%?5!*+Poh~#t_@Y@b39tr3lBhsemv-U4;tDQIa*mX}?aE_O88>X~! zUJ_otkCq9pG3D&9n|<5;OEHXr9W7gc5Xv98#ingK8WwrhN4gT!3U12E30Ss5+<&Ly zwzx~$oo_&!*4l%rW9e+_L|LVom>``#kQMm#8dCd^vnBfi9tZC1k8xkAQ8~PkWbBE5 z-B-zBMc99_KB60r=6?!Fd-Vv6W?q<`^xT0~05i!&p6H3igvSV;=@TQ5ck(2~H(`*FwJ;&w3u3eb4Uj=RDhm zWF8%JzEJdDzW;jP)*{VU)=P^Gf`^ZcIXf@dnSDnswk=FAwKm4@yPqb<@{)}w3qJh7 z7qp-+j7M8E6Gsq9?>S#3>(cZ`RJDf<9`#dwAkj1C&TsqbJjmx1x9_ENLWn}Ch7x)o zl;61g(_GQf91(|y6+LDU5UqzUnuY!=0OWr;XoNopVZwU}&WFdl=iJod+8~Tirixz? zb?bqsq{5rYi3300q@SQ%8q<`alDxbi_(sz_siU>l?T;~h+O~wPi|7S>ji*-`Dm_-O z9keuG96_4*;Eo;+tLZv$}`3c@8ThBQC9HIn3O- z{wk_35&uo0Az=Xn8+|bc^+wwqxcSpMI5{0WhAa*9=&2*}yK@C>e%AxKv6-ClszRn6F2eo+W26G***YaaFGp9wlit2Yl z_B_%^xej4VK?;o%sp)mNhCbq+Y7$z3jF(y}IqcOh@@{BkNZUF@Cl`|E$DbAe)FU!o}*BpIP{?^sT) zYG1#V=N9jo2{;J8&>Q%C{xIX_%PE0(h*u*5T|*t-{w)hZoIems$Ms4&y~O*A%tble z>B|-Pjj@yeT4^{())I_Qi&uuB_iq|E8H3lLp3f zmWD}>B8oXQJSoP&``><$_i;O*7{)@#$e8mu*(s?6{ORAoU3G9o`I@ZxFp_Ho3*fO~ z(dN8I6|2yTPLTb|+t$TXm+Rf|wefgfKK1p-*FS1snOU1(j^qp5Qpce2wIJK2paCS) zrj|n9Bx@akP9=#hu}ze=G@5Q)~$x&eh^-x zUMk>vRH||NzSToeG_{rt2o+Z-JW}6jnmj1+%t$8Vv4(v9+DD-FEe#;#w1&e+EF7r!uzOXEl>g~_3PHu8EmzU1Bv9z|t2GoT{ zbEgc3yT6~3#B?jotKVcgw1}MEKg5sAt|w2Fg#FD7nI?)%Bteu>b%9V=uA~Led?90?-!>Bs7-)*?42nrHS#BM3y!rLz z)n_F+zV-c|3{i^PzrJu){Ha0@n11}I*6D8TdW!UjyP!NpBe2PjHQj{C1bYR3*ki6m zF?LQx2tY%GL6S|N$d}D-2KNGN8kG`6Dh}E1>_9@DN=S_^+(=7ytI5`a`Hw+wx095xKuP2{uk(a ziDKM9aV(KSR#MvMk&)MCmgWk}iI@C$`sFhZ-5K(B6mUFf(D@88aS{x`8RzA>(9qC6 zIGi2H^LBHKI3K|B#Ke3od;W|ChUcZNw-9xWgo$P?=gZ?I;$YN&(kBM`6V0y9O-dr` zSFr*L-TO3l&uqyrAGHaRnz9&U&A1Dcimy`Lrs}MgYN&{2&Y$GH(F3$ACGK4?b-t-H z5!pG>Roh%6wcf11dH?u`y5~zjEwn$Knr_{l<1FBmk944wgLX>4 zCpe2x~h8*W_A#+r5Z}#H!my zy~=CX5_8zK_a)8U_o#yBkI?iYGe^|qFCxjF9x7G-{RH+z61_g`*_{e|{T}$I9Lh!l zO|>b8iZC)d8uvq&ECwc!!)hKj#>A-u>(6t-Fo!?BoTx9-7^rWw9wKgheoFgst%}K< z5g)I9xZqA!u3gy!5CjhEX4DmboaE=|V)$}S9zw|rV~vs&2(Dd(qKS?b#B6xUtz5}> z%lu}oc)7@3xX7b(uj30D?l2xdg>>bH8B_%u6o-CoKX8ptp?p+c4pu0_P$-fhpxjeb zqt7AnOo;Q44bt0k@7Ro!CAM68*>IWFO39L$);{&X`pIo@iu-a&+qepA&$WrMN~~dk z-t$h)gY!!ebrtFHtB!kw{ImSDkYNGd$6#@0^rBLhL8}Qmw54XZ&T#zTLZ1W%JSGKt z0~OJKB+wrlFr>Z&aLrpk#Tu_Uy83jQ`NLNsWJ-wC`9aL+x*oC4=$&yM`e< z<=m5&?+l58&u#!2_d(92hw`$w_Dj>q~$q9#_z&0Cz#JFL+G9wa8%e=OCIvp!G=smclNz9Q95e4OOj#66pJUsJA ztV%49Hu&B-Ni)qhoGt^CdFT-Sv&kA8nJF+tLV$(HV``tK#(M!r;7B=~@^jck3U&`r z&&}m|zQvfj^KHh%8TcFfd>Vr#Pc*Gamn)7zo7_&p z>i=i2&aziR9)X4aMJJj_U6HEv3K5o{ zE;!YX+4PmUC@RY$8ai+hTB~kZb!sZ)T9M$F_+E z&oY`%P%x9%0lZe@w3YsiuV`?f*!L6HiwS^QyQJZRB7eq>hq&H(|NcexXTBCnG%sfhBx+A7FZ!x9)7#xEh^=c=gZ`e4+ zKC97(F(u9_AgjteCi0}96%SJh*wxLlf<9x>otX~LW8Yj|Y{kpw4zDHl#!J~XjI^S@ z`koC7wd!}K&x;aXfk!1_aI+iMkhi!U#SF3}+>jE;%bk`-GG|jV&jag;C~6VPR~By( zZraV8xA1G>FVS0a-4~g-Vtott{?l{cP40XM>Hry@!-^ua-d6+Cs|2Ty+2t(6V4ZIa z^2`2%cfG^3EIWNn_WPV24>%1gx7RwqKNV{QJ0U%ZP6Z{CCuJ7XSuVgo!k4b!ja?{- zCEV=bO86+|;cWxz5W6`?gL?+I>+A>D`_K+|1KnN`soJRkE1%z!a1 zL_nE>%{bgg-3%%q>_;@0DWIzP8BsTWlwJ_0x?U~l@NlZeZg~0v=Wssk2Z4=QR79Ks zjsKy6p8HW!e3*?eKSuCUy)D0i->v^#lQRtlMkFJypq-LzKr2;kEzfwZrRAdM4mM1j zYZ)^{)i}+4MK@fQ#=B;(bJ%Dz@lw;}aDq6+kk_E>LD6Kj>PrV}D42?ew3QZY{H0+%|I?AoZ2|>- zKyH-q3MB~c)>yOQg8on!-Y{d!9K&+{@aD$}tiEa`N?+GaZaJXiEj4`S1^+T1MxCNk z-D-{ONnhgNJGs1XXLE9wMLw=8-*v)N#2yvS9}0y1iR$|+_s~_p_H3HHk}>216y{&M zPmM|CjC0TS(d9xBqUjw(F(Oa-n&$I4Mp}a(^#>1Py8Q+Zs+0!Y#woDytQD=*ZN05E z6)t}%NtTIY@`lCnJz_SbqpWEE^zM4j|*9e!7d97tT_T8M9 zv5A7Pc^i<4Wt$`+cULl6T>SX6;^#fOFQJG3{&;xkiaW3wpw_DGGH>8actB`e*rPUo z=DDxH{XdEg+0&IEm>GgdGDcmJ6q&cLGd0~^gS_SUURS>Q8v_nF8ZmNdrP{A0Kbsr*$>Mk}7prT(!?~Z>3xDiox(27>-Hkf^ zpVo2DszI6_fcfI9$7*{T8Sj3+N2+?IGb}GA!l(85iH`lldEMsifRX`3jwpYBkdP^= z+jUl1BIPC3x^^tn`Ea{l=#FJaXx5u+Md=R&d2uB+uQOt2gh|`bt|ViS+9v9q!-UY= zG(l2TYI*N!UEaH-r~eZtK+37u0kY66J)R#`PJ3c>M?V%D(5_y+#bhc<9ZzTj9W-ax zZT)-tV1Ph!K#?Y5Md{<{|DDl6z`!h~R`T*H>mWP-yUeNMf9yl#f9!(}ZvAI;smy>j z`<3C~pc{+;3y>VB;^mXH&w~e*k#Q;2Gh10Fc?)KsGf{nE#&l-p+eNQ~y2gvEg9Dch zf~wX{0nUtpuq97z&BiuZOlNa_#1E(cX1!rCgP@*!9692k(p-sFevDhHH`@ey{*Od} z9q84|VnsT8dHEOF-cL&Zt=+4cU-k0 zRKpLX6<$A9?{E^h2Bu~bnc?e6K|HP6@4piGBh)p=W?lo%!DS!b;|_bK5etpV84N=CB@%R9%yLa?+O>F!Q5-}#NRpgw$vv$y@I<#ejQa<0~uxz)g4?;ZN+kix)ke*NgP z4Viq6;(FIUVvT_T(!unbe-8LwFNYvKdegporPSWf z*UdAOcJ+6M?d*^4g{mfHhoIb`jX}XwzRk(;uA{i2%l-uM3&FJUy??5I=&`1A)#Ql- z777`~X^KlR$ZN9F4>c8v)eMY#G*libo*!3&43)|eNqg|i>(L6c#q^JX+O(Oa787QK z;emnW*{5OOk8BKPr~Gq1E3`==t?^FX{S)i!Oq`PfzDIJPMzd1}yg8MIsKBo_6yjpr z)xZv!a%Gcp1O;4Lqk{(j8J?%-IvD!}3q0?ufA8?M<1}D{4}>xDO&3ug{wy_h95|X) zQOkpy_-=u^WHc=xforbrRfBgt|Nr24Wp@s64}7|lP2(1qnK6p)<=Gb zaKH}2MGVp^FtYEsGZuFK`37zhIP^Zuoqibj+AdI^f{gM#> zVhx8BowjuhAyPni5RnjhVvgsxZ=jAI>Vrks6Q?#ls% zg*PpNmB@S_sOhx4u_M$OSHT&I5ufd?67J4#*W8*^wbdiCGU`odlaJKDBW%>Zyhvc-R1{`u1euFpz%QsBBp`UBWeQ(kYf+9E=g{U=s_1YdsUA_!O$H zQfbii;d+?X=3oSHsQ|C$dJd?=x&N8`0xPYP6B-MBKVDlbUZuXs32ns1lMBUI>I$O^ zl7Cv=Dew5(%PD5C3YG`C-E!onw`D) zi*r^=hx>hk@yCPDaSodocMSN|6}=cXYTOvgI~$iZ3Fn@%cf1xOsuOgJnY;=(GQua1H;lXGji!I)rHcAeeorUxC!XE&-QOG(UKG9% zfB0$2nW_9vU_!c;6Jw*Ukbz$04dLJ4&PA##BblFKp{eo7L7P8;r0)Id&0jO6Nx$mI zCRh^0Z0Oso{{aP74&vh6PaY>5x%qs5gucCpP1xtEh5hAtHU73B=&N++1#3VZ)Z3+I zKM2-ZGL2b9_L9mFHj>__(zIXWf2+!bH~b%gw>4wBkcOa##y0Nk&h9M3PA$Vt$RV^( zdLHCm#V?DuJs;njI{R?iP9;OxTelJ-5-w0Q_3KrMAfr&nh-oqo%uYq zg_9`MLxa8X&qK{X=X2`@vzh}dP2X*3JbbrWaMeYiaNPLLsb%T3StQ07WC=~wc2 z(^f2Gw5=R{xze>}^Z=p=Z7@BqRD`!yHLHj)6Q57=GKsJhCTTMw zn=|dH{LajD0usN^vw~G}tQMYxzSlnnAWC5p(M>_;{t z$6ZFv_nJY>*nHSR2 zGh+fQWZVopX&^@^HVIg$hyG05qSeLzbWRSjBz)opJ0l_3}&J;TiJc)02 zw{`}ZS&;~ycRw0Rue9?^;+>$53lf3#T$5Bi<5d6N_~s`^ORNt^U@%h)eW2TVDlmcl z`}pC*UZdBYhpMy@YksGaC?wNBOgZ_lV>SF-%kU$OS}NBTCWF0LN7erDNs1p+jJWOx z6iPntqOja4^q67fssZFGmsT1Ex`?hj^zrDTtcvMNTIvl;G| zJZI@|dd#C*03(GNlS zCFua0PN0$`gAy%6@2l1>+BN|So`8AYFn$;rx2jXe5ld2F47~&(^<~!ioz|DoIKEa> z3m&J0Xs+tw_l0V+<^CA@hSf%;iI#OGb2?SdELe?AGNG0_g&XS(B1D-L+ddDw;5we( zcSJ1s76_0V3d#td{o=V_ksqf6^z;^f{`@LXfVPwW%JE06FgDXT9=JXd6`S-i@Wtuf zH>BK~)FB>klO(D4e_1+IrosFxI|BgHpcXMt>g~8Q5L7#h5p8Q(118)4YGY)IA3i?H zAy7zA{^nytLoSi#i$?r91i87f9A)89mq7!msQnh{7r!S22+1GR1?cli@{dqb?c^oG zNCbChi?ChDT?@8Z8WQB+bG)oyU%r111W>%P-FA)0KNy$aLy^aJDOy~1Hn>ix{i<|$ zqi!C0JRt z6SE>HYmtToF2S}B3ViywhW@oAwU!;xl?!gcWk|EdYVG7hkJs-30!5A+5GX9IY8i|` z!A&3ml;}HC@k+0ipVq%w_at&80}f>3Vobn}0PAUS@tsg|6Xpf19S;w5!lygT)h2z{XRqr*GKS~4 zQ&tC=sbeSEV^eg5c@1IV8s<2etnRss#7{m&HKP%b4u&jLs#o!GcI&5xf|bP!M_oY9 zFxNp1sj7|+j=zXTNyxSYZReD_5}DcL@JBDFAB;qI-b|=u0aSQjJ5BryvNG=~pAu9A z1}ihQqil`AYA}E#QVST7k{Xs-N_{+?Mc-@TxIe7>&PL{&UYd5XG!u=3*hMjcz|wF)2If=T!r zq|+$0Ro~~%lwp9EN_M}vaZFj?E2fr`k$Lb0-64x_Y6%p%pv1x76Ad3I*V||*Y`%}0 zyifcP+xpW5gd6NScXb`16(QPQ^4z~}{M=y^@ zRe1Nu>H0z{7zjWc2kJo)-&Kh%%9L*b+#-l(6m@KXA(q8+i_yw;Z?9hDdMA=iUc?M9 zaafZorP3~bll_e(xryvGtIMbYk`@vZcWj0a6lkSGy%4>lq`&4T0~x4wHXwzoMCLo$41H4~&O`nH!9ue;4o2@q4ZLZ#j=|pk z#7Jo61O|*^Ly^eh0hRtM4bp0vtRR^?MXklow9`N)ejO%Mfnd6;=2j1(v52j$QLmk+ za=~bzU()n$+Ocsf*~W}Vk}nvlI#)Gy(DPN8EevV)2jgUv(CZitB(6m7vnRCdPUgtu zg4Tx-5rPf@lW>I7j}NRrE;kANtta(d;v|^R1L|3k#=F2quA@XxHWN1EBFxwf5U03s zxufpS|L*5)PE4N$6l-i3jz7Dqx{}D>nZ`%oXeeU{9lTaIK-hJ_RMT#&&d1!;dg($Z zTyh5Y*a`XUue3U7jPPUKaS7$Hzz@o4WCtU)W`G)Y`k^|-&;L@btA4X~7Uak(Rj5rh zq7`8CmtXn`M3OkiHETWKX1USrUwS`1ZT2?JN08e4Qq-!B9DW1V=Bv`K5({Vpa7KO0 z>XmfE(DzTU%$`^e5|E_E(`?6bXHcl2(Mo%dlOaxh6$w~hs3D=X{G@5;+Ho)prPGbRD6|f+xb%(Jv9xr=!Yn599)bZ7>3&WdGmso-78OC%=7iOETLtN31~>oUEi!b z6RmQbKRx;=5r~5xE^Dh!CmtAY)+6n=YH0sPc;S-m zm&nDTH<8f4drq48>?Wiy;BzBjA#w+9zr7l0E_^3oPo$8n^F^GA>glgA6~}AV7r(Vd zzsccAbHfpH_;_5iKRgd!sY|bxN%#lB9P&+X*-3S~A#}fN$3o2;D z*Q|S-8wXrQ(3XL)o<8DuykAG`ftm#*zY~;x@eLT_$Bwh(QVV_lZwxO=d1CXdRJG#b zza@lmT9@5;1O3EnWi0Pa&jGSH^`|u;i0fRAm}Wsi z=>sl)h1UCJiNm>?s+T>P??BV6ke^d!+%4upUb}T%H3OEmdS42lN!DL-)knE2Zyk|B z@3ohZLqZU7z*X{t@fOhJ-2XRfKk{zA;0pA@FS+Yv#_brw3@Y2E!ET3`hlmeFcHxTxcmCxly)NDj~iK6@}{OVGND4Tr}LeK@o!3zWfCJbV{Csc z5%*$vSnH~ep}bP2K3vBx4|?sZfa*^P3b39Ndy+ng-j}K0*;5#)WDu6ReErwv!3#S8XgL zvk}y}lmZ?^DkA^L{capF&o3hPd7_2%KYuGv^nf#?&~u>v{8M%?Y2QsL2_g<)h7!Sl z&bx;&44Z5K=#HV(&r%wJgQT2F)kSCy*81Lo6$D6Pd+A{jbc~95%zp6)9RfDV`6hoY zNjo_WI6)dLBKpL{eyXY{CR(AGC&ceoBc0Gn$mAN+Wh!MZw*Pu;L>B`kBBUiVl>G!R z>(_R7%+e&!f2=8FSbo%TAqOrF0PuQ@*3{Xr(3TRM`afTDpPys=#pI&oEP-CpLcuz( z$GWij^-wU7j>p?wA+k2}-vK4DfwiPT6Ctsk{S-NU!Gs2O67kU98ifBA@AURzuGJIG zF8h{rlawgXugdg|y{L79L?HJds$Py=zqI_FkXr^`Sm@jbq%~)&M0=*kv%r6;LP_86 z_vW+Po(N1RP8rewi@<5L$O)7w)(BD-`l!%s_-iZY$&QAPU1Znck`Qv{38Dg36KK_m z!6`3;2`I9MIeXBnXr8z}BTp*XC`6$6``+N_dF|l=rLOEy_KHxqN{ZuYw> zYuUr#ZOp`)0!5lAi>$=ae0vs~snP1hMt0}44wrL4FUOh4)9u(hz^okh&p1K{Z(OgS z*U(9wn_~uIUb0>3^KB(DId;+u21m6l{TIRexlZ>Yq-;0G`WpFia*YnA)TAKHM;J~A zSYQjF8DS=XMh9=`UX30NI^NMyMu%rrsfvCgA;pQ$^{a3DTYa!phkFF;skQM7Vezw1 zhc2mD1?w~kOa`BAEZ%lXlj`GrGib_iz&k|+!+*5Yu#K^XLc-MUvBNx-Cd0%FBtFZ> z;G_+X_j-;phV_J2br=MP=JZKAK3iL4f=+N3 zAzR8ZveO%60oC_k>B2By+Gn+ut|y}(A=RlPW)C$BGcFyU+lg#2oAz5=Q{P;_D!r>3 zAT)^4YECQC3vjn&+-Ue{@pJsV_F()84^#~OM68+maZ(otvs_!giQRhhIpL{S5M+9! z)px}MIBEa}zL(Q4&8uU*R#f8*W$S#I@zKM+E&-fb(Td+n@?rvD-4Jk9u#Jx^HoBPvJp zcA-Rh{wMI+0^FT=sd_T{0GJG`jW^t4;k(zhyL4e%?@Bef(y$th5S&1@2g$~OKI_&a zy*NBOV}T}?T0u3`X;cMckT5O6FBbG`+5de0)}RWPX5>TE^MfT$NuxSUwb-ZGb?Et> z?>7zgw~b63=mqQ#hs_a~+!c5z4<)Cl-}!Al|4SmVRy)zpNs=Y5t&y^L#{~InJR|==Gqh z>q~_qu=}DT@{_|s-LIjyG4~X6@8=1Xt7wXcjs&!}L64ccN~L&46E+jYo?eTX0YCo$ zwjU~Gmav&f&i3FVv7^u#o#fpG1jz-^rYWAYtnYZe#Gen4x?JS{(9f3l&Tngu%xV&! zIq~{4fBtwsjY?)bT~^dB)ifwWCJUViQ!IoDg=>hZ;n(mg!#FQMWIQeFvA2v8*WlPzofm`R;>D6%p1|W zG=O=g6pFcp-|E5m&2&I7%BCtSWLOqAj83_{ynkJ>j|Qvz_{>zLU8}4yZP&PSQ_pC-8)&#R|#0A@xD3)dPX>V|C2WY zJ9{~0KIYzgrmaFo`^`$`$hFhEn@2g2I+l>jpmLyE!TNs3guh_6vlQzU(7bE?pIKwi z_f`Dwd`+XDeE~bV7M;0xxe+U4Mf+O2WrptWp0YG&6-cebRZHCf})_R-Luw%PFTcIhH#^4&s)e(RR<4!-%EzT$#anl+VMjWU81 z)^p*gj5OT>m8=FNP?MP9$S@TW)7l=wt3`iace#PDwp@0HMK@E(4GdCbx)rTJ0}5t% zJ_CqkUjOuFpQxLNZOSG#i{Zg_EYIPMtsW`36g}*?67V>EsT2FuJztkm?LCG>M4Hll zboDx%K1WjwoXE*5B7&md;?_Cd^~miZ=YM%L#X;NpBvDubf)X>&d(LB=L*8C~(_)KD zGDGZC5XHLltStUAl^yqHEK>BiGJNhL9d7RnM3$wuCab(hB;Y(-C4V0E!X7!x$VrB@ zs6v#jT5|BuM*Ed9wbjaRG5)5}Xu|7OUgwAz0xz1bDLz-eZo(T&@DIAqoVXu4IDEkS z6o&X$y)r(=n}eGCZ*R&lkEmFj=(utl<$Xrrju*j;tU)P{#2#vz?UetGzj1I)ooVYj zb>iW7hMrhN^WP>MUUot`9ow44)T{^goX`{~cUr%Gf9GH0Q>|Pn)#4JVi51e@DP>bs zwDn(E^|ntVnQp^zf9ce1Zdq62N`#$HQ)moG#3Wz1l;MfjK06pd4;#%kO!>|`SMjrk z`MhDXF@W47EMmCG1omZlQc37P*>CnI1s9?p=^e8N(tdv2$Bi2&?>iiI=OX>5`TkxB z@qSlU>b}$@)cLsa?@k^I96xISN3xg0V_=Bi$pPH#H)_)v+bqR;qAQJVy4>4iVi#Qu zPziH}82Drj&~B|2VE%94*fbTf`JVw$uzv9sVJt^rI)FhWB~_4At`97^XdTkvPs<<|Rb>(Y33`i0=o(VL$7iA}!=9o+0<7X~Q6sXpUUglA@sI4FhQ zqa!0>w7fB}9#AXiSd*qMds5_I`W>%?p5~GhB6@yTP`zrq;BNZwn&Nck-3nk+h;2ja zIn^m&M$x+b{rh*kgm0;W*BEtHT)au3a&e&gixp`rYsnAW0BruS)dMvQnNkn&Wa(L^ z^0la!SCoiMWMFwn0g&N;)=JU6COQe z)KNSaLQPCX>f4&FD~Hop+GC?I+o2KIh%t!~At2VB4@CM7Tb zQ4>o86D$YuX*U;=NyW}>4RD;dM!&_@&!-24+l8uomUFXs3Tl66$M$@fF$3^v<}pq- z3E>Sf_(6VfAsDd0vOr*)x9=FCtTje~@2^G(Nm-=Vs6c-~)-64x<;)ac`4e084cJ-h zHuhR~^%_6le5@m9dAJ_*e?m{u;~|rm@Ar_Tn7XJDS`_%O4R{8SpCBaezb<6THFGtz zd7Rk$L*Njn_UMCaG>6qr{7=h22zBcZd)ptw)bz|k>waQwZSko}JV=p5`$y9pG1uv! zMD|7foHjEvD+C-q^}DlGZ|<)4UZMx;k)h{;VVcoC{>Cp_)f;bb-OL}JIwGV@B9S=a zmE^t{+E=COAu@i`5XL>RK8?gRn&Ufu38n zS+yE>cj*mYZ!kE-81$nI5Gvd*tF=iuXsED!+TeUyXR7=Kdw4j@_@GvlYUz3)!(l6_ z0EpKrzRT<%kVyq?EwVa#RKHol;M`e}7#J~QxhC0yY`P@}3~$N6A$Bumu5*na-vENX zn@7E$dG)>$>xK#nJg5fa6!bEB;lO=`sI?HxJvFqmL~ry(%7oXgAtus-ve6@Di`DZL zm08uXb*!`=p6H9Ct4#+C*!6B04LrVN(>~`*U#7?TJe822y6#y-seElgE1{+3OgyL( z(z_E=z_AJq;9$)<&0V|a(1qlwlVV9fOtar~(dA|u2!6sO3>OAQTKch6StIZddew|w z+5h9|E2FCF+IHD=NN&2j8ziK=yE~+%1f)BpyQNDI=@5|aZl!C}-JNIoeB(X;*5C(w z%(dp6cU>_L@1~|IM7_ZA+2Z^DJ2a%UWk+yukUtc2qb6)x6;nAa0p1w{H$nORqqsl8 z8bei=oYU+|4Lac;I31>l|6u{}=8d?J=8Xm9+|LU##q94Bfv;+RoV#8_e3=-{LG{wi0{xK1;GMZNj^}7B@0^weFFB|SJ5wtY}6}%aY>!GzY@9W ziOGBmn1rlHbZ|rOPO|mOXbT7`VSh}`%?-BI7=%={ zI*NMhmutc$X9*%E?5+QBDRrYVhTM+ymeJPr6wb@`ivloXeC58s}(5Xx*^W;W<3`RL%owW+~jlu5+f(+ImwY$EqVYnn*fkvkDIIf zrXUr+&*!*D>)hN7UCKmU=6vylCgf>j#UW18>9uBlS|Un1(cfR<>3?gWdq146Hu|Ci zPLalNcF@N<9hR3ysYEWn$Bg&{|DvP)jA}Fn1E>0P4%tYc1M`}RH*4Ley7=&$$%m@% zP(zz0W9@wlrnFNw0O*p3kir9ia3puNh=c4Vz9RecJzgIWs3P;C6nb(&eRxvmfVvV%KiQRt>Goz{;2k2d*H?+VPTH)HqPt2?`;4L{$}%A}9@R zl=EsHgLfO23zApO{(+HFCV0r{Gy)@=8vsZl_5vs|ARF{QUTH-4Dn(J#)&`Z1vUnkQ z3$A6L5@`R>%=i5c-;U-Tg2ph6yS;5y=+mUUKiy9C!NWHG_C#Nf)Ia4dez_W)--O?Z z-&fV9j;+lHL8qTFg+nBwcLsOS``#2yeOmQO`RQfr}P=kXAQf`KC-S^FYSLVm6}r9 z_Rspi#`?O-%A#JQ_dYqW<+vY?jTxjI!lD@DJ)F-?Ll8e1sIu475IGult19weLN&e;~b_c zym+|n8n<^!s~%aYk}Vyg*f1nBM?*rScIdx&TR40wj#ZekEp98S)KFq3l_7K&dZLTp zrOWlj`PpF*4yL>OrU_+Vt)xj2`lQ$UA^u!X zv!%^4+7Phfg+E#PC3%I*uiosW?;Vvg&&I#_E~Ma>`6VU~v+{2b&lf&*^&lWwtl~oj zS0AZ2$}1(!pgHfX|Hg`*_zckY0h>`gQm<{V0|=ZKht8+Quqx?4HPm6yFERRUQ=Bm4 zjf|?g&cqG%#0L!9dUv+o_<3ZoueP>7eROosKhA!w?gQE6LW3i80P{p;{Oai5E1(xa zj)9C?hCk)ehPYCN7}Xmb$U_aKUC+U~rh@DTs%UCGpBly@zIzNvJFfXL7vfkE5U|Cq znC+RFLZ1iZWU8P9@htEY%1E&}IW}Q-gwhXH*&dVh3Ty@rkuW&dPlBM**|0)NCNxsP zsP-o`xpjsBQ)7QjWaKC{H8Y9)$fzm$RAfL@1z-;;h?DJHd|K~#|G~qK&Tn!^Hq3Z3 z%#5%Tg*@yjX?{KTSzYcKh5I7phx6DE3P05X^jP^I<;>wBMb4V0&l2R)=h-9zcV-ux zIG#^A@x=%PN(`^l3vOyl+CK-tLs&D9SQb&8E2|B%l(Un43{P`YuC6xRRG|{&a7g{JQ&KnX@SOBevRPe7(;C<_%|i{ z&W>HWqgdKvAT>(~@(!*eG?3;1E^ox^6_1zzbU(QqY57ExuMh7%MZ#JDedxReXFdQ{ z#OLtEU~Tcl0B&SZ{UY`$gKGeky(8JBgEBEAqsl_~y9P{d#(#5(1|=?q1Ni3QaHt(_ zqXthnW6ukRA4@IsKC~}}l{lY@EWN(#NB-1EViy_@C53lr_!_&$mr6CG27P6L^oJP@wF8o@frRq6!D!8H12|#)?q9dp@PqE z6Rh{ZWSQfpoZ}x!Ec?DK(iou;Rl%&&H~<47YDCrEgU-#Ll@UnxTj<3)^-3edvsegD z8uGF>ub#{r(;$Em=t74dFOTCh5`D&M;l*#R>?>eFe~j1v=HNHuD`g z>Ke@XcAYDf5`mH_$W7>U@&LCL64)8p(@w?J`gl{W^D`l_SSI{kH1^|Dz;O;jw&vf( zw*U`swq-qUyaZY)DK!l2Pgp*@(-|3S>(ow!=etUqSvFC&0ZQgEw9^qBw^5ilaInSn z?QAveN@uQbUK3+sqs=uAOQ(V|cU<+yE3OkS!XBqWcOH4-kgk=e5Gaz;0Iz#F!HY>e z;Nw1?(x&Rfi&ny_vUZ*QO@kbA5{-Nbp$ryhcos|KlhfcOdDO!y*go3;8E1ZWSyN0^q4TXJ{+C<-aT(A?m^1l6;#)GWXFi;^aJKR#_o^!>qw5)Krk`KU8$x?XB2teE1gv-wMfie*P7N&U#z8jwi$_=Sr-M;Js$OmiapP=vF+b-Fk`iw^}E-9 zTJR+@f%7{h)~;(GX{SCxZ@S{xY#NHFed{OSqTRa6YsJ~i3rH)g__zEiyg;lQGMk%C(=3%Xw!hN3{L0awQgnt8 zscIM;L`a$e^mdR$zbIjr{`rb)HRLQ_IQDLRy#%fIXco4Q-}=#F#d8Y>P-E<;TuF}# zc$bt??Ps1;9lKAA6){j#Spc)9+EDEJcJQ7srrg;Sn37-T8eCxHn@c*iwV-uAoS1M< z@{dT>(7$ufU5z;!wQp|hQ4>6W6b56OvP{3#t-O=-o)WfNxjVn#qGJ|ZK&d$k^irT@ z&j9d8d>NIaPXn-Zl7QoxdU`H@eaAb!4y~jeJw3w0{8dDi=(iQofHzsD*T0yeADLSr zu8S-DST7S9Up{nPt>+D<41+}ry#8&=NcQnp_Bi*)>1~uKY@w2+m=Bfb3kAM`X!Swu zP*-l`l9X!PJUm-rcsh_UJmW!w)$pwx7ps(`vl#`v%}tuUk3$KJs%WB)Ep(!#Xe#u< zzuiUjpD84xipjN3@1A?9reMPCd`6zCXB>n3tdqqv3Pw4$E?|Gzug2xAy!hBJH7K3D zlp?CR<^5RsRNkw7)qyT?t#5ep%WSd6WxoUzfQ@Og`6G<_B;E31GA=gDKlHlS`;jO* zz)PghQFT79!=K2zQAOpT-;+-=XdZ7l zbALS}vF-h|Ms6;}yrO!els+1H=D&BP>(B~AORaZ-P~-pzPyPE@xdlE zjEZ$!Lj8a$oyxCz!rnX5qh^c_Q{MBia#aoK7O56>b^ZC9(mH%)SJi$^!;C6HS{GsyZIn)oqWs{?Ezl-FsJ5 zxY10>R6+83=;d&tk3M2^k={tUn+>LmQ!X*=`(`uP7KDqOq!%T5_%YvgsB>P=Zh6;z z4fTF9h14Ksu&k`0gYf|cr0Yc|=gi={uSnQzLGM7SvyYWddZ?e)bJ^g;^I*2U5-dwI zUZ5(WSBMohXjDYEUzf3Bu&XI%xTvZ{elv7le2w2IjNWzK8KO+ z7*4Q4ORAny*%y7)qXw~`1n0(hFe52vRqMeBr1t{GPj>?Q`{&norzuWu({NYL^QBIJ z$ccteBTGQ@8SMUZqAcy_2ChJF6(|yz4evj9?I->UA<8J}ixIQsMl}SBPYpii4^OZ- zgoW8f@vmEY5QmEL$1MIxw}wNcH^YPm4r|?*dy5j7^yZ2({H|%Rt*4k=8XC<{CVv){ z?B~L#^iIJt4CU%Y8o4BSUOc(i4rDBeLL7-0D`?fQLk;{9RUNAu zk9f=$FHJVPf_mEt-Jb8Kbvv$^3O8gdExoFL?V#V~KzX5R&|LK9_`AXO%2F%LhUil4 z|H9|^)q~^>DDV7tJpVXUlH8A`t4{bDCeD@R`HFpgE{>mat#_} z$7E;)X~nP>$BCBD(k|b0mL@yTq0(4mBL!E>vsc45$F=}|pXv(mPM95^&W|%hyOGKy zkpDnnFDvvO+1aUSY0ko9yrBMMrmA@U{)q*$4Tw5ylYn#*L7VwDR>6fAeV#glDM;M# zSo3oI+=6h2uPT)ImUhH!d6eL1v7m?_Nq z(B6)7zHeYS8cDyk$eobAUjUtXt#154iC}>Bm>@~#+v;24uU~}HMFld;7vYaGftSx- zJ!-^`chLw4CE0iJvik2ns44lnwMaw+q-X~ke8xb8m+(A1&^h1#IJtS!#7oXE8fBdM zJ_+O1pQ8|(i{-mH3QSrUk>w$ujtd9lCS}EQ&m#jw@D-Ys9*nns4T0?dKym`7$OaF=7R<>Zpm*?LTg^uR710T ztH@Y$%gaKpHt+8*YFwCIblLx?a`V$@Z06|_lwyl!u92*_y!++S3R}_8pX4EH&;+k} z75~u+S!A4CT zUjhFrITn|F25YsxtF{9a2$_Sh;M%E-1r)A5zK}Ox$Hk3GNck5uBJEix0at`YDp80J zHPor&sU&kE{Xuz`WUAv~`0t9sZ**bT7tqu`gG-~(mvdt9y+Fn~R=q%iF~&stIWq}vHYnGeZj>QyaDLbhl(07c ziMq`q^}R_FkK^&>Fj^&`G0dEMhB_Jg-_|Jq|69Yt8>+mt`EEu5^}YJ0VoUoKPoFs% z+>};bnWk}50_CRx?McRvb~;foRD=LLgUP(S~2{8*u`ik*Gw!f_rYgXDV>H zCWN2fJs-r2gv}0<1`3(Y%}-A8cLVt|$&c&+h^{RjDrKDJ{l~Id#Kh zO&oY|Cy!s#qw5vhW$&%$()wmcG;{s#bRAHwlkY~K0A;*v<@#7ahs27i3gp5=X}L>>RmbB`&`v>@(4C!3E#kN`H_;(varle zgld*eU6z1k2-`RI3d2+PwWsf@LX59s{7@nbzfdknwTtHt+%ot-a{9luk|9-_Pq2L> znhi7mtj1h6j3;iu9)lPiFlEc_oPmn31HrD&X5;1^G&b>B{rv^u^SH{CmEs#81#?eF9#XHcPU8NydaumUZGL2OU%91M1`VVt!~oJIusTT z%=GtO0%ci4Lq#9_bjym1@QYGhw%p@$yxBjG-03Z@-?t8bvUOKB88SF7v@km7vF}schNy?*>;Z`b|p{TU>{-_wMw z94fvCz2nU?o8JSzyu2CNnJ1pq8&`TS6gNON8%(cLmh{S$we_x{WB+TPBWHwbPZ_6x z4+35yNNyh`jOu<=LS2s94J@-6AIJ?|XD=XiibZ2woWGantUhp-CFEJ&8?V$YdqGr`MWDWa78bp?b!5^B zE>$8%i4Fso;zg@5lCf$PF_55{~n$=Ri=!j(Ngo9jPJ1J}ERf3SP8G;J=ws07T zfN7K|^dKG{GKxGSGghW$RLE;4S1BFMGjft3PQr>grfg)4hNIA-t5P>p|Frx_vh2pE zFO{AlJ=Na$ggVCvePxNgH8#`y_dR<~{SlZF1%H#MXq(LcX#p3dyMW;PVnv#;LGrgM z6kR*o$z`|0UZ8qc3paP~i=OD8&Xeuv8~fAJl9br|b60>}yhQlihQZqnfuY;9Z?oa{ z!g!?!Y}rgT9kx`xNW`ruY`1RP_Rp7cubGfQeLOAXrifrMAX^coOvE7V0}7ko`@5sF z{HiKrqm9aqqm~Z!@+sTeA+v#YDn_$eo2Y&icCNfaUHj_jp??IJp@Ac`agx!sLEELX(CuKdCP15j1D&aY4`@oB3Ob$IC>gqzVn-X((pkz& zTB{=kjtE9=W^XA`*9s8#^B(Hg(qIz+CQ-jRE2eF_&dnswP1f(ZCxkp$zoJ!6M7^{m zA7da&Z*A@dnEb@6^-K~9n9)73TF;-&pRvLf&!4pq)vLC|%tsH;Y35R)t$jQ})veux zdp9^=MEJIg-4D;l*68^KwV9-}ZZuFc3sSWmM+~r) zuz*;a5EUcGTv@o0fo6Ynd>*m-Lw)j;9oh)|)=%ji$lk!b$$BX+l$IKQ19A;tXs5n9{bli;%Fmg zn4%dve9KzdYC^4&`rw=ZG)Z&M4z9qbEFnJZSUmK7=CM9|9<%NTYsglUQEY$oB#7pE z4~VgX5c=Cj?qpyMOXT*AbXRy*p_a|QM+(R*ciG@9 z#i5FofB7AJE@IhXPq3fzZeX6{>Dr{vbWQ#B$i&As?GW0}t~UPa4X5v`AUznL9Txsi zq<5FyYZ0kL?Xe%$%C$}C6slnVW3AUj$^x1Y#dR& zcYM=)DF`vJAY{1js$DKwa)?1Izv)CHALEH_`vA;vP`Zgf7;xzp_!_OAOuUvzOUT z*G$MAm7DNlhadXuV^itB6nV(FT7+S=Zb?a*#PQpMzi1%CtS!g9T_10FGsm(WV;aA; zFoi7iOmdR)Rs4C1ZMEjTub6Fr)JOF7Xv-NvbO50Pj|SY`2yvC3-xW8-2St#h#=1*lpc*#RSj&xZ0VUd9P%4%8osCnqJJ$7yo^*a~G8gw!iH)YiO5YM*| zBhQx`55PL%ZJ^+{_x(#y1+l(+D-M+m8dypUmsOBRgH|PQ+-g{UJ){zhbuD*av`I?R z9fA0CBV`^@*W{G`-90lFA1I|mmsvZOvmdMZIxsIh#j{0T&%y;mI|nxk(*NFlC(fRavzE<#~k5@GRxIDs{YTR z=gffMAN~+5{Ft0Kxx{V@SCBfTXf)p2ai$Ipg`ZB+&a5PB*Pme8s~=Wk6CzJN9D>u3 z!T7^vghoAjvJC?3>^P@@tNIL{6Yl2K397My2z{IzymP}W`X%yqepeNXY$2H! zqSiv0Xap&3j`B8&1qFL5kud(dXynfA697N#1Sv^h$2RLsX%@*+DxEc7sG<1RlhbXx zH&nzI0h~ZsRY!tSTs>@gv0e)=sC#Pp+934$L#=|?W{@-La4GridD9F40H&OUao>W2 z4*F1PzgP$3@pgT8{Y`Q2W%T-0;Ye%qQcDx*+FQZJ)`6gkx!z0>(i5oh!(|_-fSLrX zK@*6@N}5RRyWC+m3vOR!dldwtnPNT@berAQ)<58H1^9eS=wl@H7L$v5E*;2S%Vi(d zB9rtA&%Rc+<&E^y735&z*mKZ=#28ngnCLo_>-$FQ`b(SV4$%#B&xy58!;;fQm~(S4 zT^}?WoG`ztewnIG{%kffN>#0a>6ER)nn6U5&)r#dZ!}wFk4T;`($g)8I3Mw_-e;r_ z0jgg%khWz0B~k}%`({%|3I=TjKJJ%~pDy8~N}K>X2lHXxK2wbD@7bVyztFv!dbRAE_I9DuN8O;xdThAfMSi&E6{-DTeca-CmiRr1IMV-Hr;)zoNVd%BnQAH}4!mzITWY#n4= z4G@@>>E7`WS+rwz>l%7O4J5mr3F|Uk2Xx9l*Argj>l|ROwQui?R(c}ZFSU_O3N>M& zzwG4I%^$(wK+ExBK^;IUU81y5g8S=X{4$0;i%6Ta7A{KcbP7mQtdPsDeX#XUC^WU6 z_3FOm{Svy}R$h8vb-auKb43f3^Vy=N?A6JOe}KpB%zqAj51V+gy-RU(eYd2)2_yTy z1acDvdZ*^yQId1$Nh>f1y;V95CX@KXy80GnTVIzFJI+=7Xnrh@{yhFSy|8Vi{{bqx zkMEj>ynDkr+{6B%ePr zNmA9u_XN}B@ZbVUCjAkRMquoNm72Ok&*ss4;*NL<6Xrpgh^?g@(v1;Zz#bfwuyIyO z769cRfOsKEJatHZfSPdQy|ALZU&(VJ;B(;~fIXuWK5l_w+}1m4FaEqmlz7^*vjtAM zt8Q-x$G>dpJsN*Qq?_`OHoosge5Fa--^l0?>{uYCm@kW3DGJ8%m zmB_%xS5uTYsli~z&SX|G^HJ48e24U|=@d6LKo4rH{Gf%4Ry7Is{geDklq9&A)?_V+eXScfP_qQP;OFMhla5IKTs2fnj;;5x`@CKA3+$Zw1!QhUXY|*czOjSc7CIV-=4}) z;>u)>#fWW|SoTQ73Yr6S%m)2fjGj~-tRH>oFRhox08}9jR<3Bc zTvaUBoBDhjedmbkBGP!cH^#AV_~>hB`@n$Jv4}IifX8X?FNf9|>q#-liB61zjl=ta zc(O2{mfvic9WWi+$1JP*5xQs*s$8n@hH=H({Hd;qm_|itXHRm1VJ(=yy}TJ5u&G3< zQdvpT(;F|yl9jbQHFqlJ6OKSaO2+L?A{|Q>9XVTSx^j@5&x_y3(F-i?S|8Pp7&qpJ zb5F%yp|DU<+LOxkUEki-R?d5(i!L(KRGmtFh4q4DKL(V#ucPn7q|i`=b$0p$vwo2G ziz+iG(1lqbsT_@eU2pjNF2HGFD?VKBe)I;j>xC<5h9aRIN9TZjOUM#haf2FGS(jZN z>z9d7rT=}9pGi=R0F)PHVDJu?-kArd8 zYpVY>Cj-YjFo2>9f;3dQ2fIxj8K@@NgL&UB%>9R?yW7a8e=-r~i}*2xn95HDB>!#H zeYX#iAQX>Guq7Z(OXA)_EKc08>;NQBHM2fhTA{7q6lpWYsR^yvJIkj56U@rY2LA$r0@Wq3qV2~#zMb8g8Y*Jw>YUvyvv?AJ=-UQ5EQ`ZGkc0z!5 z{vamLhTcbkhGJ)=o%j}y@^Fo1j3%Ny_;R|6Q1cvqH=L#6_4em3{8}^Wn&AT|mwA3Y z5D$*-+q>o!%l^IcoHAxZ-4CA?<*^8puwF4_?M?|?`f>g>5-Ql_utX@vAa{YSR?sEl z0EtSymivqjJOmC>#GLY&)6*Fm?i*L9^vAK#OYZnMa@0b{I=Vm<2l-bMieLwo!nRkG zMOkZE!UtQ{ebGfDL)+1BPCqACVgFCHVe8zy)2|=rwol6lP;*7X?L)s1D;S zHnuj>TZ!=8B$YC=)6xw*?@^{HXp~DNg}iABMl3kHY{(%aP$6o0{?&MJtoyAJEpVvb z?f0$5)f!$Hb_KI`VR-mnDC(!Ym%>G~ZBt2{<`;bCwfL0N_~zH(Xe0_1%p2Jauz4z? zK#B9LseT1AqKarq=Ng#d7Q3Rdm5!H%R@1DUEWse?8tBu zBzKyQ^+G3x=(_zPM`<+T!?`2&W7m5n`I67NTYwNJ_;ZGTj~N9vR)Duk0NtpTrcOcm zFZlPpc4}Pqh>V}gRgI01JfsNh(GVKKzzE2nru<`AFJB36@U^UD;35wnk0TCVGO(P! z(Tc9;#1gF!g5P{89>(gKKC-Z!{FbCFz^CW>ql5X#IorJbMJXL+tEGW(tO5V?Sp;$n z=iwD8yl-%G`Fv%N@|Dcs;gf4rF#>L&cAqLoyzvVF-{~Rb0$8!%6A6O#jsr|>BfwP`WFkp-@N3a3gK3DAmmSKe9f7H zLI;Cp;k^f<uoifRd;N|8Xt<}wbCkbuJh_`wn7*P7Cj(Yzj=S}>fCm#&GVgD29^cm%)@I0Kl zfXkNW#fWq9^}zGyZ&NCj)NrklpbQ$&tz{1ik~i(jt3hD&%;g2+SHNOl#OG>`Y+oP@ zt<_t_Nr=00Sv=4p;U}wMQ18*Np-Z1@0>RVfwlLYLjl=qu+tBZZruizF7g6QAW{{O* z7%jQ>+XbvU_m})}GI%Yd-82$tYS(dmB>%4bTYwrP7!pSefx0X$R6yBr1d70 zX~wWOm(4$W9=TjKz`r+!izCp2g8&*qSRjZgtm>tU3U;PHhPx zX*T3`SDX7UZ(&I-L1pZ?IQF%h+xIqrA=b8-1$URC1D!-o>e4*2LSJ1jDW#N(cu+~G zA96W@ys)aAF-Ds)W|hH=jpk^6!4?f)IJHg~j?=r!10WeEp3QI=o zLZlZp!{Nt=!(;wgXFwIod^d)nkRG~elN>{Z8ko34%IE@l0?H7&WBNJHg7{F7L1?OK z5pl|%0)pr6?mhDdL6ch{>k0)u{+Nu4A_bzV+xsX85)ogiDDQ}ydcgUr#*8CozcS2z z>6_N-oBh&LH*0q%s?eP3hXnTSg!Z0bS5I*AR=EFMh%<0RoVsc4vFlMy$I)`~@b|?Mjhxh2 z)2Y-w7Th8|(ap6CN_FGvB^gV5?dT9w$vhS#kn(9)#=&(3li~{Uf$`m7Bfs@t`XmOI~&^^}d-L>V&G&hgwPJ7P&kY|dqex_n?X((UOxu5aXvQ*9jLfvO0Ko9EnVAf~dt5=bKQ~U|E*r_Wp9SWOgb)U4v*zow zO%F8-8ZG;;S{0WTtv) zx!UAYP0-NWm6q~~Hl(ZgI1~g{@YXNh*3!h&mdgWCDCnQ~)G0UhyiP3T&Ab<5xGyl) zaYZ~A75wHop_qSEtJh6S{z1)@ zNPDick;)Tco)VXs`xgBhl6RwweR!LIu?p(=U+*!gTT{x5CzsLe}>baPTe?)ALO{ zk)*{FH6iiN_?XB-XtPg<=F?^L#)(+)8X{4$^rIoIe26)RKWY#neZ&{25><*Y`!&m& zkt4mN>*cWb*ztc*)??E4*Q+qhCEgy^^B>m;&=Y{L4b?eUo1h`I%z^A%5YM-Dl7D!9x9Mdczw zEA1kO%E7aWEARuZ>ThmAuW7|>KHO-$Jf^5%O`TK}6;a19I?;zWK$%*#6`kcZq3qq* zKd6=mnHSQ4xmsV*H6d6^S{A=JK*bB5HnF$?rbmMPrrZ-LcLR=I5b9tp;a16uCGKTx zmpLT{?ZO>-z-7^B?JU3jv7 z9jcgUUNp^E4GeL%V!Zu>ssPsv0!FM-V5OhOar^Rh@VP%4dx<>xZ zPfXQcv;&5oaQ0jh=(@;)^NEmiv_tG#;UuzgDWF}L(4cE|iJ$J~hnY+aay;)L0sZL2 z6|>Ss98sg+r~V`h*=t1y(tPQ(NuoB~sM*NH+$k&OhVcW}iX4MHSF+R}h$_D<7tF5{ z%_>Z$wYRv3KSp34xZ0dl_znVai#Rsy$zY^+&d@Yp#K|^(Z60t17199<&3`p|S>v^S zOtDbEVyCthv{;k|=?`+5m8gsV0L(X2_r85ZYTH7A zfPS&ET)u_Mv9BS3P){I&K0NHqj847ofe#9E{fUKi5{o$Kn3yztP|j`&DJ?||J|MU~ z5Nzba?mzn`mUs?pz{I3O=Nof({$!V^*PcQBmcRuKouWd0)VYaO`nHgC&+lt-J zhj()%@2lIeRO2$LT%Z^sUB_^`3uid-6R_|wpbl|#c&1BX_8>~i{0W_;36`SJWM7-K zL?Gvmrs19+u6ss>`qe;Z+L^4v+mGcr4DOmg)W;}oj;7q?!uT$p8bqf=7(Ti71!Z?E z^Xs>7@*M?C(7lO>_;GYV)0fQ!8lJM2G6M$~n6d|{)0!4VbxvsZn;z0c-4Ly;>}Z-a|AoxJ3QTe3}-?qQSG zG_CE8V)Q%f4U}47BcRf{;U(D+rztM3VTN#s`j0i5UH!D{W^+YvL3Vz%p8))4)c=XJ z{LuY&myEQXDC*r!=`!ku3D1n1j6FckX7K$&=4`?b=acs`XKotv(>R@C!J-pklb%OBYNC75uZ>9bnI|bhiA$P<(db4 z#p?(tKuCVUX*>X#HUVP@hybe7@uhiQ?_axM0^*(4>Wq?E?+Yd_N);Pg**B6pRQ||e zomSLred83^T~hSpaI~VpI1EWrZ=!ksyZS?^qL;q+et|PyVctd+GLkUlu0t`j$?V^D zDN}h?{KtT#P51(R7}Z5*u%g;k9WXKWP#04@%DJl$$n>&!+M}+_zb>QSe((Adj|c`6 z7wXAI50%EPY1#R9k?ZrrPPFrCW4gp3z+x@VTpiyWruKzoAR;(k!(+y&QONvrivfZo zCi~GB@%y40lh$d#kAA4K26kwXnJ^ZTr_zD%znhsF+4yOF*3-{lf|CIl1wUzOR@V4v zHBTcg+5g1Mt8m*KaPe`XOM1XCco0G~&11Ihe7W48t~P8khcoH&QAh)zOBte_i06NQ zo7{VT1P&ljHu;`rbJX&s4PD$0U7xfx4$@$);H;GaV&gJ<2>?N{Y` zi>B%d=D}kHY#kff^Fur#cUj@F5Sz!28Y6tmFwyH#89w z?sXjBn@MJ(@`R9nsN6KvW`vD$5=oXLNOUfS$og%4JA2z$bkvP-Mem?*@28Qo&HMHs8L5+$u^@TIY(DA(_OaanTk4bEIo`GV!0$a? zFWxp7ulPV!qDL|HGwY}#W+(^vUR|)7u-i`}mFOL7x|u5;_pJPp@t_Rpf?mI20f~N* zUvNdu)jz;*$LCyo%$WJvfys2Sy?7nxp8*UA?Z`-W_8x zAk06f)-G5VInmPT{1Hd#%2`I^7M$F`A#|cRH)1|#&n>#s`$sASG~!ov=Cq7&6Az^o zr8b382;}Q;H$C?A>5HLIeEs(OpExl3pQ^>?j@IVJv!7?38$YTn&OG_b%V!%ahKr2A z0&#dB57Ys5jY8%$27ERXBzlS-%7=@~<=EGG_n5@qX(!6a_`60Gph?`>_;BvoicSQb z*x}y0Y>5GwV1|grds*iN9aXgw>-gJ8-sdn0;l8TMQCo69N$|}a$YhDcQ2z*C0e;04 znx9Fg^qPEh3MKi@l%jdf@JyYp3`eJS?o zMAx!`UH%HjkdjDa=6G7xKZSBGWtP(*A8luBk^U{CAQ*H;Y}=pJfkDX6rvHYTJT2kX zLR4?9(qEF!j2$L6#HBh~V4}CTvW&)nVCusjBXJ^(iK__d{=aoBQs>XxZLkxt7mlGd zEh1`=l^0sM3a{WL$O0UBDIow}>GeG5@uvND_|r)#Li(fYj9F(WJ=b0y{lr{4Vzm0M zkYshgcsQI0sWuw#j`%6TyZ1gLS4~D~#RxQ|Pnb{74|1b3AoGg-Z?Dl#^}6b& z$?Tl|_Zk_Yqj>W@PRHsKQ-ocfvVuWC*9sf%;%gx>nxU@i`M#p5DrSC-N$Fw& zF2j*yLkECM43veJSfdN$fY{;lC1z|$lW9)CaUSb_3hk4nj2XNb3+Kc@mWl8A4;Jjn zvqiuaBqk#o3eqrWRwY7&RZidOYoZvvvNVu?rz{7Uf4x)grgEfAq4dDk`P)dQU9m@4;+s{;I zogFfwX!dCR+&+x=kUInkfJA6~lR4?P_xJbjuWYo*!)8$Xw%O|YA&N3*!?Q84B0EBU z- zHF`>8vGNo2CJP(|rFih}$f^(2=lDN6`3b~HgCm^pojiu>EPC33Vimz2a2 zx3j+XkYd&`cm7>isIy)DJ>E-pzxDCeV||sIkyHhc(A)ewpW0O_2&aw`+(2bNVVp5b zEr)M6Wp*&dX}HC3t`R*?Qt3E?d?R#Wc$9^YV_WOws4(_VIACzfIA)cmVIfl>HwS z;j7BpXBb>oK9sG&_~3r?UF7ZuuI_MY$`^revKy*dDw>Gjd&mt*ngih>1({t?RQZY2 z3rgOai_G|1jtG%KSnC|vQ&H-~E-oq>uFHAC?te?y9c^rWj~$^JCo9s@7Wew3wpbzu z9(a53sVp#X($$->K^xTv1bBE?FV}6H;(wq7L~ME#_qg0UiB$Gv zaRG}lfcE7-W8wG@C;&t?EkyP&6`|4%Cciz)t7d&r3Tp)@dNXlBt;9YhbP+PkzPi(p z$&r=j6CBj#pXhMx5p31?8Z ze3$){S@Y;uh+`K0eK#*k*sq3T09Mju!zJBYGlL(ierSw=TZKv3xR+xp~D4Z$)qC_9(URJ zrl$)r`tpe{$zggfc)XaXH~+%|2+@e928N?o_h-6VZ~TLRju9lQsj1D)jz72p5zPdg zhlqeyRMi`9BiPLka_!1&1>m@0P&?0Dhi>?gUj;K(U&qTnI-Noj@g^!(Ioa8?ylLb; zC_k@y@J>b!f>A8^y}p%igsWc{b#bvoLUw*wg}6zykeF1slYmbxW-gRh{5s!N1c|-P z+gOf|j9BOX(18W?+*l*GLOqg@u-^lKpy(w*L4I0xPbB(Wf3gu!#)twHt~LqYg!}%| zj_uTtNQ$K*!bZ}*lP!pybu@`LF{Lx071aK1~J0QvNLc`t|E5dHCL|F6J`e zcJHT1-{R<>d!f)|3CEqVXiA$nQ?51eFz1J{)X#`zP)&b0l55H%{aMTJz>^c zBk?TVJLyJH;l1$4VA`MrgI7Ru*g}xuBY-*_@5sl1)!?XNq^fF>W` zo(TvY`2+80!pC9Bx|b=)<5`~9u8e#C*65R0?eP0Acs<)e^prXfTJroT>>KAB_Q1$gLES)AgzKlNOy-IA=2F~NH^b&zvut1 zkL6;9wS>9PIs5E=?Yg$>D+C9DuQ?#Fs;ZD8Xgg-YbmZ?mmZ>XOdx>lI7xG z7YIGwzwnFraWP^W2LY4e$^C)kJt0`}kaJno0zyd*H}t1(A*7ji|1H3pa~t3bW}6Sh zi|Sc7=5#fFXl*?7-#l3&1-!U>7w{00v5GiIgTl3__@)ZCEFw6&}= zK#*2oBy?>BkX0N2-K--$ddYcIIfUSG6~(yB?CpqmebFTBG0KfnG;8*9YRUXroMk|v zd5`2zs|beA0^;Iq=)xAt?xG-%zLUx=gJ#G!PmIic!7yr8U3VsFk*dj;;@9WVKeih_I6bZ zy9_%le+qK^v3e`pdF1Q)wHcW6VG_@@SUG`Hsyz9SR41ZA6MtV9a{?S85fnxze}O&M z=vF@7s9~^Q#xf%Q_L>aqQ-I`gxKd6M(D|tSV{*&S5`s)0e|38DamtA3>h<>bdqJ1s z)Q!spgzN0E>hHh$mY@qhcY34&+RVYEY{=nL?4_sR{4pwKq<~GHx@DlYL@LC%b%u4Q zQo@5XLJALcwz(4@pgJeApcY{Upf55FT<{^Z(H6)Ihw&x%MeBiKs>5wkYKAqd5vdMW zix>XKud+ER7@x&pq8bZJ8=Cd(siZk=9wJXCCJ-NM7uHA?cTCyLAAe!Tpihs+1p>M~ zw;{`ECz_fM`<5L^pv!u~dQB$VRCNr$AKs}Ho~cm5#m9(IWGKk!Fshe81eabl9oh)A zihPm~nbB;9BqOUG?SBvJeeo9=#?X4?8y2ujV`n&Mvxt*dBC2~<@9;X%DC>0 z+>t6SmhV`|mg#xPyF39{-7S7jhB7nCuT|_d#{!jgR3+M(7`}&;W!yBlKN_P+8<1F2 z*M60Ei7FmFP>z{2h8F?lv-K6f{=woves|_@UnP{LH2jJducnGM13cREx@$aol2tK@8e+4(m-7E1>gM=_~bIo`hnE(&!-(nA@b1zymu~x zG{DetvhdzV7&k`xUK~%FwPP6O^#Y9D13gxNmrt| z@$H@hRQ>+d)vdF9g1y+?=~(LFyJi~?+Us|M8YC*2#7%IY?ymDtxO4;Qc!5eUgMAyy zn*t>%H#cNpFpopy@`yzs0*0zg{~EyJ-#MTTjPC_}AQpkF9v#rgD1Kqt?z3xg&7Hq3UT@tB*OI9{g}%x(x#u6hmQ!S$dfyQ-T_Be2x%K8(=YrSmBuL* zkQsvapa?(vDBP}jzLl$jsqk${dt|B#uR(W!RLgHc5?l1|YApGUeWVNxjk%8J9ohjS z+aIRGo&<(`$kBk97NUh|=lQqJLyIQOlcp)lXag>vwcceW=DSEa!n36Yh@(8EaPx^$ zP7d_aq9Nzf%kdH1Nl<07UVQ|~&1qx)`Bv$9d~BuGiWF}Rp7|whwA(%X5P@vO37R|_jlJlaEPg4o;r!*2+G-jC}M`w(1B+`i4uy!ow1j1Y8UTetW` z3+QUz8K+-MP#k^?j&WK4b`&5}hkno#Lz7xVtA=)Vl2-5#yc7V!@M2dd+DcRzP$h3R zeG3|(giU>Vh|_B3gd@YZX)j9Zc{T^)?q=_3(T9@O(EIA==;Vb5nVqd|ZXvSncXP3L zb^ih_K1~mV%gKdO2IKR#NYU*JnrFr}bF`w`-&E`ucTQ@)QK}asx6Lbk@Bzx#fDmaW z(5UEV*{28iO7XIgot~#Lo~(SY6N*Z_rBtF`8lo?EMyoClRgj1+ZHyWEkwkXBmxnd) z0%e_N8boHlKL6z;elmLe%Erj?+$MwG2nL|d^p=;jZ?A%xh3|Gh@&nOysx9cYX~CEr z^%AAm{p)Ftx?4Os+5}h_&2*&;c9!;ENS6QRgyS0*JwNWW5(r$S&MGF)Gd1D`g8{)q z|KVpvkLpCU%3bCmsWAUI$ge%2 zqWeL%0I1xpu;&q{W^3&;j+Rq;_k%@B8@qRL(q>%T!D0sssZ5t|z3(ci0NC|SR!v;w zYx$e6sK!kwzapPCo%x)#UMuUQ#5D}KSUH$H>CFcYVN@8XnmCUo3P=YK2n1I(3|#QF zLLZW1dUd>Uc@^jHmWTPWT0_|5>83;{yROkVtx z&7YklJOw!=L&&8mE=Ze$=Clx?mjV}S{u!)`=qj$9jRJK_YK~X;D<7D$hz-?&&MkTa0`j4kcYHeY^ns>AZRT8HgU3rmX8_WN`Xk8aie>l<`umv28I?Vfh~ZFI6;hxLG1%w=wg$}pEUdEb3;vjAf^@qtVvFk|92+fuEBkdpN4-KS91i1 zpNcLcDqZO(AlWb-2e1xJl$FSfM?X_a`8r!(YP(T7~mbFW>3#KSgJxemxvp zXAWqj5vV%#G8gzr>aac6f=wa{Pfj1(7#Crk%wTMxu{;z!=e0;mQN{ta)x_wHC6Bn; z`q}fSxZfUozNQU^N?>99!5GVOkQ`?H`#D<10f+4#N9aAS6h4}xl;a4=F+&=>78c)Y z`P+J>>Z4R;oOKh4P)zq$hb>r4Ufh);S}L!wxVR6fiLNwR(*&B>ngkqkuma)R=J~~< zLrEirUA{bBD#;@!e!8&---^0FF?BOj+lI-|w0uphj?=I)UiUMq_Pmu-Mif{dv{|u^uZznaI$6qFLx_y@Lp-J&23TW% zYfL+6U2PU&%sp{MoP4pqN`dsbhQ9RtL$PI?k<-?K2PzS(HvA!r zok}@}fKRqBEWDTi=tL3Re%~VRs-PbZBfn63FAJA zuu}b!sn9Guv-JBR>niJT+}Ung{UNP^XaLLg^~p2dU)cI6&9^g0TG(t|+%^3k5?Ik? zoq;DjZWJN^(%ZriUy~hjj{6tDp*)!)iIDdtHb&$XKqo`YG3u`WDf{-{YEFd2vIqnH`@=1>;B2$D^hx>IgE*&N5qWDc6w)t6m)a5-5{Uy072 zWY{AMJb?)`K(y693Jsu3VJ@+lR`RwITryIQLqfl>v$7)0^52_s=tyA`uJE}4U*7uD zR;8k99ANfeSlrcZe?u=UJdt225m%3vhBQBupS7D*SaO}1UKDj+4-Y@I;Ap!i4fA=F zxC-bc^&9Pb5g}kHf>cyUYG1zO(c?t3!;rG$17|?<22YZ`u+*dc(=a;8hLW0w=mU?P z`M~oklh`!T@V$^iRFowVJ8LN3Blq)W6}WXy6}c`;Y{s#GK;c z(^8Be+IyYTMxttqgP_dJS2qoXvSV|f82SOljr|DZBvt>ZJroqM261S$Z3pDwp=9>- z8|^wNcu3_iuzv{x&$z!cU*QK<5C}$CqUDbvzK;kYX&L#U5wZ!P@=iRZX8kA`xxaxn=bR$&{YYWG|doQg&LL`2TIa$zug=&MS*NX5+l5 zfh2ks{9nNaK`>(dg+|Q2GH%Vw(?2`hj~k~tXB)?&07c67#XC3@mQcD z;FJ5T_K>&-)^LXSg?7#IeoVJ06SNQp(}2$qA5hFduIF*WNud49 zEOB6Q3^=Mpuv~Fg{d(0V|FcQyG4s{L%FoTjhWt{pcYFxv=DCz+-ejFYJRGx=nv1*6rg_#kDyKya(`gh20H>?P4?eq1`nIXkQ7M+LPo? z+kv~=`bu+B=U13i*`(Z`Pa1F$p6SN*;z4qt0}i7KHl-+cNL#TVkB)ho7SGWpR8vCy zW-uz+ELIMHq!}X$#J7VPh2@CsF&z5rkyF>s}-+4J41;k4@RI4ADW+z#Fzk(I;*~v zpyn`+mTqT#v-t;w2aNu=CgX|3ZLyoK@vl8?lOI(bzzlcjdw^tUwSNqy`D#}rxtkkW@>`X0Z-4D6#L&v` zPi9HyJ8C_e@KC^Y2w53^M6L0tkRo4%E|LB@=ju4ksIMXlyK&C zMKP7l4$TIN_sw^w-sB~k7}nNBjzEZIH7{zoOUH5;6!PRdzp*UN0|r}EpLDn z8iM9x1~l3HhQ3Ik?eyCT6L~27!I7O^<@1}->wdDt3!9_unD7yL$6&I-ph4k1s|z7F zMJ(sPx&?%&nl=aA9SppzndPmY9=Uc=L_?{@Uo0tzOU# z@F6+N(97Q1W%}iRWgLo-qEXD41$&Px-(NpLWk{SHG?Ypf%0MEpj{?!~LXG0)YlU(C zSa`0a4M3SMr<5*&WjUM~I9{NH^U%vbJHsm@kcHqNleVFXrgwm?XnzW6->2SOL_q`N z-4A(_7m-`M-bg*ZBXLtGEqYm%h`fl2cOOgkuKk8`zq9Gkz9W|0r_y8T`R^(I2u|Z` zA8g&Pph82IQ)8EVISQD0D9EyGg#fII>%ebCRm%8%`$33Xpz3W#O4m;KbyQkxJ=NMT5eimZ+>3+*UBv{_>xNvS|~+Ko=$Fr4Qi3);6aO$j z02743YQ*uR;9HIIDe;SiLw~2Ps<(r&$rW1Vlsd4X%AR^30LL850Lq~`cQf$u-Vg;2 zN$XvEe8A@9MeXy1H=@UjqZzw4GQ#d&p&@S~`?W@E(5|V9waX{=uF?Qy&RbbLq%^Wm zLdMJyFUu{<+gYc>TY-@Bqz8)XAzC|WY~=d2=yBaZ=jA*yKBEjI0SX}PadUX-VCZw@ zD4cswr^Nspx1vS!gy3hH;-S*0%|36TS?fE`ZC~oNf4{ zmk=SVfTAag&_3S>hIqXPn5wJ6iw`)fM)|2l&;nqp5s+@BGgj8RDg~N*`FBi4-|5^A zc6I=%A7H{(@5N$Yk%mp>yA$`{6XepeVW>dUYJ^m|jo^_t6^8qO8PN|U1G)zz3q#9m z9}EOPCdxvUmAW2k_2tCL8)v!iM8*`Qy^=u8DxL`9`zC{ENCfsz!g82F&Q-aXy3?t& zR0i0_Xo%zJ_ms`cBXwhu<|0K;0ALw2P9NLzt{|poU4E@+4`{~89p8a_K^x98K^o9= zX;XkiQ3`PP-bc{hK+ZE69Rx>VR=jwhEb{w->FvA`M@HyKo0A@p&NU9gK7bOx!evU# zcBvH=P}2B^dwUtUPeQL3y?zYFJm=PD>`|>eE4*306`Fsm=I#i3a4X!K;Qo& z;MfY=7!dqx$Blh2!zH zi_if;i-Z11AvBc9gE_&QTv*5$G;R_W+w8^|8mE^HQ#FJiLq4N-+`AgW%LwKflA6ar z&*3Yr3a#Qr$9nI0qI?79uVoOC?%iu>o+5_T)wNLyt&d1d*k-XSrBpbWhzc!eULm%9 z01C%@U_4xM&y=|i({u1FqWe{q+S8UGEan-O2A9WQ7EVpz6F(HeXY_*L8JGT&@GyiN z$AO<987pz143JAk;IFDh(|H%hx66vlQ|eK4X5#wvZn?~2HiO6kCN+B zA7Fas{EUh9{ASAq)vX^%2_?I_Q zm)d_MJ9KSfhj&uYVx3nMIkauIlM;!7-C}zgsrdI0Mpjg9#32C;Q328p;s9^WV<8Lx zSyBR>JpjA$L;!*!s-I{o=Z_pu2sjd_?^VfEv>lTuY}bv>YiuG9bM%+Xrs<)?(%-3hVUV2 zJN$ZgSldvor>m#u7i3r96#(cPW5@#Ta>nc**x#kcx|eEbED@?xytfM$LJu5aSUfKL zYD-Q`1#6Zj$3a*|5X46Ky&p~B?J@Kd-#gacIMNVY8td1>pLIP^oUI%WXRbS6SEJHc zVFs_DN#n#YbUg29+3MFLzy_mV@$ObTreji1WzSi^Unu0rLc@wr8$|*$FTY+IW$kVi z^}#mYiuIeW^{eZ@B6}ys?jri$JLka6kQ5xEOOl)QUTT$ScU;k59s%W)IkbS;(thlHzJJ(nK}#a*^V__Vwjei{xCpsH z@dS%VL6W2*2wpDaNy*bRnaup!|K3v7Y*s3IKJ+Jpf6)s&Ce82J;UAH~fuk4R|EmS4 zvaC*FE4Lj?vE!o~%rnU1|RJ3@+a~y5(uFFbf%2O5@`V*gH#(P=#8HjUi=75+xSQf$qt1kNMX<(WYJ^rn9-wfGtC&$VPmT7F@3v0t2xyk_e0#K#nYPrKq-NkKkE zy)Z5R{*x9CJSZ{l(Uix5^TY1wm|mpx>4wMyk*_f?=A{sCD0>v5HTyFHLtabtquQ{Rz0TDA^!-}j_wz*p5JwapKQ$PykOrdvd-Anq z6%()+Et&Qz$Z7e`ANx!)k22BJk%x5D2MUlLIJ}sXl9rPLVv0=rK3f|M$l%#@>)kUp zSlRZ0jEV};?5wVykC>%#|G3oAxK-h~=y`;>A3jEs8=d zOe_nM^~S3dw~J%IZsByd?tc;3X=LX{Z=(pIt#E`gg4oFvQ=}lYs%Fq=jBxciB@{pS z!Az^@{peuOUf=hbhwY9Ba~$l7UfsT3O;T_K8Y5&m(_txOp=l|S)I&c?qu9GfI!7(m z9e1539TDyygg@?S=P6-{#_ml37St>XLfl%Ll?Ay+oK4N-u|2G^hqNiQ(6HaP9_DJF z0?meAA~*X{(*er`mt%31T`c9FesMiqQUwA?!~@Z07b%>b@gt7x+)tb`>06Ro0+m$v zTd$EDc??j7bUX;{Hx{^z&$^&o`wbpdARYDS($b;tw+F=m9%4Tu+}$;hzgPuiUC<@s zI)?(ArV^5oo?zwRAZaN}I$5e$niw{J{gu4_Z|`1({Q~o6wO41;r^WV(=HREej@(+K zm0%7fb1I#n9X#I&E1h-?9Gp}mr;`J_cM=YY3QZ4@mwl|uW2(~g!d}O$SzhPJB4_I+ z%}1+TpG4d=8BXI1w4srl^>Wy~#|E?&8rmh=4}Rmw_g}v=+-Gw5u3)_J^Yb&j0-|;g zD!Z@173e;38h}V?t3&jM*nzQF%D{nOKs!AGW8NC;x|L_h{9!}TK$aIkn$p!_QIWda z>&zwj=IDkERj7Kkw(VbIY$~0)bW4^hWH5qkrb>SQ>B4&xAEyYFI!a{i=z24A{01*n z6}HZ(qX414r88p}8kf)9&!@?hQsliqY0y`Q08|moQmX!M43}hfFy}+0<3206#Q5go={3Vj9}r zse(v-U%GfJ@eQdPBnLWZd*bN>qDw)%24@XHlRL7@s%f72ibo)C zH-k(f8WR!-nT{o4sxQ_43Hk_Yxw)_6M07WvQ%ga z0`s0!cYiY~B)k5)%v#0lt)fET!RLu3y1yK$gKJk?M!g*jSsf$(=LA{4yD)bB`fw%s zVxCLFC~3J`BQd#UbTonT6m5{9}Sx2NAl!f4tSz^2)a#5(~?mS z-kL-{%pLX5NlR{t(hyYzv1gy2w`reAN-*0hxh&P^6!-6{&cbD z)pYUo+0YEeY>ig1_`qt$&rPepT8W~-FnO$um{~*Ogyps1wdG=_sjFUd|8>=XfVSBt zk3&+WSBj7vBSNI&vg8sRG(b79a)a5`h)6i27yw;O4p}K_uVrzRhuJQnGva~+$lE8| z$)~f7pQRGGgf+T98%fvX1jcv&=a}QMqapSxt);QOeVRtc-*|sjled$ew!*H2 z67U<#<4{X1Ys<{Pk0PLWW=F;9=p!Aj(r0F67n#q(79o~CN)Xp!*B-qPB7vKxB!l4- z6x3DEDG=0oZ!Ugivs;`T44J|d~5m3TUz)>N~{(u1Qtz+Q*XH(%G?jqt&Y`BTkM&Gh{ z;eYBtXD>lhkZ{xho~<`LTpL$4lPD6H6I#I$+N@s}-a9nzcmpk1?(^<@G1?7PL~Nz+ zy3M!_6!sgBZCT4t0sHBWA;!-a@~NKeT8!AaBoxKtsk#P4y#B`+iJw-@m&z)((nP-( zza*uaC317JS6hX}xFWt=4zCR`VB1VBN{)!c5g7`6UGOFuFaIDTGf~a!c&A}Wb{SXA z-}JD>)^fn{N8DduKj7@s&*5tuo%?qt@zll>r!*`QfH~@h*24`H`g^tj=^)Zta<(-M7|1wjZC7@SDhEQBMXQ&sX^K z0%S+Qq-9Hydu4NxYbBlvNEF=MDnC52;PS@=E#GRF9%9k%K};BOvgOMMA;6x(iK0~RETn*-8T zX&I;mL~|$#A%Fi|7+GHYR8Lq&N!55J*&Jxb-0isczj#-@Xoxt$ZNH&|pQYf1Y@?18 zpX?&rH^)N(s4zCZ5RuH{<2n!bN}dk1ne2B-_D?>PVlAx5hhO_BfJ~UBsjrh4~bgZ>-}HxJT=;%99$y_n+5%UHpDso$r3@I6*}KBb}s_ zEOqZEjKjYF0JJ}b3Ibyy#PSE;qi_bp1#nyiHjRRFESq9zO}9O5z>96*-v)>_2s|2M z9OLRAq|WmpJpcQ50|u;_MmzjkyM;nCSfs%8r!Ng!o73XY1?4r_TYqi~=D5rGka9|y=^wTo1 zSxMV?h;7a%FnKJ|Ci}LX{?Gd>6_)U3sSqj2fr`UZ3d) zbn$ABvB*oM?Rhjr7coK9Q$aYMnK`(U{|dCULpJf*jCKtYnF zh~Rolb=~Pz``*Zcv=0T5ZJz+bjhk`$2>_a|a0^FBhHr@-ZGaz87*sos%UN%wVZoaY ze+jEymAV!Tf|pPM+#zIzJiUxm^do~q(?5YtyW|1zP)BEHqbE}=PS4%V4rY_5D@-u? zY_+3eNGFXCW;NW_*jYP6%~1#+Pfme-<#Na?6!)DdMku=5I4!U&z{8qEJ(L-_pyqJD7EOj~DXU zr@iIeN%e7~#>5`{AY!t(^sZ!yh9p+d&n^Y@Jcna$EaL-A(Bwy`-107(DyZ2zlr<1A zM(#oc*1h z?jntrYozT>PypRrE-|(CAdSu1g<*^;IUT(oVof7C(VF1K* zAyv71bTVnQtkqzL{xg2UdOjcihTN@~(;7JiMNfY}aj2|})8AD_6jY8~0smtWm-A+S z@@LOFy1UKqJh=6=6`}iHs$T>@_;P6amG_WsWiZK#Iv%j;`FkHNzdXpd$3W1Bx@ga1 zEcJi6)KZiTcB2DiR1T0)q6GTEN7qCT@;WW>pqE}_&JDTn!s{piN!11vE@V0%aYn}L z`NLy#zIZ{$ic7n$>+2>dVN`=IbiUrCG?u*n-MA1i%7J2Us`M9OP=u63AJ&TzPZ6vs zx0T=UUiGV&k#x%;0A8WYmZ?>Z#FTqpu^DD(jwE#%C0`;wHK7^MVtSRTJSjCvUpdS| z7}dXZ(!a59soZzybFfbGNx%t@LAg0}t>h)Q^0wnjj{uL6c7*c5u&2MqVp9nPphYJhwWymxC;A5vnmSJ)Obg$R&-t+B zqPO)Vld>GukrEMyR6m9XE^d%7Aw?TffJ?P&v!dW$tp5Gw6Y-RhFffC!tSg0Wuk!5) z3LB37d_AFoL8e@R4NZ#i*u@7Tj{#qBfh;|jKw5`+N(A=qUxw#sVvTxg+H+YlZ$v_a z_kJsth*utyl95f8HB%pv3$sfs6$|*Uey+Vvoc6!+1&2uF-s&=1`2}O+6>36OGV+df zP)fUBPXdJ+#o}pZnMl7?gmr&q&oxq?opzY@$#kt6UDDgt@TH#t$3_*nK@SHzHuxa= z9x)3VG<2zN? z)aB*3U>+QlUNe<-tWwXEDL@x19g*Y6JXCBOeq=u%={C&@gsDK5{!E(1=R<oYNb z{wT8%@bMRXQ09H7DB%^^W6Yc^!JUTCCS#wX(PA_e$pD;<{4_Fp7i2c5!iy^*zoChW z^iK>5y*BdOW2}|;YG@@^^0{A_VuPD}%@kRWt7b}SCo|H2BpDVIaET^&tp9!?Bdf5w zbafIW;NdT4xhLxJ2Qr*V`rFiqzH4a0?V8l~)IviDHKItA zz-DC)a&1^B_sy=$Q?nc1Ye&-?z*uflt0v+%H9YHSO9Y|Cx0~XI_rq9O6rA+NDsPk2 zI&RK05f5naJF?|+2u@rfej&#=kOiZ6y_I-8rg-2jAQZMUU&)`X5YtenOEmYIk^~OV-rJoKXjUp{9Co zC_({bKc%=yWYrSFY4NW$N*;dwWU_l+pI4`+_au^v@qKPR_MUCGK|)OZt3H~fD#DZJ zm0+GLYI%e1i{7?eUukQKsG2h_Z*9HQ&46Tbu_@~&u(KKaKX&Z&6>&U0Z z^9J)y)YRGaE3whh*0|;CoqEn|q5&pyQU0c5{Cq-R*&eE9^moz*pQmChTDl0iQyO?} zO>E59`@@1qB=gaCRegl68nV9D_KAC)G=2w&OtFz`M3x~p0Ab=rqnTlO2cJ`xEI7(Wj1hhng2ll#eY5cRi=q3lB z59kT0FD-p~V8?b{Q&U4yS_-^=kGL?#fo_S>IMZh}d4aMZmKqX* zN{+)T;=y%JA-0hc|EF3e5v280*i5ovSe{+^zOkHn`QiFeNA(GztP0X)pY8BQI7nQ^ zvY2}=ZB*z0BL-Jmy)}5wQF(SsE2y+w#v(5;^k&|zfWClJj0?GPHv`rZ8>eFI>x*Z$ zhA(7c#AI(Y5TeC>1?T`;ReGGKNRC4qyJPCy_h)Pe0Ik(D<{k%7FF~b)7$gY@YH`cM z!GFIIldCP41_eA(IjTtbgwpb~=s&?YfR;RI_hx^_^_PIi_`n~}cJKDO%wRZM^z69B ze{60Ie26-V=Zw1PRX;1-+PYV#pJJ({q#;EvPycITCh$)dR;Kyq@5SVq9_JU9F$}WqbM3RI{#Ri(Qt< z?$P>JAJtW{#Y~0^1a!)wa}g4)N%H)O$)CyaiOEU2 zj`}|i*V<$eg~@Wh5GX0VqkS0`?iXcF;@#7R|3?m@q1^6%mFyCMT3DiXspCTJ{@}-N z|BTUghFgS_^9W_4`8|f?m9LayJM*EJW*p$h>!7jjt=sA74F~;`F%j4_q5sR2#wmv4 z8v@5V8hgg%_pcRumxasQTCcvPa?Eq-Fy8urnn12llHgPh>N}Cy;a7X1h*IvKZg+Jr z3U+PUfX`0KUxOG%k}w`BIw5WN;9hh)tLlf*fg|eiJ=|;eXz5n1=X1Xk)#bM2pXy%g zE2!bQb4?a&kS}2pXALjUPrn$BQ9+iM*c_0vC%A0Yt|7Qn%u8pqPH&oq{;;9C9Ppv3 zpSjay`jgE}@^qNIN;TFl!rL45#zih5$#kPP?ERsl()e3NQ(Ec*?YmNIMYFdy&&a=h z)>J$bfVqW)2bg|gAaSoj@C%hKIBiUr|4u%X?k6Q})n;ZGQ7*)t< zw(`s4gbY0Y3BZJ|tr*?nN=U@kigfo~ljpGkSN#vi1Gz0e7rSjU{Cb$xX)fF|wr%y$ z!P;nW{|9LZAe-NDKH7lco{v%rhY$v)*|&2$9R&FOoH_iNLg)GD$zeQ<5P36jU(In# zA8Ls#W3{L5w?~nFiWHTFq{`+L^|TJ!NSta?!{moLq^K#n$(6P*u1Vr(?nAX^YO7xr zF-3e;Pjr``JUsiJR5KmZx7@^4D24aaATxaLkd{4H&sh*FAyr>(MZsEMeqp@Uv`X$N zSe0~dhZN@UVh%s|=VfL3Rr;`tiIl_~WEAgDwaxrn=kIkaQ#rnpT^BV}#J>&nME9IU zRn#Z7sUU`%xfV-9;T~U5P$sz1ctx9vo)_bS zGiaS6U_m6upZb*(cZ3+|)C5b|+EVG?u_Q~0&|1CRZCUm>jVYGfZQopjhPBd%FC0AfC zq^$TwO;a^i>$hn(41wQ8^D!%3W)kKwLr)9IeGToA;*J1l zQnjg3_~}Q~K1rDA6!u6vIk+!W&GD=^C8%mCd*`k#BIg;(ho7toS(pGs)@Frh+NM`6MDu>ru(R6x6!}dL1Np(@{YQi;8YBK{ zg`WINX(aX**Ni?jK#yk%22 z{6WBH1M*=6AkxaI84KV@q#1A&p5?_^(pTQy-3?Pd{55hjYUaE=ml(ULN1aDDuHk)& z)pxYo;63IOjY-_?h%nre1x5AAnivhRn-@@L>j|C~0l(vEhC|E^#591n+Ex$~E#oV|f-L)9c?9sEkN!Oo-+DUH=X==%t_H>L zr@tl)s0Qh8$C`Nkr|W?47}8Yxo22Yo_gQgFXRg28C_E2qlOK#6Tu!EmCZCKb|^C)G@>!zudmVVTfvCZB98{^y)Z}^T#d?aY1^UF z)C29L8kxhGH)4(b2L}K|00g9y60=b$u&7UCE^0sDpBNNt-rr5dQ3&nawAyTnD16KN z7B~R1ErBGf(bN8Tua$rd_z>}M8r)@xst?{7c8{*HGbB|%@PcXC9(CHFdUdW))aP6P z_5LsXP`%dk#5MP5kmAT4MEZW9>RY)}?uww#fKNOs?f=_hCCKLH+v%sCN=#(dujpH+ z=Vnj04TNhmZ%>d=x!voN9821ce*PX55#xVUV_>|GAt0heGKzmomV;8Sf+B4k1lwx_ zZHYKDr#UYo6&g5a$^>0JgwAS3tBpwL!OLGz&PV;|MTZ4|mG zn%(@imRj~E^<*y=0|E?VEu#EiFXAhKs;K-rB_2UjjuHYx0So2di9#Xtf3oXKhc@w8 z!}#X@G;L9AwTaxG`b71tQh*M@qnK1C8gX0u(%USAKrHM3ecb*LoizL{!7amVLPYtZ z&(F!WhtrV&W2=kBmRey4!IiKLblWNr3pxVh7XxeX)n;^4xenpbzX;LX&(uLOQD( za9c?_X*Ayy(3ZqcL!gkzjbNx!IbBVeAF3%_yVWyy0^eY+=HxD_gqz__J?1`PLX6UmPHDa*sQ7CXav^`<=7s z0hS*~k`8ri75T|??t7D}`Vt{Lkm`})ij3^WF*OMjbb*buaBu~CQ*sR8%-2I8UhvE} z=y6|7BMxupJmzm>Cd6heRQ^{BFjuE?yGePU+kMM|;gw1Q`gMGWzU@NvPk@3z$Z#y& z$G3$Li0zndeUwu^>WX-^i>JRb;EGeDn_a7SBdhF!d#o<1-B?>ONQ zOgPo2ZOKil<4o;)Or*=yP4n^WyD5+RPV9ga$_Gx%P1cu6=JKI3#jPmBw6@g1ZE?d} z&Z`u<38?`d+zJQ6!;MTSLfkc+nLt-htPO=sC)rv*Gt3+$Sla8j!a?vOX`3v`*Qutt zG%9u45v8N#4p=;1y8jFiFxtJNoOp;wYBZ5ao=~-1s68&Rayr|!V4TC(djAd0-S$+( zC~K5BAWZXu|6TM=Nd#os*UCxn-|-qlc%blhrRcYv`dPFNUA5~r^%Z5H2R7+K52X7R zkkI=l9h<{V-_q{Vwl0zXa1hG=pCDr@w4aMqe7|EJn9j{P7v>WAJ(G4hU@3Nz_U#eP z9Z26|Fo@cy`rGpTGnB$$cC6GE4DEkX$=Gv;(bJvAw9gdcUhSp~abW6v(10(X6iy(r z(J#5MNKo?Q@yyN`-F+?%zm1}_^c_; zZ+#LT*gyv>pxXx-;NYWU9Vf+q3si%2Ky{m@!u1>hjc~Iq8CQ!L8*7&?@fVn_$$=Zjc#|QbN^;g8RWUc2fBdl zb|Ko3;WicEk%Ooy1J?f>KLqqy44ev5^kg~Ph5XD)LU2im;S=Q(Wz4Kv=@x|(LiB(b zKJ#fqU@NU@+oer;&(ZgQPZ?E(DwU9}@!{8AW9U0Xlg3tj@C;nt+6{bV6ji_O1p@WGaZ=tzPbQR9w6#f8f~1Vy*eUB@m^i zN2u`c2vk3Sh{DOp9`z6qugt>>)=u1oj?NZ1C6WJPv+@IXUerD!0d%^f3{({_N85ab8XbY7-Z zRb671xEs0%GpeyC+$9b$;a@%uOp1)Ys5=$#lzO~nRDq0-hsyrAfSg{KlsPh=$GYXG z@u@O{jC2vv24}L%CEv@#GjIg%HVSo4^=vb?9wgnl`>v1hZX2R+W)?C5KqBA|SrJ2C z+c&T5HJNW?E)B6nxue%F3+&#=6FsnH#~0@5L%-5pN~=u%J?n%k@@-86Q~n1Q%fS60Vs* zdeoZg?bK_-Cl1Bo^OYN%l{B&qZ>#eVytX5Z^g{1SDJ)(SzmmsaKj+9pFwkRcau2+i zE*hY5cr(0iBMN%2i{OD!xL`qkirDi*uzl@((!hezS?Ifdkv2|y6dlI z^npST|S9I3A08LKs4}HwKWyr$D!>*eZ^jqb?ebuy-_cZJQJ>m znn^F0*Q9R~!+Vp(VvJ<4t2coG;Q(TxXbF7xMu{b5cd)bBl5=Nn#VaHDki$fs=YB>l z4tKt@-|}mO4;4xc;DaV{ZoYhcownU11l8)_JMbrffICyZQh}P<%@2#xY_97N(}LS6 zNX6SW$E4(TdP;C`aNaU*_qx%+q2jGy|~)RQe923Ylx~RLRoa_A_rfNFjD7AoJ)ZjdEvNs_Zw*` z_xQeub)gFNmj-RVLwhOqVy@_Y`?KHn;j81-uF4E1%Xsg~@N#FjmXC_#`X}(O@x$ne zWc08;vs3{|R5S96ZvX@iAz_`cuTS(RJ07UqKYl~YZPyUXwJdT=$X4jGzuehDZ+X~7 znn^7fyF`06kV~rX-+eC=L44&m^pACjKz%2#NLfa3K>A+!X#i?CZn+%~`ArWGPG6iD|nlX5S4WLi(nm+)mUGYeLe1>%Ei|Q4mr~*g@N6Zx+ zYHG=e`+awhMocV;2PEH9Nkt4Mj4;ytp#f@(Qg~2P>Op+vKoY%kSxcIM*>GF)i6;{Z zNIzwul_5;0J+?j2Yp44Y>RpBi_QVm3p8J|d_gDy@=R#}3Au7eN$!F%cB-&&Aig%$D zlxD&yetrCEpR1;FL1+gyO4PgpIij;Ry5B@tWl=rQStf_uUk^T-x#!Uq zih?X1sDMSd6JQKhwgvRscyP5n@Yvs5P)MB{&~j=k zu{#%lpLbDZg$0)eg_b0(`OlQ8Hm))6bD<6(!dsf6;&IOBu3E6`J8jh72a1HG{ zmi~c9jGy1J5!v6O?y29K8YkiIAmbNAS!9@$U95&`0J%$VE#@%x7qnn8$cmLt1-pvj z4w=jWM2oKs#0Hv(!^0P%*uEkMhjBH4j}Pw3UU?Ai zyLitX7{=%ss>4X|UL4&x6tcYDyZ~+T4_i7i4)pWl9-ZVZZBD;D3EEHuqy{1BG zQTERPQ%r8%SF~QhJLDryjD^AlGa&@Tq?jAa zI3*}KG~JM|UEZwstxS&`$#J?RMIvaC@HZxjjTw;^T>@ZJzN8X1$VxZxHy(_OMhfgF zdJGNfGjEhkZxIF3=x5cH@cul^ld?1P-8sF*)Gk?ZD<{YIHc3woWWdKrjvoBFAM!J8g>BO_WM0yc&DLD>+>cQQ z12h&Pu(%d%=^>9SArZHN{dXX9@xAyZEBc^8-2Fl5XVQ&zNFk5Tlc7Z9oDB0H>Vmho~i=cUjV1LWCNfE8*;^Mo@-x06*VU!bOr-!ZMo?flZ9E5<}fM{k*V zKrXDZ$i9>#^`*9r?$zh}8&h5}$wDP(Vqa-Z6fjFNR)gxNcL%?s#|r8Uxv;-+%r1(f zsBq2>bwY-oBr+C7Qm^tzZ#OL8ow>+d1_CWGS4|Nl&|6O*N@XE`$ZmKK?$)0a47#3e z$KOwB=S@#RH|=@bMl#3l1l)mB=WFO-b-bSyBKXy+Xi&!zGe;d|=m3;8Qr@+IhHs^v z`gjtGkV3vi(Fxn+kx@}bI6&iznBAYAug09sIK<;&Fn5>x5#28wE8PaU7{}DJF23mw zV&xua`$1j7wPQg&RX5}FpC?@b>1I*&nhN80{gzmaIS9##0(AIvM?>sZ1RhTwsek+7 z0MW*K?EgkI{qf>$oJCfB#_@LDb9=>43UOj2p5&$k3x{|~N$yA^pkJ}k*(b&&#eROP z$92GFxnlpjs?Z$wvA})&t!xZ?K?Dit6s>xTCNS>`Lt&vIk>@1~&$AQzB+{@HZ`BXz zdPbB5d=+;5#!n9s13a}78oZ(l6*M#2>N^*aE_oKORU#tfW8fo1nh53$RoJGrBMF^z;Hqexn!OvQ!6*he7kG32L)mMIylHOt{!)#I%9>PmT%l9Dphm)IrT z>62R(%Z(8k>@)v#o%ByuB!yX@no-dQ>}sjN#3(?AijrLD+v~M^(cELJu_Czjq6oq` zYZ9fp&x=Z0{^wGXNbstUD>F6t$a26;8AyR4xTmu1xfor~+#0+s_SSlz{9d2byDnJo zM^%^Y%T#hKs3Ejfh`mJs=7z=}i!f+2_QEk(V>|kqA@lw# zQhmw_n5sY7swBggE4(5YL9I+Qh5})$D`^Tk9wF^g^>D>#1AElX!*D z4LyLP2y*cE9?DmYxlXz9;?}ne>O|*HZ>lzWqrdi}DP3~qAZ9Nogfoqe-3w+GMd%Ul zh?z0yY!J#E2BuLtGi|jPeNVqas2GeK@NX$w`7uBwHMnxO-fQ#ux}t@LDrCY1RgbUk zinC~{j|yUtx4Dj)-F05bDDHmt3_9{T|L?q>`Tgzj)lbp)Q*T@~%`fuXu;d!~{&oIU z%V@U#u-!T7CBV>Rmh8OnTww)mrRd|$PU-Gz=8mdg)lk`eXI4wJz6wm}!R+u0N#J~D zfT6Q^A#i@}5+}=G>oeTY=Gbf5mwq=nocEHw)ADvf#6NDh-XLyjBLl6D2cn^x;g^}c>x+AW$H4S{%_1c&z z@y~q`KWoj}M$D^rcs?`S4+nJCqJZ^fzZIa+m-JoJki z{Ele^Xu>8IL+;>oVGRUH*E+7hxE=X{qS zB5SOo|5RjI8llWjt85+e&*-od(%NJ_G^avH&Q;;ZJTyw5Ov?H`x&dRsK>U5n}V9SQ(zw|J=f z%jz;flwTiL$R`zO`iVFjagsGdf%7AA5uGd8%L$<-Idzz?Y6+06$M>LaJ${l@PKf8` ztef|{H=83DTGb3gttxGCZ$k<>Tk-g?1#Zz>$dJsWWf3i`i?RxbbKki=Jbk4d&?m8D z`jUJ3Y3*ech)b0MaxdyiH7M9@SK2(U>wa6OmY0}6EG)4Jvg8O$&d zC@S)77HCi57!kF!VBc^QFtDJ$g0tZRls_hvZ!AjON#Z3VTwPA$|1f)0h;UQdT~NbV zIxss^LcK^JFmig{n1g&lzB*eXJ-5A0vT;(TGwtWq;O?_qRu&0v3n&Q$I~%wC`SEGh zIdcjs1yvrBQl8!K%-SDRp9y_~b$lFPT!`pU--e$LTt;w1k6MAbZX`ga2VkngMG4{$ z%|WUG-)q2~OQuY%7t{+9krO)a9k1kg0eKC=No6p zQBAVBbiR&a5KCBLv*?Zu5S}tXP00J~D#>BCG~9Z$E9>j7h<(J0(Ak0UQtVU+GfyLB zJlI^Y!R<4xG`LK|KNDmwD^BvX44dfP1{1FrN^-%=T%@BX+NOsWacFJtwANQ!uPzmY zS_(2%uK!5uSsBj}INs^zIr5-(#`)R|BW}LwtuLjpA%8u{{10i7VEEeZfaN%Q;ZqnZ zKg&*$JW*!5^@9k3p^EjxqnL*$i@HRYv~U(-$Em;s4%!y^y4&&IOsU;Bj|5z-&o`hb z#Dz;uX&O7MF+=*BkY@&PbE%|cwfcp_U9Lj&u4WVpNlnxgEFGGy9jt}u<})gw#V-_W zqoT)V8C@!%zL>Z4Vqqh2Z?Lj*_H!_Gqp{WH=py;m(PiM*fDcJuRkz<^I_d5M=2H^X zeSCQ^2wznKcdS}0V>kkq)dG-=IO-D%W*6Er`pbz7H*XqGPqA#a5yu;9ME2b)ynLr% zrSsvjUTD5q;<+4}U}{>Nf3A*2F|5^_KM-ovRi{>^5b7wOX6r_Lw6eFFeAu2-%@s1y z2Jz)cuL6Ev+`s3SGmu&KCh$DJ>gVu7%uf;m8W(7-f-5KQaxbjoI|YOX<_+_WkBLm) zG9c|P?FAR2M>@b^BKG<`9O(c7!upQ0(k$mvAx{?3@?9o*{SJe)L!mpvXG--|zz+8~ z99lt%^b!l-FzsO{iCkahZh}lv-p#45 zbSPJ_bZ+P=;w}73YJtc$aH_o$9|Ztw+FZhuA;zWUFL%$A(x(8_Bz`K& zx#c$uVI`1mhg%a~Q)dirf`0>0XnCPFoP|_qzYuD5p0+Pr;)Grkiv-nxlVHfMYHGV& zLc7;_P5dZvbql~V$Wr^lZhD`FXx}hH$7_09YA@w*XU2$sh}t{!r#7Y8i`a7?XG}pB z2C5}SGj-X?IDn<~ONAG5z6Z3|Hoe>f-D#L%t|i;2MPiPs^?j2jV8$it2)S9O%}M9<<&MPO`c?*A#MzM8DQ` zu=%IcAIp$tZxd$qd@${yT+I_8<-R2|T9fI%xG~jaO8(T8D6Z?nqIQ=;kn?{NE+lc1 z^+es!b7@g~ZkG^LE`W390Ssc&*6I(lOwvtC{3>W7z4#Y$gV%3qy~U8xDgn;X&LgKHz_pwb;#91%&4-vzZb?L zD($A@j3vc&3@P&3h7GZ#z=6g#%RU?ViaV0kd$VNb*?Z3q=sIRpEwYLTP6ro3kiPBi z9@Gg3`4DimnG>{M{ZxM0iYzY2TF-L51cA@M{@Zu`U01W}5_eu3J+8E!;{y*S?2s-T zgeQ`73EOOHJK`{@tE`f%%41r!m_Ja0!O?>4OgYYzY8xo|fN!gksx`8q%twcq7$*Ob z$e`Qo>KXN=*K$Tc8P1X}ipCl)r5s~p#}Ci+Z!6I_A1N*kWurCHDu2Ic3KyV(I5z}} zmwm`P$f1|iCCPnur{+3h_Ep7UTppqKB+Z_&p5~VVu0sz6@JNAmw}JDi82f;UMo&0R zIi{8Y1};!2)tK+Qv6@b5zYinD>tLO`fBozNBRoE^LbMEA`QRMO5&hf}GdIjWpm`Lr~Mj$@3^=z1DfT@~p`B?ENeE zjEZ9ONFf^sJIjoZ1VbA$VF32x4;ZR^S~E32r^*XtEfC$?06JuwEkix8uhX3RVHZU~ z1jo+quDgo!^JcWc`i&yr*uB@T2Pg~R6PicM&qbQYoAx&hYv15M$%F?y<~(HpL)Txs z-r5oYcLrrN6{o_BanD$UWoM7B?KToX)Vn#?a0h9IgRTNO76gT?=SJFz91XP)l>gJf zfIp%TCKA@$3Hkg~G00e8{_$GF$ak~eFviVa@)>)cw|Y-Z2bxAzG%V07?6+&&6v1MN zO~tAX61LruHLWUkO>G8xESHekR!D3RE29PXvgJBF*>i3>c+h@%zk07Pfu~<`!?ARbn?@ z)!Y&N7Ap7~x;YB$UIwBhK=77%#xs6sQ=I3hR(WtauqjSR`v+_dTigG6n}vb$k@a&w+NUpWx{F>tyGuV?4L*t! zDaSMHoorfUsr^2=PBclttGZO&;jnbjkkT3+O+Jz0Ysv2QS(zo55-X-)Vvp$^s@_R% z!?--qxOhOF2$A2BGAa_mwxdb)F4K*xiT?GBaG`W|>kUz4Jr#I7{}o~0iCDvrcr2Ov z6K=NohYuPrfUZyf3WRNcnEHq5<)_8Dw+N9GGwVvgOUT(50zbxk_k_l)-MjB^@$Pk= zyd+(Cv;UDwX|g=;f^(c<6<}my?;w88r7BjGlCps_7rg=|(O^fEg3!x8eunO85eDWy zM;@n#i@MPYrv^+2=Jd5Kzw1avG@VWLZ#tT?La9Q-YCNK;99z6StQWIlBMZaP>DYQ) zNAsXCJKa%bs^T4@e%T%8acDjNBz@%l#_K~1=Bhyd0J4mQ_QmsTG0t4@SW#?N!G9S; zl%OR1KSXhXf+Z65j{?g6f$wxawJ$gdA0X(TY)W9EYF+j8o~On|W?nYOhrjfv>OvRB z)nR2&9efrhcA`(0X2Lx`iN0Jizp6O~}M$EgO++Rx!;DPx* zB1s_J_jgH}0BAd(X-`L>EXRCzCE`pce?F($J8#crYlB{Kxzuu4@SIxilmykm2X#Ww zbZs6tuXY1k91u!&HkWa0RB+aDka(eZeAu*T&`)=@p_&>ch$5$%;>&%A-b^Vvz`1S_G`sbiY1o zTi){DVIcx5Lm12iH*V4VHsE^+VK~;G;`2p3_IM5dY|zN3qQ3s@qQl8uz04?g#qn3) z#LfI8NE+%KPxEOzGcG(XQaN`~?1gApMV}7hJ%7Y`P{Bl?Z#&SAXpF$x!j5*n)c}nj zGRPknZgeB-FKn#i^^XJ1B7MySDFUj64fLh=G__2kbrcQXF zO#RSJ#O)waC6hHuaJqe?+C9rD@}#z7O$xT(D}j>ZMpwM9WK*f6T-Nv$DazP`ZYrn| zdB`&hm5Tafqrtt1pf9hH^ce#;+G7KadG?LguZ<@?VT^liVGQo2jHr88+q~1(kL>vl zhp5?!??59gbLFRg?@HCs#vAYwzIxE|07xmpuY?fxUx(e>9r|P& zSNO_W-Rjl7#4yDzd~esf1$_I{e(yxE-Qk@wEYGJ&syu)N8G=-@N&_9+$htz=d1MA6 z9$uJf?b=Shb=$JZ|FziSM2ONxj$YUw#5uhM*_8#B1*{n!U+?nQi+b74c0A1A`bMhA zE6(<-WpW(((GBM8qN~kIQ7ABU$u#VjVCj5R@!h?-f_QWx^(KH1*|kKv5^UV^NY+pj zjO!{3E3=UOdG=}L_v&aY0n+6msqU$PdAQ?wX$Qo41^`^g41Z!H_CgrUM%-9JpF4Su zm@grU9$_t&UdGO_fb({J+;F1^7p2lAs*?+Ko{mgEbXgJnkvXjI$Jer{3#F3=BQul; zd4j+bBrDQi=ZGUlG7XXPak^->JZ47L+o9@28o|yL91-(-BbJ^a zOJx2Az91zNQ{3M$AReUF;i_I)=(+U2Ciuz;^qAtl)4Ep=#G-*y&GwTe=G|3<>5vrAI8r@+>Ckof=C~s=~OaIXXINaCaO=@j&eIi~2vO8F z=_6V+Gk!lVJb1L=$+oxiBYvNqz^|1ve$yX&c`_1wu1y~&$~P@kt7MQwTX65g#)c1>LBEtY`3opTJLg3Nk+NQhi)3rJ2tqfU)4wsmEJ>AkT2eXx% zwV@#l+^_}Vyrbc1BOTznxOii*>{l169`~x%uXr_=6p(FLHvT8;KWXwZJ z?mF^=#?8V;!ka6B#T+an(+0y)!b94t%{@9tRhv{VdyHy4b0a+Md%)ZzGmRNv^K;DY z=KC;tbW{l%0t#(hAbe=+K7YWR7ki@DHDo8mM>eBBn(@=@o}J$C!HITwb=%&~I?u{@ zb$LqZV82&>A6{&ac^tuhPy(_`J`n#etOpO%Z@ej))O}uJ(J_RYgv96Mbu-L;BDEQf zb6eTDy|<`oV$S5_+A-bh3MsgZ7=Y+r0)hS|bF2)aLc#;`TUHZBJ;zs4G+B5_9%nfU zay@JK$vS(=UZ@GP=&GSFYYpifvW-Fv5&G6irDP8ZG@PVPOAE#Y8@>i3vXzX$e~;E(Ep zSw#R6CsoPqc_5K*yuYg@c|{Zc0Pqx#h1!2JNrXwR!RBIt(E^nVs6~avr*aiU5W@Lj<*7#m*aK5pXzMkAyc+W_j(Y$NuqVw?gHw z>en0V8^~Cs74-Od#GML81bYdBmkdlQ8MT?a<>0bF9^pq}*(4_>nxK%RD?Wyg4Sv;5qN5 zK0&YVwfu=~i2B@&fYf@r2RNShvoK0}4N9KxVntuZ5jHI^8L00;*P+96=e9Itb`a{u zhxR2yg+;OGP%||?v59OV@K$EHWYR00nfun}K~dBr&D333@{e>FulYo*gT3DVs`~IoTxRutRwi6 z@CM!U=f%V4*6rd=r0WQMX7cduKNC&>Pqzt5Po%s7zh%vuF(8E!P$OS&cWTiz<`={$1m;>!OIz(y`DsMg* zEXZ54{ti$aJNSiOY>vEhSH+*y;pFF4m_V1IMxCXi_vq4KztFLG>)FiEUn6*k0V>uV z#pj*ZwORZ`{0g&aj&EM(OXrSc2^Hd}*s-0Q*jfoJ`e`YoW|s`Bx}a3h9YFJh#AO=E zMW|Q>DaA$V5a#m|zBnWgBW<5x_4D8`ZmsHo+Q4qIxhw#_1nRedGureX9IFwCG^vjm ziRiaT#4T-CF*(=KrL|}ypRJAuUEW4#K??Pgh??%p`m2);H`w8|F2EmD6^K_<197eY z;_np#MS(3g(||1KjInW$#|#hLyEdOI5w~=C#Ck99K7T4#LS(!qED|w$}9Eekjvbg;uRuaOMd*k z6N?y)==YDG{bM2}z}`vlrZN9k9^ue%I4~aRA?8#y^RwX_)o_9p z-=){TREGmjZlr(D3T><)Q6Gd1UD%I$Hbjl{E{Z*7w*!4o^E)|Py5`7$%PkVUn}Opz zt6NRG!LN;IdsgT~)0eKUnPj=p?`ccntl0#M%pXE}VxKhi2pdp;&wVfIa`3?0K0GnI z$b8IWbyX1RMuMV5g3_abj0b%$fxr@#ezv^EU8*vd=ft);->y|yx5b4F6`6gmmy@Jl zH$9PUn(M($_Wc`0Qe@u)3j@|AlRDtRIoQZDTLN0P$ekDn0uroq z5UC!QTN2_t`{Hxb^^0&f<@o$W1CA42r?f)(+%ReA>t}8V!U~GYljV& z1cN1N9;(q#dd1Z*%&3@CQ}Cau!6=8b{=TL4{89j#3r6bn# zVx-Vx_mZ0~hVI>X(DYXx?!(FrX;yElX~aZ7hUG2UOxBmZTc{M0JJ`U@t@6~&@5!3rTSpx6;>$_YhWV8CGq}Faz z$5?sqw+xyF1k6M|xIwa5VQIQcqca{%w)oyphg5y+LiQ@s7YAvJw7RGts`R`#kWCNx z5?HG;{g9*FY&5ew<{EQX9d{S}4Qrvr_4S3~pq#P;{g}D5qV$ry)4NBR&5sW9qi$Qf z4XuVzh&55CJ^T>nN^|Vk80YsvpG~WC+1ih9T?6Ssx6uQU`hTh%Z*TculJa%^`PL4uQ4YY+Nv^`~v&C^bq6mITu3z+V zuiljVsfrO7-DWc6Ck27OsRTFmi&m9B0m6{Z3hI}6+l~GYIQSa6ikQB%)MPvI1#84A zid1t64oa?F@D%zkBlbC$yFui$U2N{rT|G;uE)r&OD>ZAFQoBIUZx=B3dGO3%waRCkS zBUW8KURGjp>xYm9)Q5YvG+d5+;o*1p?o!o=DuFQM=g>vK%YicP1zQJrNW6Ty3l}xb z^zZLty4*H|b}S)hdx1HgvrT~;kI;Zi|ll|4Ab_v#8pU^ zWR%W5zwh)z)mo}N<)ll2^jQ8w7d5O{v$0PVQs3uVHE{`A@PxpD`5#-`1!9gi z9PcIm$))+$ZAT|dm$<%9vJKakrD>e9HOA%M;h9(s{O6;2=U z>Eq<&BdcJ(=NRKsN`G{K+M4(`O2-?TR)pxIY!VlH4LL`?0Qc zNyM(rVwBsu3_Jz;;&!Qu>68AUBHVgJN?o?gsAzk3+=7Iuf7s30(?)zEJ4mrP zFLZ^7vR8=volS;SFw$jnPQ=C<4(_S@_3Rb?-d!E6XD~n1VLULjp%7O^O|C>R_XRAX+gaAO? zRCre3Lls2q!E(v@8UzX>AY*|e0n7__DAc&oDhB)dpARuFP%n|d{wBWmfBNwJXSZQ6 z)Qg|o|7jfT&-_Rskc}DA{J(?$>)Hqc0wiJ1gMZ)p&$rA_D7uYV|K|C8{&fkQg`5na z)Oz=?+5Y`j7Mwx2T!sICoi?161>nq8Cj9%$|5&LPI0I&11nz$`ZACb6SLY4If1UO| z85tmVioWpQOgk6}Boxwd{2}ANZntrT1@Jj;p!#p7O#y)jn~19X*Oj6b;K1>I0N;Pi z_MZX&mqAFt?|&eJe*f4m2LNdA9mSiP|I4g@iS++OX8kXN{y!N+`)amdH&IK?9svK{ MQBqUPmpAtRKa|gwVgLXD literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..a75d932 --- /dev/null +++ b/package.json @@ -0,0 +1,128 @@ +{ + "name": "nicecode-snippets", + "displayName": "nicecode-react-js-ts-snippets", + "version": "0.2.1", + "description": "Extensions for React, React-Native and Redux in JS/TS with ES7+ syntax", + "publisher": "devlifestyle", + "icon": "images/logo.png", + "keywords": [ + "snippets", + "flow", + "work", + "nicecode" + ], + "author": "dev <710328466@qq.com>", + "main": "./lib/src/index.js", + "homepage": "https://nicecoders.github.io/nicecode/#/snippets", + "scripts": { + "builder": "vsce package --no-dependencies", + "vscode:prepublish": "yarn compile", + "compile": "rm -rf lib; tsc -p ./ --noEmit false --module commonjs --outDir lib", + "compile:dev": "rm -rf lib; tsc -p ./ --noEmit false --module commonjs --outDir lib", + "lint": "eslint --ext .js,.ts,.tsx ./src/", + "watch": "tsc -watch -p ./", + "typescript": "tsc --noEmit" + }, + "engines": { + "vscode": "^1.64.0" + }, + "license": "MIT", + "categories": [ + "Snippets" + ], + "contributes": { + "commands": [ + { + "command": "nicecodeSnippets.search", + "title": "nicecode search" + } + ], + "keybindings": [ + { + "command": "nicecodeSnippets.search", + "key": "ctrl+alt+r", + "mac": "shift+cmd+r", + "when": "editorTextFocus" + } + ], + "configuration": { + "title": "ES React/React-Native/Redux snippets", + "properties": { + "nicecodeSnippets.settings.prettierEnabled": { + "type": "boolean", + "markdownDescription": "[EXPERIMENTAL: MIGHT NOT WORK]: Integrate prettier settings with code generated from snippets.", + "default": false + }, + "nicecodeSnippets.settings.languageScopes": { + "type": "string", + "markdownDescription": "defines the language scopes for which the snippets will be available.\nUse comma separated values.\nFor example: `typescript,typescriptreact,javascript,javascriptreact`", + "default": "typescript,typescriptreact,javascript,javascriptreact" + } + } + }, + "snippets": [ + { + "language": "javascript", + "path": "./snippets/snippets.json" + }, + { + "language": "javascriptreact", + "path": "./snippets/snippets.json" + }, + { + "language": "typescript", + "path": "./snippets/snippets.json" + }, + { + "language": "typescriptreact", + "path": "./snippets/snippets.json" + } + ] + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nicecoders/nicecoders.github.io.git" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org" + }, + "bugs": { + "url": "https://github.com/nicecoders/nicecoders.github.io/issues" + }, + "dependencies": { + "prettier": "2.5.1" + }, + "devDependencies": { + "@babel/cli": "7.17.0", + "@babel/eslint-parser": "7.17.0", + "@babel/preset-typescript": "7.16.7", + "@types/node": "17.0.16", + "@types/prettier": "2.4.3", + "@types/vscode": "^1.60.0", + "@typescript-eslint/eslint-plugin": "5.11.0", + "@typescript-eslint/parser": "5.11.0", + "eslint": "8.8.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-babel": "5.3.1", + "eslint-plugin-eslint-comments": "3.2.0", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-jest": "26.1.0", + "eslint-plugin-prettier": "4.0.0", + "eslint-plugin-simple-import-sort": "7.0.0", + "prettier": "2.5.1", + "typescript": "^4.8.3" + }, + "prettier": { + "bracketSameLine": false, + "bracketSpacing": true, + "printWidth": 80, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false, + "endOfLine": "auto" + }, + "gitHead": "143fba48314ad1f175de7fed5b83325215ff7380" +} diff --git a/snippets.json b/snippets.json new file mode 100644 index 0000000..a603bb9 --- /dev/null +++ b/snippets.json @@ -0,0 +1,225 @@ +{ + "import": { + "prefix": "imp", + "body": ["import ${2:moduleName} from '${1:module}'"], + "description": "normal import" + }, + "import module": { + "prefix": "imd", + "body": ["import { $2 } from '${1:module}'"], + "description": "importDestructing" + }, + "import everything": { + "prefix": "ime", + "body": ["import * as ${2:alias} from '${1:module}'"], + "description": "importEverything" + }, + "exportDefault": { + "prefix": "exp", + "body": ["export default $1"], + "description": "export default" + }, + "consoleLog": { + "prefix": "clg", + "body": ["console.log(${1:data})"], + "description": "console log" + }, + "destructuringAssignment": { + "prefix": "deas", + "body": ["const { ${2:prop} } = ${1:object}"], + "description": "destructuring assignment" + }, + + "import React": { + "prefix": "imr", + "body": ["import React, {} from 'react'"], + "description": "import React" + }, + "useState": { + "prefix": "useState", + "body": [ + "const [${1:state}, set${1/(.*)/${1:/capitalize}/}] = useState(${2:initialState})" + ], + "description": "useState" + }, + "useEffect": { + "prefix": "useEffect", + "body": ["useEffect(() => {\n\t${1:effect}\n}, [${2:dep}])"], + "description": "useEffect" + }, + "useContext": { + "prefix": "useContext", + "body": ["const ${1:context} = useContext(${2:ContextValue})"], + "description": "useContext" + }, + "reduxActionCreator": { + "prefix": "rxaction", + "body": ["export const ${1:actionName} = (payload) => ({\n\ttype: ${2:type},\n\tpayload\n})"], + "description": "reduxActionCreator" + }, + "useDispatch": { + "prefix": "useDispatch", + "body": ["const dispatch = useDispatch()"], + "description": "useDispatch" + }, + "useSelector": { + "prefix": "useSelector", + "body": ["const ${1:state} = useSelector(state => state.$1)"], + "description": "useSelector" + }, + "useMount": { + "prefix": "useMount", + "body": ["useMount(() => {\n\t${1:fn}\n})"], + "description": "useMount" + }, + "useUnmount": { + "prefix": "useUnmount", + "body": ["useUnmount(() => {\n\t${1:fn}\n})"], + "description": "useUnmount" + }, + "useSetState": { + "prefix": "useSetState", + "body": [ + "const [state, setState] = useSetState(${1:initialState})" + ], + "description": "useSetState" + }, + "useBoolean": { + "prefix": "useBoolean", + "body": [ + "const [${1}, { toggle, setTrue, setFalse }] = useBoolean(${2)" + ], + "description": "useBoolean" + }, + "useToggle": { + "prefix": "useToggle", + "body": [ + "const [${1}, { toggle, set, setLeft, setRight }] = useToggle(${2}, ${3})" + ], + "description": "useToggle" + }, + "useCookieState": { + "prefix": "useCookieState", + "body": [ + "const [${1}, set${1}] = useCookieState('${3:key}')" + ], + "description": "useCookieState" + }, + "useLocalStorageState": { + "prefix": "useLocalStorageState", + "body": [ + "const [${1}, set${1}] = useLocalStorageState('${3:key}')" + ], + "description": "useLocalStorageState" + }, + "useSessionStorageState": { + "prefix": "useSessionStorageState", + "body": [ + "const [${1}, set${1}] = useSessionStorageState('${3:key}')" + ], + "description": "useSessionStorageState" + }, + "useDebounce": { + "prefix": "useDebounce", + "body": [ + "const ${2:debounceVal} = useDebounce(${1:value}, { wait: 1000 })" + ], + "description": "useDebounce" + }, + "useDebounceFn": { + "prefix": "useDebounceFn", + "body": [ + "const { run, cancel, flush } = useDebounceFn(() => {\n\t${1:fn}\n},, { wait: 1000 })" + ], + "description": "useDebounceFn" + }, + "useThrottle": { + "prefix": "useThrottle", + "body": [ + "const ${2} = useThrottle(${1}, { wait: 1000 })" + ], + "description": "useThrottle" + }, + "useThrottleFn": { + "prefix": "useThrottleFn", + "body": [ + "const { run, cancel, flush } = useThrottleFn(() => {\n\t${1:fn}\n},, { wait: 1000 })" + ], + "description": "useThrottleFn" + }, + "functionComponentWithUmi": { + "prefix": "tsx", + "body": [ + "// $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE - by dev", + "\n", + "import { FC } from 'react'", + "import { connect, ConnectProps } from 'umi'", + "import styles from './index.less'", + "\n", + "interface I${1:component} extends ConnectProps {", + "}", + "\n", + "const ${1:component}: FC = (props) => {", + " return (", + "

", + " )", + " }", + "\n", + "export default connect(({}: {}) => ({", + "}))(${1:component})" + ], + "description": "umi 函数组件模板" + }, + "umiModel": { + "prefix": "mts", + "body": [ + "// $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE - by dev", + "import { ImmerReducer, Effect } from 'umi';", + "import { SubscriptionsMapObject } from 'dva';", + "\n", + "export interface ${1:component}ModelState {", + "}", + "\n", + "export interface ${1:component}ModelType {", + " namespace: '${1:component}';", + " state: ${1:component}ModelState;", + " effects: {", + " };", + " reducers: {", + " save: ImmerReducer<${1:component}ModelState>;", + " reset: ImmerReducer<${1:component}ModelState>;", + " };", + " subscriptions: SubscriptionsMapObject;", + "}", + "\n", + "const initialState: ${1:component}ModelState = {", + "}", + "\n", + "const ${1:component}Model: ${1:component}ModelType = {", + " namespace: '${1:component}',", + " state: initialState,", + " effects: {", + " // *demo({ payload }, { call, put }) {", + " // const response = yield call(getCaseForm, payload);", + " // yield put({", + " // type: 'save',", + " // payload: response,", + " // });", + " //},", + " },", + " reducers: {", + " save(state, { payload }: any) {", + " return { ...state, ...payload }", + " },", + " reset(state, { payload }: any) {", + " return { ...initialState }", + " }", + " },", + " subscriptions: {}", + "};", + "\n", + + "export default ${1:component}Model;" + ] + } +} diff --git a/src/helpers/extensionConfig.ts b/src/helpers/extensionConfig.ts new file mode 100644 index 0000000..5301a46 --- /dev/null +++ b/src/helpers/extensionConfig.ts @@ -0,0 +1,16 @@ +import { workspace } from 'vscode'; + +export type ExtensionSettings = { + languageScopes: string; + prettierEnabled: boolean; + importReactOnTop: boolean; + typescript: boolean; + typescriptPropsStatePrefix: 'type' | 'interface'; +}; + +const extensionConfig = () => + workspace.getConfiguration( + 'reactSnippets.settings', + ) as unknown as ExtensionSettings; + +export default extensionConfig; diff --git a/src/helpers/formatters.ts b/src/helpers/formatters.ts new file mode 100644 index 0000000..6188083 --- /dev/null +++ b/src/helpers/formatters.ts @@ -0,0 +1,22 @@ +import prettier from 'prettier'; + +import extensionConfig from './extensionConfig'; +import getPrettierConfig from './getPrettierConfig'; +import { + replaceSnippetPlaceholders, + revertSnippetPlaceholders, +} from './snippetPlaceholders'; + +export const formatSnippet = (snippetString: string) => { + return extensionConfig().prettierEnabled + ? prettier.format(snippetString, getPrettierConfig()) + : snippetString; +}; + +export const parseSnippet = (body: string | string[]) => { + const snippetBody = typeof body === 'string' ? body : body.join('\n'); + + return replaceSnippetPlaceholders( + formatSnippet(revertSnippetPlaceholders(snippetBody)), + ); +}; diff --git a/src/helpers/generateSnippets.ts b/src/helpers/generateSnippets.ts new file mode 100644 index 0000000..579dbde --- /dev/null +++ b/src/helpers/generateSnippets.ts @@ -0,0 +1,94 @@ +import { writeFile } from 'fs'; + +import componentsSnippets, { + ComponentsSnippet, +} from '../sourceSnippets/components'; +import consoleSnippets, { ConsoleSnippet } from '../sourceSnippets/console'; +import hooksSnippets, { HooksSnippet } from '../sourceSnippets/hooks'; +import importsSnippets, { ImportsSnippet } from '../sourceSnippets/imports'; +import othersSnippets, { OthersSnippet } from '../sourceSnippets/others'; +import propTypesSnippets, { + PropTypesSnippet, +} from '../sourceSnippets/propTypes'; +import reactNativeSnippets, { + ReactNativeSnippet, +} from '../sourceSnippets/reactNative'; +import reduxSnippets, { ReduxSnippet } from '../sourceSnippets/redux'; +import testsSnippets, { TestsSnippet } from '../sourceSnippets/tests'; +import typescriptSnippets, { + TypescriptSnippet, +} from '../sourceSnippets/typescript'; + +import extensionConfig from './extensionConfig'; +import parseSnippetToBody from './parseSnippetToBody'; +import { replaceSnippetPlaceholders } from './snippetPlaceholders'; + +export type SnippetKeys = + | OthersSnippet['key'] + | HooksSnippet['key'] + | ImportsSnippet['key'] + | ReactNativeSnippet['key'] + | TypescriptSnippet['key'] + | ReduxSnippet['key'] + | ComponentsSnippet['key'] + | ConsoleSnippet['key'] + | PropTypesSnippet['key'] + | TestsSnippet['key']; + +export type Snippet = + | OthersSnippet + | HooksSnippet + | ImportsSnippet + | ReactNativeSnippet + | TypescriptSnippet + | ReduxSnippet + | ComponentsSnippet + | ConsoleSnippet + | PropTypesSnippet + | TestsSnippet; + +export type Snippets = { + [key in SnippetKeys]: Snippet; +}; + +const getSnippets = () => { + const { typescript, languageScopes } = extensionConfig(); + + const snippets = [ + ...(typescript ? typescriptSnippets : []), + ...componentsSnippets, + ...consoleSnippets, + ...hooksSnippets, + ...importsSnippets, + ...propTypesSnippets, + ...reactNativeSnippets, + ...reduxSnippets, + ...testsSnippets, + ...othersSnippets, + ].reduce((acc, snippet) => { + acc[snippet.key] = Object.assign(snippet, { + body: parseSnippetToBody(snippet), + scope: languageScopes, + }); + return acc; + }, {} as Snippets); + + return replaceSnippetPlaceholders(JSON.stringify(snippets, null, 2)); +}; + +const generateSnippets = () => + new Promise((resolve) => { + const jsonSnippets = getSnippets(); + writeFile( + __dirname + '/../snippets/generated.json', + jsonSnippets, + (error) => { + if (error) { + console.error(error); + } + return resolve(true); + }, + ); + }); + +export default generateSnippets; diff --git a/src/helpers/getPrettierConfig.ts b/src/helpers/getPrettierConfig.ts new file mode 100644 index 0000000..30fc1bd --- /dev/null +++ b/src/helpers/getPrettierConfig.ts @@ -0,0 +1,19 @@ +import prettier, { Options } from 'prettier'; + +import extensionConfig from './extensionConfig'; + +let prettierConfig: prettier.Options | null; +prettier + .resolveConfig('', { editorconfig: true }) + .then((config) => (prettierConfig = config)); + +const getPrettierConfig = (): Options => { + const { prettierEnabled } = extensionConfig(); + + return { + parser: 'typescript', + ...(prettierEnabled && prettierConfig), + }; +}; + +export default getPrettierConfig; diff --git a/src/helpers/parseSnippetToBody.ts b/src/helpers/parseSnippetToBody.ts new file mode 100644 index 0000000..b8a7e7e --- /dev/null +++ b/src/helpers/parseSnippetToBody.ts @@ -0,0 +1,23 @@ +import extensionConfig from './extensionConfig'; +import { formatSnippet } from './formatters'; +import { Snippet } from './generateSnippets'; +import replaceOrRemoveReactImport from './replaceOrRemoveReactImport'; + +const parseSnippetToBody = (snippet: Snippet) => { + const { importReactOnTop } = extensionConfig(); + const body = + typeof snippet.body === 'string' ? snippet.body : snippet.body.join('\n'); + + const snippetBody = importReactOnTop + ? body + : replaceOrRemoveReactImport({ + prefix: snippet.prefix, + body: snippet.body, + }); + + const formattedSnippet = formatSnippet(snippetBody).split('\n'); + + return formattedSnippet; +}; + +export default parseSnippetToBody; diff --git a/src/helpers/replaceOrRemoveReactImport.ts b/src/helpers/replaceOrRemoveReactImport.ts new file mode 100644 index 0000000..74d4e51 --- /dev/null +++ b/src/helpers/replaceOrRemoveReactImport.ts @@ -0,0 +1,64 @@ +import { Snippet } from './generateSnippets'; + +const snippetWithReactImportPrefixes = [ + 'rfce', + 'rfc', + 'rfcp', + 'rafce', + 'rafc', + 'rafcp', + 'rnfe', + 'rnfes', + 'rnf', + 'rnfs', + 'stest', + 'sntest', + 'srtest', + 'snrtest', + 'hocredux', + 'hoc', + 'tsrafc', + 'tsrafce', + 'tsrcc', + 'tsrcredux', + 'tsrce', + 'tsrpce', + 'tsrpc', + 'tsrfc', + 'tsrfce', + 'tsrnf', + 'tsrnfs', +]; + +const replaceOrRemoveReactImport = ({ + body, + prefix, +}: { + body: string[]; + prefix: Snippet['prefix']; +}) => { + if (!snippetWithReactImportPrefixes.includes(prefix)) { + return body.join('\n'); + } + + let bodyCopy = [...body]; + const reactImportIndex = bodyCopy.findIndex((line) => + line.match(new RegExp(/import React/, 'g')), + ); + + if (reactImportIndex !== -1) { + const line = bodyCopy[reactImportIndex]; + const newLine = line + .replace(new RegExp(/^import React .*$/, 'g'), '') + .replace(new RegExp(/^import React, /, 'g'), 'import '); + + bodyCopy[reactImportIndex] = newLine; + if (!newLine.length) { + bodyCopy = bodyCopy.filter(Boolean); + } + } + + return bodyCopy.join('\n'); +}; + +export default replaceOrRemoveReactImport; diff --git a/src/helpers/snippetPlaceholders.ts b/src/helpers/snippetPlaceholders.ts new file mode 100644 index 0000000..5896a82 --- /dev/null +++ b/src/helpers/snippetPlaceholders.ts @@ -0,0 +1,43 @@ +import { Mappings, Placeholders } from '../types'; + +import extensionConfig from './extensionConfig'; + +export const replaceSnippetPlaceholders = (snippetString: string) => { + const { typescriptPropsStatePrefix } = extensionConfig(); + const propsPlaceholder = + typescriptPropsStatePrefix === 'type' + ? Mappings.TypeProps + : Mappings.InterfaceProps; + const statePlaceholder = + typescriptPropsStatePrefix === 'type' + ? Mappings.TypeState + : Mappings.InterfaceState; + + return String(snippetString) + .replace(new RegExp(Placeholders.FileName, 'g'), '${1:${TM_FILENAME_BASE}}') + .replace(new RegExp(Placeholders.FirstTab, 'g'), '${1:first}') + .replace(new RegExp(Placeholders.SecondTab, 'g'), '${2:second}') + .replace(new RegExp(Placeholders.ThirdTab, 'g'), '${3:third}') + .replace( + new RegExp(Placeholders.Capitalize, 'g'), + '${1/(.*)/${1:/capitalize}/}', + ) + .replace(new RegExp(Placeholders.TypeProps, 'g'), propsPlaceholder) + .replace(new RegExp(Placeholders.TypeState, 'g'), statePlaceholder); +}; + +export const revertSnippetPlaceholders = (snippetString: string) => { + return String(snippetString) + .replace( + new RegExp(/\${1:\${TM_FILENAME_BASE}}/, 'g'), + Placeholders.FileName, + ) + .replace(new RegExp(/\${1:first}/, 'g'), Placeholders.FirstTab) + .replace(new RegExp(/\${2:second}/, 'g'), Placeholders.SecondTab) + .replace(new RegExp(/\${3:third}/, 'g'), Placeholders.ThirdTab) + .replace( + new RegExp(/\${1\/(.*)\/${1:\/capitalize}\/}/, 'g'), + Placeholders.Capitalize, + ); +}; +export default revertSnippetPlaceholders; diff --git a/src/helpers/snippetSearch.ts b/src/helpers/snippetSearch.ts new file mode 100644 index 0000000..bb2855a --- /dev/null +++ b/src/helpers/snippetSearch.ts @@ -0,0 +1,41 @@ +import { readFileSync } from 'fs'; +import { SnippetString, window } from 'vscode'; + +import { parseSnippet } from './formatters'; +import { Snippet } from './generateSnippets'; + +const snippetSearch = async () => { + const { showQuickPick, activeTextEditor } = window; + + const snippets = readFileSync( + __dirname + '/../snippets/generated.json', + 'utf8', + ); + + const snippetsArray = Object.entries(JSON.parse(snippets)) as [ + string, + Snippet, + ][]; + + const items = snippetsArray.map( + ([shortDescription, { body, description, prefix: label }]) => ({ + body, + description: description || shortDescription, + label, + }), + ); + + const rawSnippet = await showQuickPick(items, { + matchOnDescription: true, + matchOnDetail: true, + placeHolder: 'Search snippet by prefix or description', + }); + + const body = rawSnippet ? parseSnippet(rawSnippet.body) : ''; + + if (activeTextEditor) { + activeTextEditor.insertSnippet(new SnippetString(body)); + } +}; + +export default snippetSearch; diff --git a/src/index.d b/src/index.d new file mode 100644 index 0000000..e2f4a7c --- /dev/null +++ b/src/index.d @@ -0,0 +1,15 @@ +--- +nav: + title: 工具 + path: /other + second: + title: 规范工具 + order: 2 +group: + title: snippets 代码片段 + order: 4 +--- + +# snippets 代码片段 + + diff --git a/src/index.md b/src/index.md new file mode 100644 index 0000000..560739a --- /dev/null +++ b/src/index.md @@ -0,0 +1,11 @@ +--- +nav: + title: 工具 + path: /other +group: + title: 其它 +title: 代码片段 +toc: content +--- + + diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..1436741 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,47 @@ +import { + commands, + ConfigurationChangeEvent, + ExtensionContext, + window, + workspace, +} from 'vscode'; + +import generateSnippets from './helpers/generateSnippets'; +import snippetSearch from './helpers/snippetSearch'; +import generatedSnippets from '../snippets/snippets.json'; + +const showRestartMessage = async ({ + affectsConfiguration, +}: ConfigurationChangeEvent) => { + if (affectsConfiguration('reactSnippets')) { + await generateSnippets(); + setTimeout(() => { + window + .showWarningMessage( + 'React Snippets: Please restart VS Code to apply snippet formatting changes', + 'Restart VS Code', + 'Ignore', + ) + .then((action?: string) => { + if (action === 'Restart VS Code') { + commands.executeCommand('workbench.action.reloadWindow'); + } + }); + }, 1000); + } +}; + +export async function activate(context: ExtensionContext) { + workspace.onDidChangeConfiguration(showRestartMessage); + if (JSON.stringify(generatedSnippets).length < 10) { + await generateSnippets(); + } + const snippetSearchCommand = commands.registerCommand( + 'reactSnippets.search', + snippetSearch, + ); + + context.subscriptions.push(snippetSearchCommand); +} + +export function deactivate() {} diff --git a/src/sourceSnippets/components.ts b/src/sourceSnippets/components.ts new file mode 100644 index 0000000..09ef578 --- /dev/null +++ b/src/sourceSnippets/components.ts @@ -0,0 +1,365 @@ +import { Placeholders, SnippetMapping } from '../types'; + +import { + exportDefault, + innerComponent, + innerComponentReturn, + react, + reactComponent, + reactComponentWithReduxConnect, + reactPropTypes, + reactPureComponent, + reactWithMemo, + reactWithReduxConnect, + reduxComponentExport, +} from './sharedSnippets'; + +type ComponentMappings = { + reactArrowFunctionComponent: 'rafc'; + reactArrowFunctionComponentWithPropTypes: 'rafcp'; + reactArrowFunctionExportComponent: 'rafce'; + reactClassComponentPropTypes: 'rccp'; + reactClassComponentRedux: 'rcredux'; + reactClassComponentReduxPropTypes: 'rcreduxp'; + reactClassComponent: 'rcc'; + reactClassExportComponent: 'rce'; + reactClassExportComponentWithPropTypes: 'rcep'; + reactClassExportPureComponent: 'rpce'; + reactClassPureComponent: 'rpc'; + reactClassPureComponentWithPropTypes: 'rpcp'; + reactFunctionMemoComponent: 'rmc'; + reactFunctionMemoComponentWithPropTypes: 'rmcp'; + reactFunctionalComponentRedux: 'rfcredux'; + reactFunctionalComponentReduxPropTypes: 'rfcreduxp'; + reactFunctionalComponent: 'rfc'; + reactFunctionalComponentWithPropTypes: 'rfcp'; + reactFunctionalExportComponent: 'rfce'; +}; + +export type ComponentsSnippet = SnippetMapping; + +const reactClassComponent: ComponentsSnippet = { + key: 'reactClassComponent', + prefix: 'rcc', + body: [ + ...reactComponent, + '', + `export default class ${Placeholders.FileName} extends Component {`, + ...innerComponentReturn, + '}', + '', + ], + description: 'Creates a React component class with ES7 module system', +}; + +const reactClassExportComponent: ComponentsSnippet = { + key: 'reactClassExportComponent', + prefix: 'rce', + body: [ + ...reactComponent, + '', + `export class ${Placeholders.FileName} extends Component {`, + ...innerComponentReturn, + '}', + ...exportDefault, + ], + description: 'Creates a React component class with ES7 module system', +}; + +const reactFunctionalExportComponent: ComponentsSnippet = { + key: 'reactFunctionalExportComponent', + prefix: 'rfce', + body: [ + ...react, + '', + `function ${Placeholders.FileName}() {`, + ...innerComponent, + '}', + ...exportDefault, + ], + description: 'Creates a React Functional Component with ES7 module system', +}; + +const reactFunctionalComponent: ComponentsSnippet = { + key: 'reactFunctionalComponent', + prefix: 'rfc', + body: [ + ...react, + '', + `export default function ${Placeholders.FileName}() {`, + ...innerComponent, + '}', + '', + ], + description: 'Creates a React Functional Component with ES7 module system', +}; + +const reactFunctionalComponentWithPropTypes: ComponentsSnippet = { + key: 'reactFunctionalComponentWithPropTypes', + prefix: 'rfcp', + body: [ + ...reactPropTypes, + '', + `function ${Placeholders.FileName}(props) {`, + ...innerComponent, + '}', + '', + `${Placeholders.FileName}.propTypes = {}`, + ...exportDefault, + '', + ], + description: + 'Creates a React Functional Component with ES7 module system with PropTypes', +}; + +const reactArrowFunctionExportComponent: ComponentsSnippet = { + key: 'reactArrowFunctionExportComponent', + prefix: 'rafce', + body: [ + ...react, + '', + `const ${Placeholders.FileName} = () => {`, + ...innerComponent, + '}', + ...exportDefault, + ], + description: + 'Creates a React Arrow Function Component with ES7 module system', +}; + +const reactArrowFunctionComponent: ComponentsSnippet = { + key: 'reactArrowFunctionComponent', + prefix: 'rafc', + body: [ + ...react, + '', + `export const ${Placeholders.FileName} = () => {`, + ...innerComponent, + '}', + '', + ], + description: + 'Creates a React Arrow Function Component with ES7 module system', +}; + +const reactArrowFunctionComponentWithPropTypes: ComponentsSnippet = { + key: 'reactArrowFunctionComponentWithPropTypes', + prefix: 'rafcp', + body: [ + ...reactPropTypes, + '', + `const ${Placeholders.FileName} = props => {`, + ...innerComponent, + '}', + '', + `${Placeholders.FileName}.propTypes = {}`, + ...exportDefault, + ], + description: + 'Creates a React Arrow Function Component with ES7 module system with PropTypes', +}; + +const reactClassExportComponentWithPropTypes: ComponentsSnippet = { + key: 'reactClassExportComponentWithPropTypes', + prefix: 'rcep', + body: [ + "import PropTypes from 'prop-types'", + ...reactComponent, + '', + `export class ${Placeholders.FileName} extends Component {`, + ' static propTypes = {}', + '', + ...innerComponentReturn, + '}', + ...exportDefault, + ], + description: 'Creates a React component class with ES7 module system', +}; + +const reactClassPureComponent: ComponentsSnippet = { + key: 'reactClassPureComponent', + prefix: 'rpc', + body: [ + ...reactPureComponent, + '', + `export default class ${Placeholders.FileName} extends PureComponent {`, + ...innerComponentReturn, + '}', + '', + ], + description: 'Creates a React pure component class with ES7 module system', +}; + +const reactClassExportPureComponent: ComponentsSnippet = { + key: 'reactClassExportPureComponent', + prefix: 'rpce', + body: [ + ...reactPureComponent, + '', + `export class ${Placeholders.FileName} extends PureComponent {`, + ...innerComponentReturn, + '}', + ...exportDefault, + ], + description: + 'Creates a React pure component class with ES7 module system export', +}; + +const reactClassPureComponentWithPropTypes: ComponentsSnippet = { + key: 'reactClassPureComponentWithPropTypes', + prefix: 'rpcp', + body: [ + "import PropTypes from 'prop-types'", + ...reactPureComponent, + '', + `export default class ${Placeholders.FileName} extends PureComponent {`, + ' static propTypes = {}', + '', + ...innerComponentReturn, + '}', + '', + ], + description: 'Creates a React component class with ES7 module system', +}; + +const reactFunctionMemoComponent: ComponentsSnippet = { + key: 'reactFunctionMemoComponent', + prefix: 'rmc', + body: [ + ...reactWithMemo, + '', + `const ${Placeholders.FileName} = memo(() => {`, + ...innerComponent, + '})', + ...exportDefault, + ], + description: 'Creates a React Memo Function Component with ES7 module system', +}; + +const reactFunctionMemoComponentWithPropTypes: ComponentsSnippet = { + key: 'reactFunctionMemoComponentWithPropTypes', + prefix: 'rmcp', + body: [ + "import PropTypes from 'prop-types'", + ...reactWithMemo, + '', + `const ${Placeholders.FileName} = memo((props) => {`, + ...innerComponent, + '})', + '', + `${Placeholders.FileName}.propTypes = {}`, + ...exportDefault, + ], + description: + 'Creates a React Memo Function Component with ES7 module system with PropTypes', +}; + +const reactClassComponentPropTypes: ComponentsSnippet = { + key: 'reactClassComponentPropTypes', + prefix: 'rccp', + body: [ + "import PropTypes from 'prop-types'", + ...reactComponent, + '', + `export default class ${Placeholders.FileName} extends Component {`, + ` static propTypes = {${Placeholders.SecondTab}: ${Placeholders.ThirdTab}}`, + '', + ...innerComponentReturn, + '}', + '', + ], + description: + 'Creates a React component class with PropTypes and ES7 module system', +}; + +const reactClassComponentRedux: ComponentsSnippet = { + key: 'reactClassComponentRedux', + prefix: 'rcredux', + body: [ + ...reactComponentWithReduxConnect, + '', + `export class ${Placeholders.FileName} extends Component {`, + ...innerComponentReturn, + '}', + ...reduxComponentExport, + ], + description: + 'Creates a React component class with connected redux and ES7 module system', +}; + +const reactClassComponentReduxPropTypes: ComponentsSnippet = { + key: 'reactClassComponentReduxPropTypes', + prefix: 'rcreduxp', + body: [ + "import PropTypes from 'prop-types'", + ...reactComponentWithReduxConnect, + '', + `export class ${Placeholders.FileName} extends Component {`, + ' static propTypes = {', + ` ${Placeholders.SecondTab}: ${Placeholders.ThirdTab}`, + ' }', + '', + ...innerComponentReturn, + '}', + ...reduxComponentExport, + ], + description: + 'Creates a React component class with PropTypes with connected redux and ES7 module system', +}; + +const reactFunctionalComponentRedux: ComponentsSnippet = { + key: 'reactFunctionalComponentRedux', + prefix: 'rfcredux', + body: [ + ...reactWithReduxConnect, + '', + `export const ${Placeholders.FileName} = (props) => {`, + ...innerComponent, + '}', + ...reduxComponentExport, + ], + description: + 'Creates a React functional component with connected redux and ES7 module system', +}; + +const reactFunctionalComponentReduxPropTypes: ComponentsSnippet = { + key: 'reactFunctionalComponentReduxPropTypes', + prefix: 'rfcreduxp', + body: [ + "import PropTypes from 'prop-types'", + ...reactWithReduxConnect, + '', + `export const ${Placeholders.FileName} = (props) => {`, + ...innerComponent, + '}', + '', + `${Placeholders.FileName}.propTypes = {`, + ` ${Placeholders.SecondTab}: PropTypes.${Placeholders.ThirdTab}`, + '}', + ...reduxComponentExport, + ], + description: + 'DEPRECATED: Creates a React functional component with PropTypes with connected redux and ES7 module system', +}; + +export default [ + reactArrowFunctionComponent, + reactArrowFunctionComponentWithPropTypes, + reactArrowFunctionExportComponent, + reactClassComponent, + reactClassComponentPropTypes, + reactClassComponentRedux, + reactClassComponentReduxPropTypes, + reactClassExportComponent, + reactClassExportComponentWithPropTypes, + reactClassExportPureComponent, + reactClassPureComponent, + reactClassPureComponentWithPropTypes, + reactFunctionMemoComponent, + reactFunctionMemoComponentWithPropTypes, + reactFunctionalComponent, + reactFunctionalComponentRedux, + reactFunctionalComponentReduxPropTypes, + reactFunctionalComponentWithPropTypes, + reactFunctionalExportComponent, +]; diff --git a/src/sourceSnippets/console.ts b/src/sourceSnippets/console.ts new file mode 100644 index 0000000..dec49de --- /dev/null +++ b/src/sourceSnippets/console.ts @@ -0,0 +1,162 @@ +import { Placeholders, SnippetMapping } from '../types'; + +type ConsoleMapping = { + consoleAssert: 'cas'; + consoleClear: 'ccl'; + consoleCount: 'cco'; + consoleDir: 'cdi'; + consoleError: 'cer'; + consoleGroup: 'cgr'; + consoleGroupEnd: 'cge'; + consoleLog: 'clg'; + consoleTrace: 'ctr'; + consoleLogObject: 'clo'; + consoleLogJson: 'clj'; + consoleTime: 'ctm'; + consoleTimeEnd: 'cte'; + consoleWarn: 'cwa'; + consoleInfo: 'cin'; + consoleTable: 'ctl'; +}; + +export type ConsoleSnippet = SnippetMapping; + +const consoleAssert: ConsoleSnippet = { + key: 'consoleAssert', + prefix: 'cas', + body: [`console.assert(${Placeholders.FirstTab}, ${Placeholders.SecondTab})`], + description: + 'If the specified expression is false, the message is written to the console along with a stack trace', +}; + +const consoleClear: ConsoleSnippet = { + key: 'consoleClear', + prefix: 'ccl', + body: ['console.clear()'], + description: 'Clears the console', +}; + +const consoleCount: ConsoleSnippet = { + key: 'consoleCount', + prefix: 'cco', + body: [`console.count(${Placeholders.FirstTab})`], + description: + 'Writes the the number of times that count() has been invoked at the same line and with the same label', +}; + +const consoleDir: ConsoleSnippet = { + key: 'consoleDir', + prefix: 'cdi', + body: [`console.dir(${Placeholders.FirstTab})`], + description: 'Prints a JavaScript representation of the specified object', +}; + +const consoleError: ConsoleSnippet = { + key: 'consoleError', + prefix: 'cer', + body: [`console.error(${Placeholders.FirstTab})`], + description: + 'Displays a message in the console and also includes a stack trace from where the method was called', +}; + +const consoleGroup: ConsoleSnippet = { + key: 'consoleGroup', + prefix: 'cgr', + body: [`console.group('${Placeholders.FirstTab}')`], + description: + 'Groups and indents all following output by an additional level, until console.groupEnd() is called.', +}; + +const consoleGroupEnd: ConsoleSnippet = { + key: 'consoleGroupEnd', + prefix: 'cge', + body: ['console.groupEnd()'], + description: 'Closes out the corresponding console.group().', +}; + +const consoleLog: ConsoleSnippet = { + key: 'consoleLog', + prefix: 'clg', + body: [`console.log(${Placeholders.FirstTab})`], + description: 'Displays a message in the console', +}; + +const consoleTrace: ConsoleSnippet = { + key: 'consoleTrace', + prefix: 'ctr', + body: [`console.trace(${Placeholders.FirstTab})`], + description: + 'Prints a stack trace from the point where the method was called', +}; + +const consoleLogObject: ConsoleSnippet = { + key: 'consoleLogObject', + prefix: 'clo', + body: [`console.log('${Placeholders.FirstTab}', ${Placeholders.FirstTab})`], + description: 'Logs property with name.', +}; + +const consoleLogJson: ConsoleSnippet = { + key: 'consoleLogJson', + prefix: 'clj', + body: [ + `console.log('${Placeholders.FirstTab}', JSON.stringify(${Placeholders.FirstTab}, null, 2))`, + ], + description: 'Logs stringified JSON property with name.', +}; + +const consoleTime: ConsoleSnippet = { + key: 'consoleTime', + prefix: 'ctm', + body: [`console.time('${Placeholders.FirstTab}')`], + description: 'Console time wrapper', +}; + +const consoleTimeEnd: ConsoleSnippet = { + key: 'consoleTimeEnd', + prefix: 'cte', + body: [`console.timeEnd('${Placeholders.FirstTab}')`], + description: 'Console time end wrapper', +}; + +const consoleWarn: ConsoleSnippet = { + key: 'consoleWarn', + prefix: 'cwa', + body: [`console.warn(${Placeholders.FirstTab})`], + description: + 'Displays a message in the console but also displays a yellow warning icon along with the logged message', +}; + +const consoleInfo: ConsoleSnippet = { + key: 'consoleInfo', + prefix: 'cin', + body: [`console.info(${Placeholders.FirstTab})`], + description: + 'Displays a message in the console but also displays a blue information icon along with the logged message', +}; + +const consoleTable: ConsoleSnippet = { + key: 'consoleTable', + prefix: 'ctl', + body: [`console.table([${Placeholders.FirstTab}])`], + description: 'Logs table to console', +}; + +export default [ + consoleAssert, + consoleClear, + consoleCount, + consoleDir, + consoleError, + consoleGroup, + consoleGroupEnd, + consoleLog, + consoleTrace, + consoleLogObject, + consoleLogJson, + consoleTime, + consoleTimeEnd, + consoleWarn, + consoleInfo, + consoleTable, +]; diff --git a/src/sourceSnippets/hooks.ts b/src/sourceSnippets/hooks.ts new file mode 100644 index 0000000..d8a0377 --- /dev/null +++ b/src/sourceSnippets/hooks.ts @@ -0,0 +1,122 @@ +import { Placeholders, SnippetMapping } from '../types'; + +type HookMappings = { + useState: 'useStateSnippet'; + useCallback: 'useCallbackSnippet'; + useContext: 'useContextSnippet'; + useEffect: 'useEffectSnippet'; + useImperativeHandle: 'useImperativeHandleSnippet'; + useLayoutEffect: 'useLayoutEffectSnippet'; + useMemo: 'useMemoSnippet'; + useReducer: 'useReducerSnippet'; + useRef: 'useRefSnippet'; +}; + +export type HooksSnippet = SnippetMapping; + +const useEffect: HooksSnippet = { + key: 'useEffect', + prefix: 'useEffectSnippet', + body: [ + 'useEffect(() => {', + ` ${Placeholders.FirstTab}`, + '', + ' return () => {', + ` ${Placeholders.SecondTab}`, + ' }', + `}, [${Placeholders.ThirdTab}])`, + '', + ], +}; + +const useContext: HooksSnippet = { + key: 'useContext', + prefix: 'useContextSnippet', + body: [ + `const ${Placeholders.FirstTab} = useContext(${Placeholders.SecondTab})`, + ], +}; + +const useState: HooksSnippet = { + key: 'useState', + prefix: 'useStateSnippet', + body: [ + `const [${Placeholders.FirstTab}, set${Placeholders.Capitalize}] = useState(${Placeholders.SecondTab})`, + ], +}; + +const useReducer: HooksSnippet = { + key: 'useReducer', + prefix: 'useReducerSnippet', + body: [ + `const [state, dispatch] = useReducer(${Placeholders.FirstTab}, ${Placeholders.SecondTab}, ${Placeholders.ThirdTab})`, + ], +}; + +const useCallback: HooksSnippet = { + key: 'useCallback', + prefix: 'useCallbackSnippet', + body: [ + 'useCallback(', + ' () => {', + ` ${Placeholders.FirstTab}`, + ' },', + ` [${Placeholders.SecondTab}],`, + ')', + '', + ], +}; + +const useMemo: HooksSnippet = { + key: 'useMemo', + prefix: 'useMemoSnippet', + body: [ + `useMemo(() => ${Placeholders.FirstTab}, [${Placeholders.SecondTab}])`, + ], +}; + +const useRef: HooksSnippet = { + key: 'useRef', + prefix: 'useRefSnippet', + body: [`const ${Placeholders.FirstTab} = useRef(${Placeholders.SecondTab})`], +}; + +const useImperativeHandle: HooksSnippet = { + key: 'useImperativeHandle', + prefix: 'useImperativeHandleSnippet', + body: [ + 'useImperativeHandle(', + ` ${Placeholders.FirstTab},`, + ' () => {', + ` ${Placeholders.SecondTab}`, + ' },', + ` [${Placeholders.ThirdTab}],`, + ')', + ], +}; + +const useLayoutEffect: HooksSnippet = { + key: 'useLayoutEffect', + prefix: 'useLayoutEffectSnippet', + body: [ + 'useLayoutEffect(() => {', + ` ${Placeholders.FirstTab}`, + '', + ' return () => {', + ` ${Placeholders.SecondTab}`, + ' };', + `}, [${Placeholders.ThirdTab}])`, + ], +}; + +export default [ + useCallback, + useContext, + useEffect, + useImperativeHandle, + useLayoutEffect, + useMemo, + useReducer, + useRef, + useState, +]; diff --git a/src/sourceSnippets/imports.ts b/src/sourceSnippets/imports.ts new file mode 100644 index 0000000..f28281b --- /dev/null +++ b/src/sourceSnippets/imports.ts @@ -0,0 +1,200 @@ +import { Placeholders, SnippetMapping } from '../types'; + +import { reactWithMemo } from './sharedSnippets'; + +type ImportsMappings = { + import: 'imp'; + importAs: 'ima'; + importBrowserRouter: 'imbr'; + importBrowserRouterWithRouteAndNavLink: 'imrr'; + importDestructing: 'imd'; + importEverything: 'ime'; + importNoModuleName: 'imn'; + importPropTypes: 'impt'; + importReact: 'imr'; + importReactDom: 'imrd'; + importReactWithComponent: 'imrc'; + importReactWithComponentAndPropTypes: 'imrcp'; + importReactWithMemo: 'imrm'; + importReactWithMemoAndPropTypes: 'imrmp'; + importReactWithPureComponent: 'imrpc'; + importReactWithPureComponentAndPropTypes: 'imrpcp'; + importReduxConnect: 'redux'; + importRouterLink: 'imbrl'; + importRouterNavLink: 'imbrnl'; + importRouterSetup: 'imbrc'; + importRouterSwitch: 'imbrs'; +}; + +export type ImportsSnippet = SnippetMapping; + +/** + * react, react-dom & prop-types + */ +const importReact: ImportsSnippet = { + key: 'importReact', + prefix: 'imr', + body: ["import React from 'react'"], +}; + +const importReactDom: ImportsSnippet = { + key: 'importReactDom', + prefix: 'imrd', + body: ["import ReactDOM from 'react-dom'"], +}; + +const importReactWithComponent: ImportsSnippet = { + key: 'importReactWithComponent', + prefix: 'imrc', + body: ["import React, { Component } from 'react'"], +}; + +const importReactWithComponentAndPropTypes: ImportsSnippet = { + key: 'importReactWithComponentAndPropTypes', + prefix: 'imrcp', + body: [ + "import React, { Component } from 'react'", + "import PropTypes from 'prop-types'", + '', + ], +}; + +const importReactWithPureComponent: ImportsSnippet = { + key: 'importReactWithPureComponent', + prefix: 'imrpc', + body: ["import React, { PureComponent } from 'react'"], +}; + +const importReactWithPureComponentAndPropTypes: ImportsSnippet = { + key: 'importReactWithPureComponentAndPropTypes', + prefix: 'imrpcp', + body: [ + "import React, { PureComponent } from 'react'", + "import PropTypes from 'prop-types'", + '', + ], +}; + +const importReactWithMemo: ImportsSnippet = { + key: 'importReactWithMemo', + prefix: 'imrm', + body: reactWithMemo, +}; + +const importReactWithMemoAndPropTypes: ImportsSnippet = { + key: 'importReactWithMemoAndPropTypes', + prefix: 'imrmp', + body: [...reactWithMemo, "import PropTypes from 'prop-types'", ''], +}; + +const importPropTypes: ImportsSnippet = { + key: 'importPropTypes', + prefix: 'impt', + body: ["import PropTypes from 'prop-types'"], +}; + +/** + * react-router + */ + +const importBrowserRouter: ImportsSnippet = { + key: 'importBrowserRouter', + prefix: 'imbr', + body: ["import { BrowserRouter as Router } from 'react-router-dom'"], +}; + +const importBrowserRouterWithRouteAndNavLink: ImportsSnippet = { + key: 'importBrowserRouterWithRouteAndNavLink', + prefix: 'imrr', + body: [ + "import { BrowserRouter as Router, Route, NavLink } from 'react-router-dom'", + '', + ], +}; + +const importRouterSetup: ImportsSnippet = { + key: 'importRouterSetup', + prefix: 'imbrc', + body: ["import { Route, Switch, NavLink, Link } from 'react-router-dom'"], +}; + +const importRouterSwitch: ImportsSnippet = { + key: 'importRouterSwitch', + prefix: 'imbrs', + body: ["import { Switch } from 'react-router-dom'"], +}; + +const importRouterLink: ImportsSnippet = { + key: 'importRouterLink', + prefix: 'imbrl', + body: ["import { Link } from 'react-router-dom'"], +}; + +const importRouterNavLink: ImportsSnippet = { + key: 'importRouterNavLink', + prefix: 'imbrnl', + body: ["import { NavLink } from 'react-router-dom'"], +}; + +/** + * Others + */ + +const importSnippet: ImportsSnippet = { + key: 'import', + prefix: 'imp', + body: [`import ${Placeholders.SecondTab} from '${Placeholders.FirstTab}'`], +}; + +const importNoModuleName: ImportsSnippet = { + key: 'importNoModuleName', + prefix: 'imn', + body: [`import '${Placeholders.FirstTab}'`], +}; + +const importDestructing: ImportsSnippet = { + key: 'importDestructing', + prefix: 'imd', + body: [ + `import { ${Placeholders.SecondTab} } from '${Placeholders.FirstTab}'`, + ], +}; + +const importEverything: ImportsSnippet = { + key: 'importEverything', + prefix: 'ime', + body: [ + `import * as ${Placeholders.SecondTab} from '${Placeholders.FirstTab}'`, + ], +}; + +const importAs: ImportsSnippet = { + key: 'importAs', + prefix: 'ima', + body: [ + `import { ${Placeholders.SecondTab} as ${Placeholders.ThirdTab} } from '${Placeholders.FirstTab}'`, + ], +}; + +export default [ + importAs, + importBrowserRouter, + importBrowserRouterWithRouteAndNavLink, + importDestructing, + importEverything, + importNoModuleName, + importPropTypes, + importReact, + importReactDom, + importReactWithComponent, + importReactWithComponentAndPropTypes, + importReactWithMemo, + importReactWithMemoAndPropTypes, + importReactWithPureComponent, + importReactWithPureComponentAndPropTypes, + importRouterLink, + importRouterNavLink, + importRouterSetup, + importRouterSwitch, + importSnippet, +]; diff --git a/src/sourceSnippets/others.ts b/src/sourceSnippets/others.ts new file mode 100644 index 0000000..76bf1db --- /dev/null +++ b/src/sourceSnippets/others.ts @@ -0,0 +1,451 @@ +import { Placeholders, SnippetMapping } from '../types'; + +type OthersMapping = { + commentBigBlock: 'cmmb'; + anonymousFunction: 'anfn'; + bindThis: 'bnd'; + classConstructor: 'rconst'; + componentDidMount: 'cdm'; + componentDidUpdate: 'cdup'; + componentProps: 'props'; + componentSetStateFunc: 'ssf'; + componentSetStateObject: 'sst'; + componentState: 'state'; + componentWillUnmount: 'cwun'; + createContext: 'rcontext'; + createRef: 'cref'; + destructProps: 'cp'; + destructState: 'cs'; + destructingArray: 'dar'; + destructingObject: 'dob'; + emptyState: 'est'; + exportAs: 'exa'; + exportDefault: 'exp'; + exportDefaultFunction: 'edf'; + exportDefaultNamedFunction: 'ednf'; + exportDestructing: 'exd'; + exportNamedFunction: 'enf'; + forEach: 'fre'; + forIn: 'fin'; + forOf: 'fof'; + getDerivedStateFromProps: 'gdsfp'; + getSnapshotBeforeUpdate: 'gsbu'; + hocComponent: 'hoc'; + hocComponentWithRedux: 'hocredux'; + method: 'met'; + namedFunction: 'nfn'; + promise: 'prom'; + propertyGet: 'pge'; + propertySet: 'pse'; + setInterval: 'sti'; + setTimeOut: 'sto'; + shouldComponentUpdate: 'scu'; + typeofSnippet: 'tpf'; +}; + +export type OthersSnippet = SnippetMapping; + +const exportDefault: OthersSnippet = { + key: 'exportDefault', + prefix: 'exp', + body: [`export default ${Placeholders.FirstTab}`], +}; + +const exportDestructing: OthersSnippet = { + key: 'exportDestructing', + prefix: 'exd', + body: [ + `export { ${Placeholders.SecondTab} } from '${Placeholders.FirstTab}'`, + ], +}; + +const exportAs: OthersSnippet = { + key: 'exportAs', + prefix: 'exa', + body: [ + `export { ${Placeholders.SecondTab} as ${Placeholders.ThirdTab} } from '${Placeholders.FirstTab}'`, + ], +}; + +const exportNamedFunction: OthersSnippet = { + key: 'exportNamedFunction', + prefix: 'enf', + body: [ + `export const ${Placeholders.FirstTab} = (${Placeholders.SecondTab}) => {${Placeholders.ThirdTab}}`, + ], + description: 'Export named function', +}; + +const exportDefaultFunction: OthersSnippet = { + key: 'exportDefaultFunction', + prefix: 'edf', + body: [ + `export default (${Placeholders.FirstTab}) => {${Placeholders.SecondTab}}`, + ], + description: 'Export default function', +}; + +const exportDefaultNamedFunction: OthersSnippet = { + key: 'exportDefaultNamedFunction', + prefix: 'ednf', + body: [ + `export default function ${Placeholders.FirstTab}(${Placeholders.SecondTab}) {${Placeholders.ThirdTab}}`, + ], + description: 'Export default named function', +}; + +const method: OthersSnippet = { + key: 'method', + prefix: 'met', + body: [ + `${Placeholders.FirstTab} = (${Placeholders.SecondTab}) => {${Placeholders.ThirdTab}}`, + ], + description: 'Creates a method inside a class', +}; + +const propertyGet: OthersSnippet = { + key: 'propertyGet', + prefix: 'pge', + body: [ + `get ${Placeholders.FirstTab}() {`, + ` return this.${Placeholders.SecondTab}`, + '}', + ], + description: 'Creates a getter property inside a class', +}; + +const propertySet: OthersSnippet = { + key: 'propertySet', + prefix: 'pse', + body: [ + `set ${Placeholders.FirstTab}(${Placeholders.SecondTab}) {${Placeholders.ThirdTab}}`, + ], + description: 'Creates a setter property inside a class', +}; + +const forEach: OthersSnippet = { + key: 'forEach', + prefix: 'fre', + body: [ + `${Placeholders.FirstTab}.forEach(${Placeholders.SecondTab} => {${Placeholders.ThirdTab}})`, + ], + description: 'Creates a forEach statement', +}; + +const forOf: OthersSnippet = { + key: 'forOf', + prefix: 'fof', + body: [ + `for(let ${Placeholders.FirstTab} of ${Placeholders.SecondTab}) {${Placeholders.ThirdTab}}`, + ], + description: 'Iterating over property names of iterable objects', +}; + +const forIn: OthersSnippet = { + key: 'forIn', + prefix: 'fin', + body: [ + `for(let ${Placeholders.FirstTab} in ${Placeholders.SecondTab}) {${Placeholders.ThirdTab}}`, + ], + description: 'Iterating over property values of iterable objects', +}; + +const anonymousFunction: OthersSnippet = { + key: 'anonymousFunction', + prefix: 'anfn', + body: [`(${Placeholders.FirstTab}) => { ${Placeholders.SecondTab} }`], + description: 'Creates an anonymous function', +}; + +const namedFunction: OthersSnippet = { + key: 'namedFunction', + prefix: 'nfn', + body: [ + `const ${Placeholders.FirstTab} = (${Placeholders.SecondTab}) => { ${Placeholders.ThirdTab} }`, + ], + description: 'Creates a named function', +}; + +const destructingObject: OthersSnippet = { + key: 'destructingObject', + prefix: 'dob', + body: [`const {${Placeholders.SecondTab}} = ${Placeholders.FirstTab}`], + description: 'Creates and assigns a local variable using object destructing', +}; + +const destructingArray: OthersSnippet = { + key: 'destructingArray', + prefix: 'dar', + body: [`const [${Placeholders.SecondTab}] = ${Placeholders.FirstTab}`], + description: 'Creates and assigns a local variable using array destructing', +}; + +const setInterval: OthersSnippet = { + key: 'setInterval', + prefix: 'sti', + body: [ + `setInterval(() => { ${Placeholders.FirstTab} }, ${Placeholders.SecondTab})`, + ], + description: 'Executes the given function at specified intervals', +}; + +const setTimeOut: OthersSnippet = { + key: 'setTimeOut', + prefix: 'sto', + body: [ + `setTimeout(() => { ${Placeholders.FirstTab} }, ${Placeholders.SecondTab})`, + ], + description: 'Executes the given function after the specified delay', +}; + +const promise: OthersSnippet = { + key: 'promise', + prefix: 'prom', + body: [ + `return new Promise((resolve, reject) => { ${Placeholders.FirstTab} })`, + ], + description: 'Creates and returns a new Promise in the standard ES7 syntax', +}; + +const destructProps: OthersSnippet = { + key: 'destructProps', + prefix: 'cp', + body: [`const { ${Placeholders.FirstTab} } = this.props`], + description: 'Creates and assigns a local variable using props destructing', +}; + +const destructState: OthersSnippet = { + key: 'destructState', + prefix: 'cs', + body: [`const { ${Placeholders.FirstTab} } = this.state`], + description: 'Creates and assigns a local variable using state destructing', +}; + +const classConstructor: OthersSnippet = { + key: 'classConstructor', + prefix: 'rconst', + body: [ + 'constructor(props) {', + ' super(props)', + '', + ' this.state = {', + ` ${Placeholders.FirstTab}`, + ' }', + '}', + ], + description: + "Adds a default constructor for it('', () => {})the class that contains props as arguments", +}; + +const emptyState: OthersSnippet = { + key: 'emptyState', + prefix: 'est', + body: [`state = { ${Placeholders.FirstTab} }`], + description: 'Creates empty state object. To be used in a constructor.', +}; + +const componentDidMount: OthersSnippet = { + key: 'componentDidMount', + prefix: 'cdm', + body: [`componentDidMount() { ${Placeholders.FirstTab} }`], + description: + 'Invoked once, only on the client (not on the server), immediately after the initial rendering occurs.', +}; + +const shouldComponentUpdate: OthersSnippet = { + key: 'shouldComponentUpdate', + prefix: 'scu', + body: [ + `shouldComponentUpdate(nextProps, nextState) { ${Placeholders.FirstTab} }`, + ], + description: + 'Invoked before rendering when new props or state are being received. ', +}; + +const componentDidUpdate: OthersSnippet = { + key: 'componentDidUpdate', + prefix: 'cdup', + body: [ + `componentDidUpdate(prevProps, prevState) { ${Placeholders.FirstTab}} `, + ], + description: + "Invoked immediately after the component's updates are flushed to the DOM.", +}; + +const componentWillUnmount: OthersSnippet = { + key: 'componentWillUnmount', + prefix: 'cwun', + body: [`componentWillUnmount() {${Placeholders.FirstTab} }`], + description: + 'Invoked immediately before a component is unmounted from the DOM.', +}; + +const getDerivedStateFromProps: OthersSnippet = { + key: 'getDerivedStateFromProps', + prefix: 'gdsfp', + body: [ + `static getDerivedStateFromProps(props, state) {${Placeholders.FirstTab}}`, + ], + description: + 'Invoked right before calling the render method, both on the initial mount and on subsequent updates.', +}; + +const getSnapshotBeforeUpdate: OthersSnippet = { + key: 'getSnapshotBeforeUpdate', + prefix: 'gsbu', + body: [ + `getSnapshotBeforeUpdate = (prevProps, prevState) => {${Placeholders.FirstTab}}`, + ], + description: + 'Called right before mutations are made (e.g. before the DOM is updated)', +}; + +const createContext: OthersSnippet = { + key: 'createContext', + prefix: 'rcontext', + body: [`const ${Placeholders.FirstTab} = React.createContext()`], + description: 'Create React context', +}; + +const createRef: OthersSnippet = { + key: 'createRef', + prefix: 'cref', + body: [`this.${Placeholders.FirstTab}Ref = React.createRef()`], + description: 'Create ref statement used inside constructor', +}; + +const componentSetStateObject: OthersSnippet = { + key: 'componentSetStateObject', + prefix: 'sst', + body: [`this.setState({${Placeholders.FirstTab}})`], + description: 'Performs a shallow merge of nextState into current state', +}; + +const componentSetStateFunc: OthersSnippet = { + key: 'componentSetStateFunc', + prefix: 'ssf', + body: [ + `this.setState((state, props) => { return { ${Placeholders.FirstTab} }})`, + ], + description: 'Performs a shallow merge of nextState into current state', +}; + +const componentProps: OthersSnippet = { + key: 'componentProps', + prefix: 'props', + body: [`this.props.${Placeholders.FirstTab}`], + description: "Access component's props", +}; + +const componentState: OthersSnippet = { + key: 'componentState', + prefix: 'state', + body: [`this.state.${Placeholders.FirstTab}`], +}; + +const bindThis: OthersSnippet = { + key: 'bindThis', + prefix: 'bnd', + body: [ + `this.${Placeholders.FirstTab} = this.${Placeholders.FirstTab}.bind(this)`, + ], + description: 'Binds this to a method', +}; + +const commentBigBlock: OthersSnippet = { + key: 'commentBigBlock', + prefix: 'cmmb', + body: ['/**', ` * ${Placeholders.FirstTab}`, ' */'], +}; + +const hocComponentWithRedux: OthersSnippet = { + key: 'hocComponentWithRedux', + prefix: 'hocredux', + body: [ + "import React from 'react'", + "import { connect } from 'react-redux'", + "import PropTypes from 'prop-types'", + '', + 'export const mapStateToProps = state => ({})', + '', + 'export const mapDispatchToProps = {}', + '', + `export const ${Placeholders.FirstTab} = (WrappedComponent) => {`, + ' const hocComponent = ({ ...props }) => ', + '', + ' hocComponent.propTypes = {}', + '', + ' return hocComponent', + '}', + '', + `export default WrapperComponent => connect(mapStateToProps, mapDispatchToProps)(${Placeholders.FirstTab}(WrapperComponent))`, + '', + ], +}; + +const hocComponent: OthersSnippet = { + key: 'hocComponent', + prefix: 'hoc', + body: [ + "import React from 'react'", + "import PropTypes from 'prop-types'", + '', + 'export default (WrappedComponent) => {', + ' const hocComponent = ({ ...props }) => ', + '', + ' hocComponent.propTypes = {}', + '', + ' return hocComponent', + '}', + '', + ], +}; + +const typeofSnippet: OthersSnippet = { + key: 'typeofSnippet', + prefix: 'tpf', + body: [`typeof ${Placeholders.FirstTab}`], +}; + +export default [ + exportDefault, + exportDestructing, + exportAs, + exportNamedFunction, + exportDefaultFunction, + exportDefaultNamedFunction, + method, + propertyGet, + propertySet, + forEach, + forOf, + forIn, + anonymousFunction, + namedFunction, + destructingObject, + destructingArray, + setInterval, + setTimeOut, + promise, + destructProps, + destructState, + classConstructor, + emptyState, + componentDidMount, + shouldComponentUpdate, + componentDidUpdate, + componentWillUnmount, + getDerivedStateFromProps, + getSnapshotBeforeUpdate, + createContext, + createRef, + componentSetStateObject, + componentSetStateFunc, + componentProps, + componentState, + bindThis, + commentBigBlock, + hocComponentWithRedux, + hocComponent, + typeofSnippet, +]; diff --git a/src/sourceSnippets/propTypes.ts b/src/sourceSnippets/propTypes.ts new file mode 100644 index 0000000..3fd13cc --- /dev/null +++ b/src/sourceSnippets/propTypes.ts @@ -0,0 +1,291 @@ +import { SnippetMapping } from '../types'; + +type PropTypesMapping = { + propTypeAny: 'ptany'; + propTypeArray: 'pta'; + propTypeArrayOf: 'ptao'; + propTypeArrayOfRequired: 'ptaor'; + propTypeArrayRequired: 'ptar'; + propTypeBool: 'ptb'; + propTypeBoolRequired: 'ptbr'; + propTypeElement: 'ptel'; + propTypeElementRequired: 'ptelr'; + propTypeEnum: 'pte'; + propTypeEnumRequired: 'pter'; + propTypeExact: 'ptex'; + propTypeExactRequired: 'ptexr'; + propTypeFunc: 'ptf'; + propTypeFuncRequired: 'ptfr'; + propTypeInstanceOf: 'pti'; + propTypeInstanceOfRequired: 'ptir'; + propTypeNode: 'ptnd'; + propTypeNodeRequired: 'ptndr'; + propTypeNumber: 'ptn'; + propTypeNumberRequired: 'ptnr'; + propTypeObject: 'pto'; + propTypeObjectOf: 'ptoo'; + propTypeObjectOfRequired: 'ptoor'; + propTypeObjectRequired: 'ptor'; + propTypeOneOfType: 'ptet'; + propTypeOneOfTypeRequired: 'ptetr'; + propTypeShape: 'ptsh'; + propTypeShapeRequired: 'ptshr'; + propTypeString: 'pts'; + propTypeStringRequired: 'ptsr'; +}; + +export type PropTypesSnippet = SnippetMapping; + +const propTypeArray: PropTypesSnippet = { + key: 'propTypeArray', + prefix: 'pta', + body: ['PropTypes.array'], + description: 'Array prop type', +}; + +const propTypeArrayRequired: PropTypesSnippet = { + key: 'propTypeArrayRequired', + prefix: 'ptar', + body: ['PropTypes.array.isRequired'], + description: 'Array prop type required', +}; + +const propTypeBool: PropTypesSnippet = { + key: 'propTypeBool', + prefix: 'ptb', + body: ['PropTypes.bool'], + description: 'Bool prop type', +}; + +const propTypeBoolRequired: PropTypesSnippet = { + key: 'propTypeBoolRequired', + prefix: 'ptbr', + body: ['PropTypes.bool.isRequired'], + description: 'Bool prop type required', +}; + +const propTypeFunc: PropTypesSnippet = { + key: 'propTypeFunc', + prefix: 'ptf', + body: ['PropTypes.func'], + description: 'Func prop type', +}; + +const propTypeFuncRequired: PropTypesSnippet = { + key: 'propTypeFuncRequired', + prefix: 'ptfr', + body: ['PropTypes.func.isRequired'], + description: 'Func prop type required', +}; + +const propTypeNumber: PropTypesSnippet = { + key: 'propTypeNumber', + prefix: 'ptn', + body: ['PropTypes.number'], + description: 'Number prop type', +}; + +const propTypeNumberRequired: PropTypesSnippet = { + key: 'propTypeNumberRequired', + prefix: 'ptnr', + body: ['PropTypes.number.isRequired'], + description: 'Number prop type required', +}; + +const propTypeObject: PropTypesSnippet = { + key: 'propTypeObject', + prefix: 'pto', + body: ['PropTypes.object'], + description: 'Object prop type', +}; + +const propTypeObjectRequired: PropTypesSnippet = { + key: 'propTypeObjectRequired', + prefix: 'ptor', + body: ['PropTypes.object.isRequired'], + description: 'Object prop type required', +}; + +const propTypeString: PropTypesSnippet = { + key: 'propTypeString', + prefix: 'pts', + body: ['PropTypes.string'], + description: 'String prop type', +}; + +const propTypeStringRequired: PropTypesSnippet = { + key: 'propTypeStringRequired', + prefix: 'ptsr', + body: ['PropTypes.string.isRequired'], + description: 'String prop type required', +}; + +const propTypeNode: PropTypesSnippet = { + key: 'propTypeNode', + prefix: 'ptnd', + body: ['PropTypes.node'], + description: + 'Anything that can be rendered: numbers, strings, elements or an array', +}; + +const propTypeNodeRequired: PropTypesSnippet = { + key: 'propTypeNodeRequired', + prefix: 'ptndr', + body: ['PropTypes.node.isRequired'], + description: + 'Anything that can be rendered: numbers, strings, elements or an array required', +}; + +const propTypeElement: PropTypesSnippet = { + key: 'propTypeElement', + prefix: 'ptel', + body: ['PropTypes.element'], + description: 'React element prop type', +}; + +const propTypeElementRequired: PropTypesSnippet = { + key: 'propTypeElementRequired', + prefix: 'ptelr', + body: ['PropTypes.element.isRequired'], + description: 'React element prop type required', +}; + +const propTypeInstanceOf: PropTypesSnippet = { + key: 'propTypeInstanceOf', + prefix: 'pti', + body: ['PropTypes.instanceOf($0)'], + description: 'Is an instance of a class prop type', +}; + +const propTypeInstanceOfRequired: PropTypesSnippet = { + key: 'propTypeInstanceOfRequired', + prefix: 'ptir', + body: ['PropTypes.instanceOf($0).isRequired'], + description: 'Is an instance of a class prop type required', +}; + +const propTypeEnum: PropTypesSnippet = { + key: 'propTypeEnum', + prefix: 'pte', + body: ["PropTypes.oneOf(['$0'])"], + description: 'Prop type limited to specific values by treating it as an enum', +}; + +const propTypeEnumRequired: PropTypesSnippet = { + key: 'propTypeEnumRequired', + prefix: 'pter', + body: ["PropTypes.oneOf(['$0']).isRequired"], + description: + 'Prop type limited to specific values by treating it as an enum required', +}; + +const propTypeOneOfType: PropTypesSnippet = { + key: 'propTypeOneOfType', + prefix: 'ptet', + body: ['PropTypes.oneOfType([', ' $0', '])'], + description: 'An object that could be one of many types', +}; + +const propTypeOneOfTypeRequired: PropTypesSnippet = { + key: 'propTypeOneOfTypeRequired', + prefix: 'ptetr', + body: ['PropTypes.oneOfType([', ' $0', ']).isRequired'], + description: 'An object that could be one of many types required', +}; + +const propTypeArrayOf: PropTypesSnippet = { + key: 'propTypeArrayOf', + prefix: 'ptao', + body: ['PropTypes.arrayOf($0)'], + description: 'An array of a certain type', +}; + +const propTypeArrayOfRequired: PropTypesSnippet = { + key: 'propTypeArrayOfRequired', + prefix: 'ptaor', + body: ['PropTypes.arrayOf($0).isRequired'], + description: 'An array of a certain type required', +}; + +const propTypeObjectOf: PropTypesSnippet = { + key: 'propTypeObjectOf', + prefix: 'ptoo', + body: ['PropTypes.objectOf($0)'], + description: 'An object with property values of a certain type', +}; + +const propTypeObjectOfRequired: PropTypesSnippet = { + key: 'propTypeObjectOfRequired', + prefix: 'ptoor', + body: ['PropTypes.objectOf($0).isRequired'], + description: 'An object with property values of a certain type required', +}; + +const propTypeShape: PropTypesSnippet = { + key: 'propTypeShape', + prefix: 'ptsh', + body: ['PropTypes.shape({', ' $0', '})'], + description: 'An object taking on a particular shape', +}; + +const propTypeShapeRequired: PropTypesSnippet = { + key: 'propTypeShapeRequired', + prefix: 'ptshr', + body: ['PropTypes.shape({', ' $0', '}).isRequired'], + description: 'An object taking on a particular shape required', +}; + +const propTypeExact: PropTypesSnippet = { + key: 'propTypeExact', + prefix: 'ptex', + body: ['PropTypes.exact({', ' $0', '})'], + description: 'An object with warnings on extra properties', +}; + +const propTypeExactRequired: PropTypesSnippet = { + key: 'propTypeExactRequired', + prefix: 'ptexr', + body: ['PropTypes.exact({', ' $0', '}).isRequired'], + description: 'An object with warnings on extra properties required', +}; + +const propTypeAny: PropTypesSnippet = { + key: 'propTypeAny', + prefix: 'ptany', + body: ['PropTypes.any'], + description: 'Any prop type', +}; + +export default [ + propTypeArray, + propTypeArrayRequired, + propTypeBool, + propTypeBoolRequired, + propTypeFunc, + propTypeFuncRequired, + propTypeNumber, + propTypeNumberRequired, + propTypeObject, + propTypeObjectRequired, + propTypeString, + propTypeStringRequired, + propTypeNode, + propTypeNodeRequired, + propTypeElement, + propTypeElementRequired, + propTypeInstanceOf, + propTypeInstanceOfRequired, + propTypeEnum, + propTypeEnumRequired, + propTypeOneOfType, + propTypeOneOfTypeRequired, + propTypeArrayOf, + propTypeArrayOfRequired, + propTypeObjectOf, + propTypeObjectOfRequired, + propTypeShape, + propTypeShapeRequired, + propTypeExact, + propTypeExactRequired, + propTypeAny, +]; diff --git a/src/sourceSnippets/reactNative.ts b/src/sourceSnippets/reactNative.ts new file mode 100644 index 0000000..0a06d6c --- /dev/null +++ b/src/sourceSnippets/reactNative.ts @@ -0,0 +1,196 @@ +import { Placeholders, SnippetMapping } from '../types'; + +import { + exportDefault, + react, + reactComponent, + reactPureComponent, +} from './sharedSnippets'; + +type ReactNativeMapping = { + reactNativeImport: 'imrn'; + reactNativeStyles: 'rnstyle'; + reactNativeComponent: 'rnc'; + reactNativeComponentWithStyles: 'rncs'; + reactNativeComponentExport: 'rnce'; + reactNativePureComponent: 'rnpc'; + reactNativePureComponentExport: 'rnpce'; + reactNativeFunctionalExportComponent: 'rnfe'; + reactNativeFunctionalExportComponentWithStyles: 'rnfes'; + reactNativeFunctionalComponent: 'rnf'; + reactNativeFunctionalComponentWithStyles: 'rnfs'; +}; + +export type ReactNativeSnippet = SnippetMapping; + +const reactNativeStylesSnippet = ['const styles = StyleSheet.create({})']; +const reactNativeComponentReturn = [ + ' render() {', + ' return (', + ' ', + ` ${Placeholders.FirstTab}`, + ' ', + ' )', + ' }', +]; + +const reactNativeReturn = [ + ' return (', + ' ', + ` ${Placeholders.FirstTab}`, + ' ', + ' )', +]; + +const reactNativeImport: ReactNativeSnippet = { + key: 'reactNativeImport', + prefix: 'imrn', + body: [`import { ${Placeholders.FirstTab} } from 'react-native'`], +}; + +const reactNativeStyles: ReactNativeSnippet = { + key: 'reactNativeStyles', + prefix: 'rnstyle', + body: [`const styles = StyleSheet.create({${Placeholders.FirstTab}})`], +}; + +const reactNativeComponent: ReactNativeSnippet = { + key: 'reactNativeComponent', + prefix: 'rnc', + body: [ + "import { Text, View } from 'react-native'", + ...reactComponent, + '', + `export default class ${Placeholders.FileName} extends Component {`, + ...reactNativeComponentReturn, + '}', + ], +}; + +const reactNativeComponentWithStyles: ReactNativeSnippet = { + key: 'reactNativeComponentWithStyles', + prefix: 'rncs', + body: [ + "import { Text, StyleSheet, View } from 'react-native'", + ...reactComponent, + '', + `export default class ${Placeholders.FileName} extends Component {`, + ...reactNativeComponentReturn, + '}', + '', + ...reactNativeStylesSnippet, + ], +}; + +const reactNativeComponentExport: ReactNativeSnippet = { + key: 'reactNativeComponentExport', + prefix: 'rnce', + body: [ + "import { Text, View } from 'react-native'", + ...reactComponent, + '', + `export class ${Placeholders.FileName} extends Component {`, + ...reactNativeComponentReturn, + '}', + ...exportDefault, + ], +}; + +const reactNativePureComponent: ReactNativeSnippet = { + key: 'reactNativePureComponent', + prefix: 'rnpc', + body: [ + "import { Text, View } from 'react-native'", + ...reactPureComponent, + '', + `export default class ${Placeholders.FileName} extends PureComponent {`, + ...reactNativeComponentReturn, + '}', + ], +}; + +const reactNativePureComponentExport: ReactNativeSnippet = { + key: 'reactNativePureComponentExport', + prefix: 'rnpce', + body: [ + "import { Text, View } from 'react-native'", + ...reactPureComponent, + '', + `export class ${Placeholders.FileName} extends PureComponent {`, + ...reactNativeComponentReturn, + '}', + ...exportDefault, + ], +}; + +const reactNativeFunctionalExportComponent: ReactNativeSnippet = { + key: 'reactNativeFunctionalExportComponent', + prefix: 'rnfe', + body: [ + "import { View, Text } from 'react-native'", + ...react, + '', + `const ${Placeholders.FileName} = () => {`, + ...reactNativeReturn, + '}', + ...exportDefault, + ], +}; + +const reactNativeFunctionalExportComponentWithStyles: ReactNativeSnippet = { + key: 'reactNativeFunctionalExportComponentWithStyles', + prefix: 'rnfes', + body: [ + "import { StyleSheet, Text, View } from 'react-native'", + ...react, + '', + `const ${Placeholders.FileName} = () => {`, + ...reactNativeReturn, + '}', + ...exportDefault, + '', + ...reactNativeStylesSnippet, + ], +}; + +const reactNativeFunctionalComponent: ReactNativeSnippet = { + key: 'reactNativeFunctionalComponent', + prefix: 'rnf', + body: [ + "import { View, Text } from 'react-native'", + ...react, + '', + `export default function ${Placeholders.FileName}() {`, + ...reactNativeReturn, + '}', + ], +}; + +const reactNativeFunctionalComponentWithStyles: ReactNativeSnippet = { + key: 'reactNativeFunctionalComponentWithStyles', + prefix: 'rnfs', + body: [ + "import { StyleSheet, Text, View } from 'react-native'", + ...react, + '', + `export default function ${Placeholders.FileName}() {`, + ...reactNativeReturn, + '}', + '', + ...reactNativeStylesSnippet, + ], +}; + +export default [ + reactNativeComponent, + reactNativeComponentExport, + reactNativeComponentWithStyles, + reactNativeFunctionalComponent, + reactNativeFunctionalComponentWithStyles, + reactNativeFunctionalExportComponent, + reactNativeFunctionalExportComponentWithStyles, + reactNativeImport, + reactNativePureComponent, + reactNativePureComponentExport, + reactNativeStyles, +]; diff --git a/src/sourceSnippets/redux.ts b/src/sourceSnippets/redux.ts new file mode 100644 index 0000000..0315fc9 --- /dev/null +++ b/src/sourceSnippets/redux.ts @@ -0,0 +1,109 @@ +import { Placeholders, SnippetMapping } from '../types'; + +type ReduxMapping = { + importReduxConnect: 'redux'; + reduxAction: 'rxaction'; + reduxConst: 'rxconst'; + reduxReducer: 'rxreducer'; + reduxSelector: 'rxselect'; + reduxSlice: 'rxslice'; + mappingToProps: 'reduxmap'; +}; + +export type ReduxSnippet = SnippetMapping; + +const importReduxConnect: ReduxSnippet = { + key: 'importReduxConnect', + prefix: 'redux', + body: ["import { connect } from 'react-redux'"], +}; + +const reduxAction: ReduxSnippet = { + key: 'reduxAction', + prefix: 'rxaction', + body: [ + `export const ${Placeholders.FirstTab} = (payload) => ({`, + ` type: ${Placeholders.SecondTab},`, + ' payload', + '})', + '', + ], +}; + +const reduxConst: ReduxSnippet = { + key: 'reduxConst', + prefix: 'rxconst', + body: [`export const ${Placeholders.FirstTab} = '${Placeholders.FirstTab}'`], +}; + +const reduxReducer: ReduxSnippet = { + key: 'reduxReducer', + prefix: 'rxreducer', + body: [ + 'const initialState = {}', + '', + 'export default (state = initialState, { type, payload }) => {', + ' switch (type) {', + '', + ` case ${Placeholders.FirstTab}:`, + ' return { ...state, ...payload }', + '', + ' default:', + ' return state', + ' }', + '}', + '', + ], +}; + +const reduxSelector: ReduxSnippet = { + key: 'reduxSelector', + prefix: 'rxselect', + body: [ + "import { createSelector } from 'reselect'", + '', + `export const ${Placeholders.FirstTab} = state => state.${Placeholders.SecondTab}`, + ], +}; + +const reduxSlice: ReduxSnippet = { + key: 'reduxSlice', + prefix: 'rxslice', + body: [ + "import { createSlice } from '@reduxjs/toolkit'", + '', + 'const initialState = {', + '', + '}', + '', + `const ${Placeholders.FileName} = createSlice({`, + ` name: ${Placeholders.SecondTab},`, + ' initialState,', + ' reducers: {}', + '});', + '', + `export const {} = ${Placeholders.FileName}.actions`, + '', + `export default ${Placeholders.FileName}.reducer`, + ], +}; + +const mappingToProps: ReduxSnippet = { + key: 'mappingToProps', + prefix: 'reduxmap', + body: [ + 'const mapStateToProps = (state) => ({})', + '', + 'const mapDispatchToProps = {}', + ], +}; + +export default [ + importReduxConnect, + reduxAction, + reduxConst, + reduxReducer, + reduxSelector, + reduxSlice, + mappingToProps, +]; diff --git a/src/sourceSnippets/sharedSnippets.ts b/src/sourceSnippets/sharedSnippets.ts new file mode 100644 index 0000000..6a199ac --- /dev/null +++ b/src/sourceSnippets/sharedSnippets.ts @@ -0,0 +1,55 @@ +import { Placeholders } from '../types'; + +export const reactComponent = ["import React, { Component } from 'react'"]; +export const react = ["import React from 'react'"]; +export const reactPureComponent = [ + "import React, { PureComponent } from 'react'", +]; +export const reactPropTypes = [ + "import React from 'react'", + "import PropTypes from 'prop-types'", +]; + +export const reactWithReduxConnect = [ + "import React from 'react'", + "import { connect } from 'react-redux'", +]; + +export const reactComponentWithReduxConnect = [ + "import React, { Component } from 'react'", + "import { connect } from 'react-redux'", +]; + +export const reactWithMemo = ["import React, { memo } from 'react'"]; + +export const reduxComponentExport = [ + '', + 'const mapStateToProps = (state) => ({})', + '', + 'const mapDispatchToProps = {}', + '', + `export default connect(mapStateToProps, mapDispatchToProps)(${Placeholders.FileName})`, +]; + +export const innerComponent = [ + ' return (', + `
${Placeholders.FirstTab}
`, + ' )', +]; + +export const innerComponentReturn = [ + ' render() {', + ' return (', + `
${Placeholders.FirstTab}
`, + ' )', + ' }', +]; + +export const exportDefault = ['', `export default ${Placeholders.FileName}`]; + +export const propsTypeInterface = [Placeholders.TypeProps, '']; +export const stateTypeInterface = [Placeholders.TypeState, '']; +export const propsStateInterface = [ + ...propsTypeInterface, + ...stateTypeInterface, +]; diff --git a/src/sourceSnippets/tests.ts b/src/sourceSnippets/tests.ts new file mode 100644 index 0000000..73ebadb --- /dev/null +++ b/src/sourceSnippets/tests.ts @@ -0,0 +1,159 @@ +import { Placeholders, SnippetMapping } from '../types'; + +type TestMapping = { + describeBlock: 'desc'; + itAsyncBlock: 'tita'; + itBlock: 'tit'; + setupReactComponentTestWithRedux: 'srtest'; + setupReactNativeTest: 'sntest'; + setupReactNativeTestWithRedux: 'snrtest'; + setupReactTest: 'stest'; + testAsyncBlock: 'testa'; + testBlock: 'test'; +}; + +export type TestsSnippet = SnippetMapping; + +const describeBlock: TestsSnippet = { + key: 'describeBlock', + prefix: 'desc', + body: [ + `describe('${Placeholders.FirstTab}', () => { ${Placeholders.SecondTab} })`, + ], + description: 'Testing `describe` block', +}; +const testBlock: TestsSnippet = { + key: 'testBlock', + prefix: 'test', + body: [ + `test('should ${Placeholders.FirstTab}', () => { ${Placeholders.SecondTab} })`, + ], + description: 'Testing `test` block', +}; +const testAsyncBlock: TestsSnippet = { + key: 'testAsyncBlock', + prefix: 'testa', + body: [ + `test('should ${Placeholders.FirstTab}', async () => { ${Placeholders.SecondTab} })`, + ], + description: 'Testing `asynchronous test` block', +}; +const itBlock: TestsSnippet = { + key: 'itBlock', + prefix: 'tit', + body: [ + `it('should ${Placeholders.FirstTab}', () => { ${Placeholders.SecondTab} })`, + ], + description: 'Testing `it` block', +}; +const itAsyncBlock: TestsSnippet = { + key: 'itAsyncBlock', + prefix: 'tita', + body: [ + `it('should ${Placeholders.FirstTab}', async () => { ${Placeholders.SecondTab} })`, + ], + description: 'Testing asynchronous `it` block', +}; +const setupReactTest: TestsSnippet = { + key: 'setupReactTest', + prefix: 'stest', + body: [ + "import React from 'react'", + "import renderer from 'react-test-renderer'", + '', + `import { ${Placeholders.FileName} } from '../${Placeholders.FileName}'`, + '', + `describe('<${Placeholders.FileName} />', () => {`, + ' const defaultProps = {}', + ` const wrapper = renderer.create(<${Placeholders.FileName} {...defaultProps} />)`, + '', + " test('render', () => {", + ' expect(wrapper).toMatchSnapshot()', + ' })', + '})', + ], +}; +const setupReactNativeTest: TestsSnippet = { + key: 'setupReactNativeTest', + prefix: 'sntest', + body: [ + "import 'react-native'", + "import React from 'react'", + "import renderer from 'react-test-renderer'", + '', + `import ${Placeholders.FileName} from '../${Placeholders.FileName}'`, + '', + `describe('<${Placeholders.FileName} />', () => {`, + ' const defaultProps = {}', + ` const wrapper = renderer.create(<${Placeholders.FileName} {...defaultProps} />)`, + '', + " test('render', () => {", + ' expect(wrapper).toMatchSnapshot()', + ' })', + '})', + ], +}; +const setupReactComponentTestWithRedux: TestsSnippet = { + key: 'setupReactComponentTestWithRedux', + prefix: 'srtest', + body: [ + "import React from 'react'", + "import renderer from 'react-test-renderer'", + "import { Provider } from 'react-redux'", + '', + "import store from '~/store'", + `import { ${Placeholders.FileName} } from '../${Placeholders.FileName}'`, + '', + `describe('<${Placeholders.FileName} />', () => {`, + ' const defaultProps = {}', + ' const wrapper = renderer.create(', + ' ', + ` <${Placeholders.FileName} {...defaultProps} />`, + ' ,', + ' )', + '', + " test('render', () => {", + ' expect(wrapper).toMatchSnapshot()', + ' })', + '})', + ], + description: 'Create test component', +}; +const setupReactNativeTestWithRedux: TestsSnippet = { + key: 'setupReactNativeTestWithRedux', + prefix: 'snrtest', + body: [ + "import 'react-native'", + "import React from 'react'", + "import renderer from 'react-test-renderer'", + "import { Provider } from 'react-redux'", + '', + "import store from '~/store'", + `import ${Placeholders.FileName} from '../${Placeholders.FileName}'`, + '', + `describe('<${Placeholders.FileName} />', () => {`, + ' const defaultProps = {}', + ' const wrapper = renderer.create(', + ' ', + ` <${Placeholders.FileName} {...defaultProps} />`, + ' ,', + ' )', + '', + " test('render', () => {", + ' expect(wrapper).toMatchSnapshot()', + ' })', + '})', + ], +}; + +export default [ + describeBlock, + itAsyncBlock, + itBlock, + setupReactComponentTestWithRedux, + setupReactNativeTest, + setupReactNativeTestWithRedux, + setupReactTest, + testAsyncBlock, + testBlock, +]; diff --git a/src/sourceSnippets/typescript.ts b/src/sourceSnippets/typescript.ts new file mode 100644 index 0000000..d024a0c --- /dev/null +++ b/src/sourceSnippets/typescript.ts @@ -0,0 +1,253 @@ +import { Placeholders, SnippetMapping } from '../types'; + +import { + exportDefault, + innerComponent, + innerComponentReturn, + propsStateInterface, + propsTypeInterface, + react, + reactComponent, + reactPureComponent, + reduxComponentExport, +} from './sharedSnippets'; + +type TypescriptMappings = { + exportInterface: 'expint'; + exportType: 'exptp'; + typescriptReactArrowFunctionComponent: 'tsrafc'; + typescriptReactArrowFunctionExportComponent: 'tsrafce'; + typescriptReactClassComponent: 'tsrcc'; + typescriptReactClassComponentRedux: 'tsrcredux'; + typescriptReactClassExportComponent: 'tsrce'; + typescriptReactClassExportPureComponent: 'tsrpce'; + typescriptReactClassPureComponent: 'tsrpc'; + typescriptReactFunctionalComponent: 'tsrfc'; + typescriptReactFunctionalExportComponent: 'tsrfce'; + typescriptReactNativeArrowFunctionComponent: 'tsrnf'; + typescriptReactNativeArrowFunctionComponentWithStyles: 'tsrnfs'; +}; + +export type TypescriptSnippet = SnippetMapping; + +const exportType: TypescriptSnippet = { + body: [`export type ${Placeholders.FirstTab} = {${Placeholders.SecondTab}}`], + key: 'exportType', + prefix: 'exptp', +}; + +const exportInterface: TypescriptSnippet = { + key: 'exportInterface', + prefix: 'expint', + body: [ + `export interface ${Placeholders.FirstTab} {${Placeholders.SecondTab}}`, + ], +}; + +const typescriptReactClassComponent: TypescriptSnippet = { + key: 'typescriptReactClassComponent', + prefix: 'tsrcc', + description: + 'Creates a React component class with ES7 module system and TypeScript interfaces', + body: [ + ...reactComponent, + '', + ...propsStateInterface, + `export default class ${Placeholders.FileName} extends Component {`, + ' state = {}', + '', + ...innerComponentReturn, + '}', + ], +}; + +const typescriptReactClassExportComponent: TypescriptSnippet = { + key: 'typescriptReactClassExportComponent', + prefix: 'tsrce', + body: [ + ...reactComponent, + '', + ...propsStateInterface, + `class ${Placeholders.FileName} extends Component {`, + ' state = {}', + '', + ...innerComponentReturn, + '}', + ...exportDefault, + ], + description: + 'Creates a React component class with ES7 module system and TypeScript interfaces', +}; + +const typescriptReactFunctionalExportComponent: TypescriptSnippet = { + key: 'typescriptReactFunctionalExportComponent', + prefix: 'tsrfce', + body: [ + ...react, + '', + ...propsTypeInterface, + `function ${Placeholders.FileName}({}: Props) {`, + ...innerComponent, + '}', + ...exportDefault, + ], + description: + 'Creates a React Functional Component with ES7 module system and TypeScript interface', +}; + +const typescriptReactFunctionalComponent: TypescriptSnippet = { + key: 'typescriptReactFunctionalComponent', + prefix: 'tsrfc', + body: [ + ...react, + '', + ...propsTypeInterface, + `export default function ${Placeholders.FileName}({}: Props) {`, + ...innerComponent, + '}', + ], + description: + 'Creates a React Functional Component with ES7 module system and TypeScript interface', +}; + +const typescriptReactArrowFunctionExportComponent: TypescriptSnippet = { + key: 'typescriptReactArrowFunctionExportComponent', + prefix: 'tsrafce', + body: [ + ...react, + '', + ...propsTypeInterface, + `const ${Placeholders.FileName} = (props: Props) => {`, + ...innerComponent, + '}', + ...exportDefault, + ], + description: + 'Creates a React Arrow Function Component with ES7 module system and TypeScript interface', +}; + +const typescriptReactArrowFunctionComponent: TypescriptSnippet = { + key: 'typescriptReactArrowFunctionComponent', + prefix: 'tsrafc', + body: [ + ...react, + '', + ...propsTypeInterface, + `const ${Placeholders.FileName} = (props: Props) => {`, + ...innerComponent, + '}', + ], + description: + 'Creates a React Arrow Function Component with ES7 module system and TypeScript interface', +}; + +const typescriptReactClassPureComponent: TypescriptSnippet = { + key: 'typescriptReactClassPureComponent', + prefix: 'tsrpc', + body: [ + ...reactPureComponent, + '', + ...propsTypeInterface, + `export default class ${Placeholders.FileName} extends PureComponent {`, + ...innerComponentReturn, + '}', + ], + description: + 'Creates a React pure component class with ES7 module system and TypeScript interface', +}; + +const typescriptReactClassExportPureComponent: TypescriptSnippet = { + key: 'typescriptReactClassExportPureComponent', + prefix: 'tsrpce', + body: [ + ...reactPureComponent, + '', + ...propsTypeInterface, + `class ${Placeholders.FileName} extends PureComponent {`, + ...innerComponentReturn, + '}', + ...exportDefault, + ], + description: + 'Creates a React pure component class with ES7 module system and TypeScript interface', +}; + +const typescriptReactClassComponentRedux: TypescriptSnippet = { + key: 'typescriptReactClassComponentRedux', + prefix: 'tsrcredux', + body: [ + "import { connect } from 'react-redux'", + ...reactComponent, + '', + ...propsStateInterface, + `export class ${Placeholders.FileName} extends Component {`, + ' state = {}', + '', + ...innerComponentReturn, + '}', + ...reduxComponentExport, + ], + description: + 'Creates a React component class with connected redux and ES7 module system and TypeScript interfaces', +}; + +const typescriptReactNativeArrowFunctionComponent: TypescriptSnippet = { + key: 'typescriptReactNativeArrowFunctionComponent', + prefix: 'tsrnf', + body: [ + "import { View, Text } from 'react-native'", + ...react, + '', + ...propsTypeInterface, + `const ${Placeholders.FileName} = (props: Props) => {`, + ' return (', + ' ', + ` ${Placeholders.FirstTab}`, + ' ', + ' )', + '}', + ...exportDefault, + ], + description: + 'Creates a React Native Arrow Function Component with ES7 module system in TypeScript', +}; + +const typescriptReactNativeArrowFunctionComponentWithStyles: TypescriptSnippet = + { + key: 'typescriptReactNativeArrowFunctionComponentWithStyles', + prefix: 'tsrnfs', + body: [ + "import { StyleSheet, Text, View } from 'react-native'", + ...react, + '', + ...propsTypeInterface, + `const ${Placeholders.FileName} = (props: Props) => {`, + ' return (', + ' ', + ` ${Placeholders.FirstTab}`, + ' ', + ' )', + '}', + ...exportDefault, + '', + 'const styles = StyleSheet.create({})', + ], + description: + 'Creates a React Native Arrow Function Component with ES7 module system, TypeScript interface and StyleSheet', + }; + +export default [ + exportType, + exportInterface, + typescriptReactClassComponent, + typescriptReactClassExportComponent, + typescriptReactFunctionalExportComponent, + typescriptReactFunctionalComponent, + typescriptReactArrowFunctionExportComponent, + typescriptReactArrowFunctionComponent, + typescriptReactClassPureComponent, + typescriptReactClassExportPureComponent, + typescriptReactClassComponentRedux, + typescriptReactNativeArrowFunctionComponent, + typescriptReactNativeArrowFunctionComponentWithStyles, +]; diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..49ebdc1 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,21 @@ + +import { writeFile } from 'fs'; + +const generateSnippets = () => + new Promise((resolve) => { + const jsonSnippets = `{}`; + writeFile( + __dirname + '/../snippets/generated.json', + jsonSnippets, + (error) => { + if (error) { + console.error(error); + } + return resolve(true); + }, + ); + }); + +generateSnippets() + +export default generateSnippets; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..19fa619 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,28 @@ +export type SnippetMapping = { + key: keyof T; + prefix: T[keyof T]; + body: string[]; + description?: string; +}; + +export const Placeholders = { + FileName: 'file', + FirstTab: 'first', + SecondTab: 'second', + ThirdTab: 'third', + Capitalize: 'capitalize', + TypeProps: 'typeProps', + TypeState: 'typeState', +} as const; + +export const Mappings = { + FileName: '${1:${TM_FILENAME_BASE}}', + FirstTab: '${1:first}', + SecondTab: '${2:second}', + ThirdTab: '${3:third}', + Capitalize: '${1/(.*)/${1:/capitalize}/}', + TypeProps: 'type Props = {}', + TypeState: 'type State = {}', + InterfaceProps: 'interface Props {}', + InterfaceState: 'interface State {}', +} as const; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c1aa99d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "module": "amd", + "moduleResolution": "Node", + "noEmit": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "strictNullChecks": true, + "target": "ESNext" + }, + "exclude": ["node_modules", "jest", "**/__tests__/*"], + "compileOnSave": false +}