From b8fa48af2881608b1aaaeb09258d03107e4206bc Mon Sep 17 00:00:00 2001 From: Emmanuel Date: Tue, 14 Jan 2025 14:00:14 -0300 Subject: [PATCH] feat: migrate js package as submodule (#136) * feat: remove local js package * feat: add js package as submodule * chore: bump app version * feat: update snapshots --- .gitmodules | 5 +- app/Makefile.version | 2 +- js | 1 + js/.gitignore | 72 ---- js/.npmignore | 1 - js/.prettierignore | 2 - js/.prettierrc | 13 - js/LICENSE | 201 --------- js/README.md | 12 - js/bun.lockb | Bin 203651 -> 0 bytes js/eslint.config.js | 36 -- js/jest.config.js | 5 - js/package.json | 62 --- js/src/__test__/addr.test.ts | 56 --- js/src/__test__/keys.test.ts | 121 ------ js/src/consts.ts | 65 --- js/src/index.ts | 451 --------------------- js/src/types.ts | 83 ---- js/src/utils.test.ts | 0 js/src/utils.ts | 119 ------ js/tsconfig.json | 15 - tests_zemu/snapshots/fl-mainmenu/00004.png | Bin 9633 -> 9865 bytes tests_zemu/snapshots/s-mainmenu/00004.png | Bin 484 -> 486 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 484 -> 486 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 446 -> 451 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 446 -> 451 bytes tests_zemu/snapshots/st-mainmenu/00004.png | Bin 11449 -> 11635 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 446 -> 451 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 446 -> 451 bytes 29 files changed, 6 insertions(+), 1316 deletions(-) create mode 160000 js delete mode 100644 js/.gitignore delete mode 100644 js/.npmignore delete mode 100644 js/.prettierignore delete mode 100644 js/.prettierrc delete mode 100644 js/LICENSE delete mode 100644 js/README.md delete mode 100755 js/bun.lockb delete mode 100644 js/eslint.config.js delete mode 100644 js/jest.config.js delete mode 100644 js/package.json delete mode 100644 js/src/__test__/addr.test.ts delete mode 100644 js/src/__test__/keys.test.ts delete mode 100644 js/src/consts.ts delete mode 100644 js/src/index.ts delete mode 100644 js/src/types.ts delete mode 100644 js/src/utils.test.ts delete mode 100644 js/src/utils.ts delete mode 100644 js/tsconfig.json diff --git a/.gitmodules b/.gitmodules index 31b5f33d..aea8b5c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,7 @@ url = https://github.com/zondax/ledger-zxlib [submodule "deps/blake2"] path = deps/blake2 - url = https://github.com/Zondax/BLAKE2.git \ No newline at end of file + url = https://github.com/Zondax/BLAKE2.git +[submodule "js"] + path = js + url = https://github.com/Zondax/ledger-zcash-js diff --git a/app/Makefile.version b/app/Makefile.version index 5e6df4ea..5607f485 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=4 # This is the minor version APPVERSION_N=2 # This is the patch version -APPVERSION_P=4 +APPVERSION_P=5 diff --git a/js b/js new file mode 160000 index 00000000..79cc5b87 --- /dev/null +++ b/js @@ -0,0 +1 @@ +Subproject commit 79cc5b8767c882c835dbf17e4652290bf8f9a772 diff --git a/js/.gitignore b/js/.gitignore deleted file mode 100644 index ffe20cc2..00000000 --- a/js/.gitignore +++ /dev/null @@ -1,72 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -yarn.lock - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# next.js build output -.next - -\.idea/ - -.vscode - -TODO\.md - -\dist -node_modules diff --git a/js/.npmignore b/js/.npmignore deleted file mode 100644 index 3c3629e6..00000000 --- a/js/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/js/.prettierignore b/js/.prettierignore deleted file mode 100644 index de4d1f00..00000000 --- a/js/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules diff --git a/js/.prettierrc b/js/.prettierrc deleted file mode 100644 index 53676ef6..00000000 --- a/js/.prettierrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "singleQuote": true, - "arrowParens": "avoid", - "semi": false, - "useTabs": false, - "printWidth": 140, - "tabWidth": 2, - "importOrder": ["^@(.*)/(.*)$", "^[./]"], - "trailingComma": "es5", - "plugins": ["@trivago/prettier-plugin-sort-imports"], - "importOrderSeparation": true, - "importOrderSortSpecifiers": true -} diff --git a/js/LICENSE b/js/LICENSE deleted file mode 100644 index d9005ef1..00000000 --- a/js/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018 - 2023 Zondax AG - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/js/README.md b/js/README.md deleted file mode 100644 index 44c9d30a..00000000 --- a/js/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# ledger-zcash-js - -[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) -[![npm version](https://badge.fury.io/js/%40zondax%2Fledger-zcash.svg)](https://badge.fury.io/js/%40zondax%2Fledger-zcash) - -This package provides a basic client library to communicate with the Zcash App running in a Ledger Nano S/X - -We recommend using the npmjs package in order to receive updates/fixes. - -## Notes - -Use `yarn install` to avoid issues. diff --git a/js/bun.lockb b/js/bun.lockb deleted file mode 100755 index e5680364081739a20dcea98e092fbab2142ca96a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203651 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�w432-E~9M6aK((R{TkwAd&kO5;-vX&V;iUEzxlvdqs5=-MH{~>L~bqc(SIU~ zF=VF@{uSUGQ1(e1Cw#TYALloActnQSiUU6SkMZMV4hX*l_;~#z@#i#uw4zw+7kT7G zeEb~}`-_2ZPuWL#(*8RxUG5q1asOf0Z=#pj(O&$&^T+A+D+BoW{DjzNcMgdCTfist zhrV&j@4w{7{)0Yn>i>M;PoViv#zErrD;)K2)dz{l$k+Ql}~{*(Cs zRV8wY(X8jM#BWaH7Y=-K|0w}hIOU5jWBq;z?c9BhkVtQKhB>RdrtG$ z8~A^-evSekpC6I&@N(#XGw{j&i(I1TPilyq`Klk!KafM(+2t1kpWOc-m(%!v1-=1{ zALEYk=XCr!i9gmau3b*oPdxCoz&_z|I{tIOC-DdK9FJdg_5c2UfYbQR2fiN7e=-jA z<#&aQb2IRbflusmn*Wc1kMl?Da(ewyN%~*^`F`g#t&jL02z>hdaq52o@agkM^wLcI z>qjE@9r$Gb#~5(xzs;H-`xojYar{@Kv_@ioAMg!n@#l2?yaqmAKZrh(2Q*Xv`jN&jI|5fl8jfB7ECqAd+e*k<_+W0x;E39Sx_n!!l)A7dxpML*J^!#Gj|1^{F*8`s( z|9<~S{Qd*sk4pLR{0O<6+7AalK0m>6qfSoO?_S_L10Se8dmlf3V51QKc~gIU|G}>B zsGjh(flt;S83P;U|KaZeKDqy->;01sV*fqx$@Q-{_6^fm|NSK#JL=?g{q6xiu79+R zIylXr7U1Llhx68(`0J#z)*t50KzOlRNc_0g{rK;%^@i^YeDuG!_Rj$yuYbMe^JXv@ zdceon;T*7A$oP$bkN1yc-EeySS_XXl{YZZ>+?)Bk3j9fw|7e?C9mM~yl>a#P-sJz3 z^{o3p%zLy=^uovA79tl0e0=^vV$Z4n$AFLVXE*M|DPq5!@*nH$+D09Oubj!+zj~X0 z@qfve*udJqdTW0n@c(B0><2!1e!|Hdkodi%_+k)KA$SR3aM>t?FSGH-|9=c~Z~z-z z6e0Y1!1t!|hvXnTDhU5Q@Jaq+8>jpKxU3()Kfv$b#Mv!UMM$&LMcEjh}b?9D^UIo(axBjUKZj!slW@@>NI%aoEg9i3mtJi8o>+o!yeUB zI6>skfEOa1(R=jFrV!4IJp~cx&Kh1QX9q7VbVU31J+1$aIG6L_g>v&LIXa?#SE}EQ z>PJL*cdCwvbq@-eR68Q_eX07tAT(d;EjrR!^ZL>VsoMPyc#WH-nC-AGZ0Pe%LO15VnmTgyq*$5OME2056n31TQRf zL_3FjT3LvG9)lOQAE(+8aV?#N7wRd67nahVcNU_28C6F_J(s9DBF4KCUU;Ufh8N1$ zzzYi<2SdHJr4?`-b*i0?*fbU15H;Wp<1`Hr_2^(Dh3K~dRYycQL#j?k^OQ){lK`>&4soB`K*=HE$Bh(bQSFHMF`L3oR68P$BZsOZ;>Rsi9TDTX z0}$i38xXtpz#H=Nu<{e)yd0p~5%J?es!m7bAEw&ri1vkkV;P0#DZGGPN(nci|0r z_o;S7tT#|~M9j}efN1v#Reu49@q7gc{}`_+Y{Lo^M3jF6h;kpP{!dgtBJLagQHVl} z=Rm5Ch@yk2IvsJJ8v^a<=P*F@PnwdK0Yp8Dfbfr@M756wL^)-uU4?3&K%pui7DT)* zPX)v#O{$%acwVxj`W*n#4@W?p4<;p#i2i$0bwsQ$r0Tyz)aOIV`%?0V$oHe_h(2iZV;0^1yDZE2rH6Z+B+@rL%ctid>s{I4i-buB8rRv`S zk&nXgkIzhSG$6)R zg~G{H{}igO1&H!BGy*}V$)g*)3HJoJSXA{?f!Rv z&59TOz8b@Xb&St{_t&gA(C@1;K3K>2{C9uNIw${kf6ZD)|J`5X>R{b>|95}=-~IJ} z_t&iT@ZbG4>m2#t{WU8e{=2_s#o@pEYt}jPzx(U|?yqr0{QrM{-7VaWH%9+23+Urw zu=LVZ^VkKgt<~jjx~E#;vg$L(_}T6iDHT(H`g=e)XKvrJ?f&+C z&|($*?v2D3pV5%Qvub_L!B>gi z?P|&IG81Jg!>%^xFIDQ#+)6yc6X09 z+tN7Jz2(jZnqGW{L<)~cw8YBdAjfj;*n;A3UBNFZzxym*!foii-v9Be1E=R7wj9v7 ztMhqW>VaA9XJRz~qss43t@qwqt>{{+I1r#qXRm?cRCqGRKFTd^IVLf2*yJG$X-r-Rn`Fz8)3%lI*O`L$=v5`37vpZ6FvIpqg?;7aG{cifPFx9pF_T9fX>19Sy z_t@K3F*gpuPa!rg-@EDcp(ktn8E!|o3hkDS96q4-<-}&?@M^^s=_W&O(e&cIAt^lF zQV*}r-03xZLVIDw&I2FXoGNdpwhWqS8CPG;*X6Nt#a0a~Ikm@CBW80M4ttU@ZKcpo zPi?+OFGgJxDd;<1Rt&!zCjR1g_N4F}Rw&U-k{Yeu$>4vayKl11_){PD_YFJkp`ZP{ zf6k9rA6fj)d{bOEOc{3gya|-2JBY zDD9AHE!Qg6cd4v=z~_*p@JvcRv5m|7<5eeL7uU+Tiko3p_62hkUAJugdZ=XfLd~59 zbsraW<>sDFd%No*Exh>E zcw^g{AZ_!K{pat6T5FAdAyd(wH#WJI<}ZFnLJH5Zd43837Z$1KaLai6#fC3gd|0MG zPg9+6Xzs(=b@hI+Cs!HN9QIncegC7+{;NVPOi!u4J32VhI#aKcIX*P7vM)`qC{YT? zb9>{Zs-_WwZYJ`vinEI5)N1uzdn@Yb$)=C>M~_vja*GJ^*WdmUby>PDHDWenkJM_D zZ~YVcSkFAz{aSkSr^`aoG`;xUFeyBxg=t0t?xSY*+q*wuzoL`W)oTjAQhPTInxbT~ zvTfz7O!M!xSNrZ(TinroY)MLf@uLpihKsxImNO@uk#9{>48`ju$zS}f4JkbC%fz*1 z8uImh1=1HzuWy?Xm4B+WYkO$Yu7w%R+Y1gZRv&UhFVpsvyhOF>qrHKHR(iOcyPeeU zRsM})!=uMcte?^J;%{O|;mLnu;cR`|!tLX@WpgbTYuWXed{QB`RZ^+x=-kcMd8!XN zidL#mn>Biod}#T|&~F=Ns96m@x3p#Ii*LJcGgb8k#A$jZh*ChF8>9EUY(0ButjK)n zZ+UmOu64RFxYJ;Cx!Iy|wO*OyhY712o~&;RJ0KO|)Gzqp?IAj&Q_3dr`#C&0Y1yPX z$ay3FmW9Lte>+7AkE&8_)upvl1xJ)}HQ$)7x;rlLywH(U<=I1{{TC-4ZA}puNWG=Q z-+J%u$`egF4`r>Ygn3HB9!zu=@#U|X>zdF+(~I9plfo12XDD~>(4oNK1E1WF6nm=p zr>IVPGJF_A?Ud}Gr_u#iCvH1*PFvuM@x|#g)T-k@-sjqE)HT^OEkg5qg6Wu&9bGiN z-IdeNT0Vm?)7!3SUc$c^W)otoa`PC6w`kE zM5!@$q`{_1h2FA{uO+VjVt*%Z(O{Zh^1Hnry&{KJO;Fr=ul`oYd%h)GRAn!DZB~vs zAhd1p>+XY*&jz+>9(i)je#p2pj(Ji%;-4qxZoEFk^x5uB-77C0)YkF1%=#@0Yu_10 zf`I<=j#`^Lwy-_zO6`{3w zk%d$DKATc=JyhpK_#T(F%fy{7esLPnwbuHXrjsJyBVOf-#!G7seQ2iX9YOcE>QGFf ztlpe?^(hL|1HF8dEUOlrUT}Plpye=!hLu6W!HcIf%y(MPy)|q{b+Kw^Y}1N6&j)Wg zUeBvHF45Uzy@&`+??}2{qe0v{SHC2+zYW|Z;9AK$e2ll){a2~oi!`injXpb3che{r zUZcjzp4pm$K`$@&f0Qn?vErL~^y7EZjh9XMw=3Xp#7G>Z>3YLnoo(p9;lchxlaHIo zJ{_`KT{_u!jn$Vpl`orv(_=IiUD$c0@lm^)?N?s&|>EQB`@=Z%ur_>kOJ+S-M{B`$66DZ`EIHT;#58GMnF8#nyTrx3b#m z)01Z|cUzj*w~^-~D< znw?_dZTqL(b&`pnvl7pVJ49DoRzE(#)c71zB)GZT_t9?SRR^uKG)9T*$TUTLyD_bz zPL$WhxY|A``nD7P=8EW*r|a!MZ1f3_+&Pn8J6*ZHQ8gi|U8w6ua<(a7VQpM+RNMTa zE94_i`KG^XE0if~GmqPqC1=2Y)}X~9M$a@bN4}Yde(qDC>)n*%{(RX^ne5dDpW;S8 zI~QUxe(@NaS9!87^RLB@o446|w%eG5dqT%^=e(BBzH)r>X^)73At?*oue%biQ!Dlw(poIA!O+Y7u)7`b%kyCOGrYmv*W-(a!!2PL}R z>m|<4i?c4hmuYi08Y%m!L+#Ut+S4N|u55qVe`Lt)i!o)TEoF!9ZSudn@A>O~^-nF9^pQP_+W9WMG(_+sIi8)fA zGU8Lxk)>C*oVPsN9d>tzR8Zl~_3hm%0~|lS9#hZVaW1y;Y~!S_6JOSCO5r>2Bs50a z(Icj_^$q@3lK4B8u2*z4|D5-e$4t5#Qs*5TD;*3W<{gKusVe(hq^U7nWIu;q~^Zzzq>%yRrT!lc5aVL z%f94SKOQe_sMT_ergs8eFZW4q;br!F#}yRKP0TB8Pu2OBQl}AfUU!DgxY}s0u5ZKp zXr6jECM7~~T~f!B@l7Jv<(nsm+}v;b#VFk~Jf}W^rdO4&SJ5JQ+RN=>1_Jq(!5KS7 z+Qy36dQE(NY1%d2#~&7j6{zPOmU&^3XgB{BL4+*v$6H&fiRW$`YW zUNySjJ+tGgYc{QS@!uvN(9*B0YQ&kNGVZ$ZTi$x;xx7}){?6o{kiPo-b%z_-2M3#6 z`6gkksk~f2=0x763Avk`E^MLizZ2#0s`%(6$rnC1Hg(O_*W8;^XxV*|=I9Ly51YxhmOv>x@UWm)z%}=wpqt3JDsrKzJhzf{K*O)L1X)T-*|uT z68^Jp5|0F`jWSi?Nm#1fzZ0dfm>sY&r8zuPNC~nnEg63tSZHIinYv&>o2qh zMV}XRFt+(=lIqYMe5n7kFa^*Rm1ptQ$e$9qoGsS8vn85Rk+>Lq;2QbT$AT&N?9}SYvZufigxB= zlkO%pX*}B&@IJeKL&Wg==9!66S+NoCYbM^GdA3SkQh&l;+tgb(RcZce(DfECYL0m} z&1Bboz8&h{v<$40P9DFnUNXHrQYGQelt#0JodtW!Uzfz`4!fy!Ms{hj7T;mE1h&UusK2Iu%_`KQ#q|V={F&bx+1G@i!jz*@|)iF=~Qy0^dX1H zm`n?v_p{>!1d^UF+g@u_=y%g8XXxrTr;Ta;YX74Z_OtfUA(^d1roXGHuYEjFBf_$? zsX6mY?3mRD)0b%Fw}d`ufBp4#g>N`t4v$rNspS%_0kER#? zTT=fNo+~mz6;e%K)0LKO-@e4_Xze|T9omH(;{E2GyLZTN`q?URE{Jx#CfKU%@x*SAcj_-qxIQNEw%CvY;aaNo-ZTlS^C zeDHBbVza>D3#s1+oZAtk=Mri(EiY}yk^DP{c0IkYs!Bq6-~2oIW;eg$Z?DO`>CyGx z(AJz;8Mafik7L={;uFVP)tAqzX;6wU_sBY(Aa&`cbDFHD9+KNT^)Ds&1$&KP_4+H~*;ha~mt;hsKvqWWU%Jpm=W8 z)#LJOX?myA^>)mCQG6iQcH~#nBbG)MpY1A^G(;AB67p0$Y1kRxEPePy^^V~$c-`R&s}1^LZ{t2 zY`OWZ6Ip(pChDs-eX{tEk80R9*6PCvRm}}t$J0Kh$!X3w{pgY6fy03}==Uu~biHb| zXP4dgmcKVaVvVicjqCd-y_T>avgYO2!TUnE>c;Qi=P2%KVefQy3S*U-~rtH?Z)u8#Su3h>P5Xzp1ysr%Vz7hI`_Vmb?cu_b;}(xGbMuq0ndvWBf3$FK7C!0h{Yb%Z3H*n>wT z&YxM|de_(gbBDY3{c+Nw)>+#Izg4v!&|&smLF_?4!}qr&glT$b(e*w&7%@Y3SCCW%pZl zkJ>jRL**h(?`*o>0oTqBlHi%|b9$kBQ|HaYE( zm?>o^_K0Sd32=W=%u{rb5YoJ{|5T>^w^YXjZU0Xr)4SJ;jrO?kA)|b0ds!X+Eewh8 z9J=1T7Hx@_v*s>1u6((Z_gG-gj^J6H=QlsI+}$QE^tj-8DG}uYFaa$Mvkzqlr)*uz z^t9%)z3h}6yp^VRE?w`^D^u0?3ispNUVb<(W|Ct;4zJ1HW)+QV@hPv|H^lF$7?J!^ ze1YxzS6ppoVPPBOhG|dbIwW{s{_HNXrW=dm-RN zj=X+@TzzAQYEScq%%d`Ck`w0~mk-?_VX31jVVYEOai#PAp`m@cB6J_$>~e2zF3;Ecz&v$) zW9FuPt6ObO57uy3lL(H)zeOVPwV~@3eSVXFn27(L9RfoGTg>Cn_tgm;8F#dxO)34# z#%!f4Z|03Y>E@!DHjVpa(Cgz@XBh8wU%p98e1-Ov&5~+b-sLegy|#3{v*S1ARJ|G6 z$M|r@qG0PU)e$vLmP-81tx z9@2SwY?EyBtT0()o{D}a4y(kEVA#xCUO#Pwy951vMt*nPqc<}7;$(B4e85hNl{+N`&$$ySYqs95=u7jbb0KnX-+aJ!S}x zr1|SWkAqq!kGgx_qMC`9JJL3u$+2+0H9cK+MA<>JOUAbq&xEd@Z}0Z8UkdjtvpF*_ ziSi^dw>sWWtj~N|s5AI!aOIK^y1)2$#-#9gmweBAIbOR<-BPqsSR>nNZpEfoTIsq) zIdSb{j%*uzT6XE`Ws6qigb5AFzm)c7y06&2;jKqU?n$lO@$u^1%dZ=0{*u2}M%_G5 zZ!LJud}bBStQ)b$uVmKrw;g@+@0qUnVpdS5%wKqTpt1VxNm}(cviO%f$YnLl9Xv4A z^sDoCzXd8EhAuqxX3|5NUPt0A>iz6oFzKPof>2jx&dD0_S8kgPk_8i&`*Y@FeWlvqW_17a(`pL<_qL(}U-*PG7Vc)kAqb7>2^ zm+7(FomW*9A1cXq4?OK)Fma=Jrnzw5P`=4e3U^;`SNQX%t`;Kx*$g_>%^M=GYwu0Tj%y5V{c$?dHC@OsZn=3 z9W8P~viCSC)?0N7L)_k5-67?Cz(}xLZei^gkSTCdK+z z_QpG3#IF5j{{CCAGvGF(si793OCHMuUyQsl|U-L7Z0&XYB|lx?#qeQWyX zyi5H;ui9BXrs;L3>wQ*xlHdH^@O~$1mq&am=ICZzu z*|&UU(6i30vAzouvdg}l`I@jwEVt|0Qwi5o`l8i-Gjmr4?!PcUZo#II)$O-)>EA;# z>3W?V2A}CrY#vfL@6L=Xt@%YeZoh3=5hyNwE2q+V&!ph(Y9E~+A9(&%HYjZn@(h zKQZT%H`{GSJ|HUD$u(dE5nzs}5_*b2@H@v)Zeum)mF zeT-M!!LlTD`1m3BJ2?Nf1YKX5;V4v6qP!LazhmA|Vuo=I!loyY<`_{7lSY={j5+_% zgMlv0@jFZT4rf2C{)tUI0-N0E^miVRWY^vuHgLb&3Urr=OYooUun}{XKO3KHWP!{BPW} z23<)zXm*12NpfH)=NP6(HlhHlO4O04Jh)`$C3pS&E9*A{du31M%)w4u+z1a8n+KBq}7yE4Xss5Uy(_L_PB0{1COCz;|CCbmF8|4fHuTk%@}TR z*MXo(4e05{71pYO{jWXfV)H~Z>M~+{x;Tr>U44Y~dE^xl^CA3}i5&85&}JmJjtTGZ z``ky~c`V~gbyTXX(N)gEuT?a9%jfaQp+lwQ6lezr&|OGjnk2YXtJ0#@CJq+ki+CI& z@$e%{As=x3RQ2*FK9V;)hPig|i0%;V&9%JnJGSAN(JFG8=2?!tI5K{+x=g@z1YIIs zG&svZ5#@yNX*@Zy!6uKM6h@xQW~@q<9ob^-`Qt)xhmhoz4=z8}s#UA-?b8 zn%56THHZQ7x`1w_6-NK23CDuZPVd!`4=*m31e0=#ML?r|K@gu~#s0AB-RtXirJsX2 ziEqTG7+;np*GByOk?Jhb)7HW*C>acn^It%h;qJ@!&wWiJiC4-#)y%Rj>o5LDmXaH& z642v}+iE2D7wZ9LIB4FpRr5K97Rc)gx_hQ*RXKn3 z1i3QtagC27Wy%ryear~nJNJ)|vuUhJt@_ITs7Dut`Bb5M_JU*Kt|xoyee3n|7w;FI z7A{Otxq*P|2D%ShVT|%x<)htcxLSoj&d|mKd(`oaF*n~2yi0vNzt(r0|KMEz$vMZ+ zWjo|ST{P+m|K~Wxoryct(Nmw?H5s@+yC9son$Bk^uetxnTvC?<3Ebvaqb~EYCu=&!=8Y$TFO=>`Kwb~fJbTd*|@;a4!0tx~EF$qE4wj-fim_5>Bmo4i5r1;x{2* zz6(XrR|ok%UZJ^iIz5TzN#XO>fcp$ypo_VGOHn~of%xA;5O5LFot%t!c(f02d_@vh z5{0777G^)YxpZaqwlrCYQW{wC-6Jw8r&}({uO84D%R`B=W4Z0hY+aG^x<`DJA zbtdvErz7jrNxU&&2*-~PFx0VUNSe_K^UL2hq4`Zrn-k)Y)^JT55-vTa?UNQ`^`vZ; zNV){HgAeF-SZ-XxtB>8jf-McBe2e8UGXDp84yik(;rL#Aq*cHsz2Svbq8Y~5Z8JZA zqm&tacMGBUgx}uptvF^B?C#jX{a9bn<(2Iz9y*PTAN)xBg+KaRcIr3X8N`rn7Q^o{ zut6fe2Id18MSNe3Qjs$@_eK?E+( z6Af23)`3(phJE?xb8Yl!ejG+h0h>jv;-5<-r}HI;gd3_m(Gz|pW-;EcWU1LJ^|3Zm zLzsZ;54xk*8PXBGfhFEPS{feihB~+UpJetBW+9Y1yDfGKpKJh?Iu(8Lit%kW zNr7Og&K|@;<@>iJR*udg!F5aeWdFu+(?qyz1Os+#qDMg>Zy@OMg}1zyU;j$OgA#YJ z1VdPbFq&VCG?*xIy-0eQmoXJ5R?A|gwTm54mjAUqSP$a%z*L`5qbIB(n!kbYUa`Rk zaDza%b%Ebfp2OBgr_-wX;o&6Ra4dozMVsQPt7QF!Aq6ig454kTk;{B8vD1W~sk}ie zbGthRY}z7xZSI6m-kvdd-Y6J!zvz|p(AdX|C6RI&qgS5o?u{5(M|S&-J7eIApi?#< z=!o^|OPreh@)yivuVT}Zd1r2L(NE7ZsZ+_e;BaE)2ILI^T{~=SA1dlMc5mwHVuef~ z;omUTF0^q7Suhr4ST_-S#mYKWM9$&r6zeY|hPfrwccv*+xifErzP5?ohH3wzX9V0( z(52>hF!zO}z}3Lv6Z`N&(UP&qgxb}268RQA(^gXn9X+_nD>q+^IkU2tDxr-Tb&fb| z`Km+UX04z^HgEhi6+AB&2D(xMC~sfu4`uKS*^WQwtR+3R)>;JN@P3#r`+lr2L})5P zt*+O4M&M+Bp_cUeJ1pDc1V2sAZ4j3IY?tQ5;PwNMHym`4X=owc^z6_loGG<4q5GVL z`O0?s_V7rzCy2Vf+U`Y-g-+vEScl;o9v=~*x}-j>1+LZ}yuDKmqdW> zg{{6x|7#bk3{mk*j90a>qca#(sB+6R4Yy|ER@0Qrh*j2c1TxMn5=m3{(MS3ti2Ubz z%v={9|80J8DpDq%0C^)px6!jd<;i->Yx~Uh-nwx*p3~3%x7Gu9BU*^Wjyh9Bj(4_C zT?_>G2Q;QGuA@rAV-ZY@-d=d8txYk#eA(j_xb7JRy6seH69xvqMxl|I>qRMDrbeFc zHSp;T?)Pk&_fw0HOHk|obm0`h<03(56414}Qu@IUa-NQ}(u^DVM|1Dn~=5G4DaF($DRGgf7r&usE zQ|iXBgg7Exj4$AR1zm7}K`bU9Ci4M_4L@h2`Ls8eJH_k7bKn{7Sr+3_Jz*3u8f7 z)Bz!6)HVqBis)dYUB)1?>%TocO_J?EM4vZ7Yf2sNOi2hFpOFL%4z5PsB*Hi!Peqas zJ|EeoxxO+tYBk8QHHo}Q=+ywRB~TAcVBvY-e$QKEMj5Wk4ECp*rbG{k?*?&a-yHYo5r@HRy#6&z{Lm7MejHeF z;A*{cJBU+M_^{I(#yf+%*c8Us)sTHn5ysnaKo0IhCV}pGnjO?SN_D%72Hb{16Z@GD zzY)*WTKO|M_au`fZDdaz%{hkH@4acv`wNn91?lqdg8HP`>Cp$KyPS2g!OemvEkEb@19Wny^&KDSiR4JL1Ijy>K~u<;E(aepr=D*Y}+ zk(*0ySLJT^jE_;ID$o5@^#PG-XZ_&hYfnV{1V`@9-`IeTiIIw7>2!Q972D*Km za_C|2M(qlB>uY`TH_Xemv_y0mKXnaqCQp||KO71$nNV^R$-jSaBe4l(i5#mS_gEEN)@@9bUu4?zhHFskCUbkde_J%44g;$KF zNVZU;AjbD9Q{PfuvrQ^2jYPAKrBSX6YB$W+IM2>_dOsuT3e|aEYWF07^T}_Zs~;8- z#-8G^*f4B%@O3$Q4h}x_J-$V(c@~#re`W)b5qMQkyTe1eeo4i1icd;|XD~h5cO48|DVwY|wQXA(ADu z!sRUxk7I5%6Y60@AIZKsUVWS6QoT?gNafFXosmtqwma?Qt}(J>eqO5iB>a|`lRK(= zuKw5LTrGIcCI@sAqP{y>YmnXSxZ7;3T6b8-u)vYEVUB1gZCDb%u)#IaQmdflJ;6WK z{H=6lSgJ7>&uJW5s+^8us7C7+^>_i!e{(_CxM1tn@pNi^KiFC2iv*02688XWsCGsX z>ZyuckY3)EQGq`VZl6DjIz!bSD`qLSO3DE1j|#?>yn_1WU}=AFpX@v6df8Kb=E$>= zBnlKa#GULykgb;aO(#sN^oIuWr-@_IP_4G_^D@QYC6%6kfu;h*cC%_iF{KL`@?%Eb zu^tzpA<({gpxfoNjsLFQ1ef;D$?10^zJr^K>RPq6&Yma3jRu{H1wR>?O(@sVe4D^< z6=#eug=b~AhnfgKcnZYy6NE?FM)LtTA9NdD(OM9~dnQ%|^yuoV&NaQWa<Luj99isy~J4k*AqH8ca{HlSM(262}9$1)!Uw)G2@Z2{%u^ z<4B*^$)?>=opk!+Mc6@^o#gkvuNNH!VXAU^F!|8lOf!Mqc=N_Co~L{naAe6!Yhp(UIjXF_Md!qt3s(pnQ)@)dPck^5ARt9Ymlw#wqt zUOpK636bp4UnlVC9Yp}X0&NL+f2as_yBx1fmGW+>yPo#2ColitOkUp0vsey=B|JPr z_0lbO*$&kDYE!-^C4E=UQqP>k{p)Oh7XCU)f2|YIu=q-&p~hqRiIZDYSZo&@Cr{+_Ibw)stL8sJugZb63IG*Mb3ZEQL@HD&7r$*z@O_ZDO7pc+p%-LW$) zF&`JReanZRV)m5{bEMbLL3I#Bfs8>Xv$${ap6kY+s5j6vVL1ov@j zL02H<)Af55zCD6BSw~5f%ZWPHH_}`ay*YKU#I@Hu(sFwgE@oQ@izbCyBiseivi@6( zxASLQXUEnm7YVK+`r!V29q7{a=;O&=AcT8itoz1txzLAIWDkAT`(7jPP0f)k-xrp2 zF@F(fH&KakMzivHtY5-*VP?00P-WjV#EGDd{}Nm`st4WOE!&M29-WDtO6Q_W<{(v8 z(qdW3a36I!p+4)vfZc;52Sw-k|E|zEvniAL?f9jMNxl~T{G2R|ZyeGkg}}xHJhukW z%~8FsTC(PqYI1g(wA7s-K76e{t@&ZGOskTx61h%j8~1GQD-0oHMw9Wu>#V4mA>9+R zLqA=WzE-wtmQP*%Sb*CIx`_nd9R}fX%LwKHUG?fVmhJ|@3G-nb)Yj^YaVUE4y*3j=fPIjmIsfd4Jg>5+~H+&OB&UU-|kI=6*D7`iL;kS)?^y+yUfm23<$! zM8SwCQpK7?OTjZi+C#OE`k&B_Ub>yE`q=qwJPdgEuzFe?vwjfAX#yC=akW z#(F78RJH#J^L8I_TR`_!v)dnBV;DhhE_SwV^_Fn2Cj=@+K9eRr2-IlC3}4rU;9^== z(w64A(>A-vI7H|jQ@{tWvL*3$#>8Sc*buNCT0u92F`9(ku+;gU+@^>6=|h2#z$j(s zl*Dc`a&}6%dUAL3wgD~jhJ4l*T*6Q2Bx&yRmdsop9WuDE55BtlIziz5p*GNcWH?^^ z%{B-t>J=hc@WygC=$cq)vP@(T;$@?_BPms%U9U0E;QXQ6ybHI-EHX;~>%%X-OtwlF zODEmmvDo?GIzc<={t5V|e2BxY-x9DSl2UiT7?E0}co;>w>3}P4x+gV}*LL$NX|-0w z$`dM+*r|auqCDP87ee#~<|QR1QeYt88=!rEfNr{)(@3-0f={Xx2_0hE@UC1Jx$)Zp zb?G0F;mY8vX_VmjVH#L1BZUQF77e7@U9E=Scc1S$F$^Uov*hk*kS_tZ19YJ^PL{+z zyU*_Jhfi9uilj-cyQ}^>OYAG+I!JN(MMX{jtzA5x*MMd}JbF6wI#EfD4cD!58Cyw^ z?KaxI4hCH3>IB{R*-)S8dhrA-5keA2v0w$*Xe$@BzR%j&YB*+*sCXhQma^Zbl_H03 zNXM^22IiYBrZ@$X9HzZrZIAb1HoM#ddAmS2DWK?q%hoOIv74{MVa> zry);$X-av?nTsMNx%X;S8Ar!wm;w>(b)BNCjr1ZH@1>kz+78A)0B$$v#@+W>dA%{# zXwVgmK)#sZ`%FgRzQbA(KX)nQu}!cff)&4?0I_AytFx<|zxS9fsR|`T<5J>a`L(WhYH|9}y9r${ zy!7EyZ7J^?DuhiAm~j5#ar7!b8X#{k=<*)YlUvE|mQk8Jl3E{0H?WUW7pon^le$VQV!jF!R8u`{njD0zB{82fAiXT5FsR8ju9> zj^V}HMQcf)Iu9Imd5Lo^+r$z7c@#@MhZBvU%L!NXSL)B-k=|2RJ}rb1GN9|_cK+!8 zuH^&d?FZcg{;~p33zp|O+=Dry{Z*tN3_*Nx8c`0B+T52Pc##NIbcK+!*IXPhG%L}! z`7^cPo*2jkq5DM6>AN8h8EwXZI{>-@{Z^F*B|pu)PrBdH-)@ypBnGYJ_BGdc@9d6X z-@c2D3pf6wZZ*qq7Sp4xUl|vfGG569T|o~o!B@1AE7q$BxPzdp!4oX2!kPa(Iv_Oq zGd$SyQ#5Kwl_Q$KS>azAs-SmAf~FdVl0ss^4-;TBDEs z@733)>i9-^WjVsblM|u%i$6Q;(+i6)$fR~Zc@B!){-i}7CC;)6gB9b;FY9fWD*Ozhx}1;P%LW2 zsz^%4oFEf)O0i9F-vOW780ccmVfe`nC+Hn6Mhs5~y#69?DjN+4%***jaBwox#`r}_U~cTl2_W z99IcF{l-{*;@8cC%@+?U2Jxl<<7EUgbqKtXtpddyNl7GBCVFRLCjnyL;Y^wrZzVr| zg>7S)w3ZNh^+)U^An#AmwN_Fdju(gwy3$1;8;-GRM+?hBcw-tOCtVW@Z)!dSdq9kY zr?EtCR>n|1#d&96_L2?3GhPti)pw<{k=eH88E_{-x1rJTDppwMzLG29Brbi1EIpg5 zbmiCg%~%yhZ<&N1(=_)FRts9+%=+!QLw+&wbL?f>6U9Rajam<_rY0!Os7ED%;eMSDVhv~!#3R*t)iu0xKoWnQDs1ek**uo~Cn6>z; z(syk(v4gx@i|VxBu}~W|7r(+VVC6|F3+jUNof*)T3LS@5>rfT(#PISaQaF0~e6JTY z@ri*_y1)Sz8%uhg5?`O}SW7+2s*@Y_@q>9%&tb@%SRBgXI{WYAtWthwpnYdSm(>AV zp45HP17EIeI%+|JS79k(8Y(YG(_B1cb{)=}=emqI+70>_={|?+adIz4;x6M)G&nbv z21Vx=F>@Iw;QsL(=o%Al{a}$YmFZVmYz{xp`fz&rq~8kVI#By=+mi7v$Xo9|`gGbaR&QGo0GI z5KMi7$%Kw#NEW!YFoaXrf9>|YBtbgS8=FC-#>iT~9|J1)X)06q zj#PvDT1(V+FWuOivyeTkiN`3R9%_KRe?T|DZ6NB()@!P?^?ShrmsV2Q`43_W9I^IE zbJQ%aEQ~N(saSjj7*Arq<1s8b9m=);B; zSw38LAnyw39)1|@@!B(3l-x3A>yx%m;b(v7!s71ELT}Zm9RBXrLH5&n@H+ylpnLzxsuTK^q#twx8TkT>O(ep!FJg?> zWI!FYprL@`3{GpLWk_Lz3>h8VfB*JyvCd__XdyI7)^&E8K%E15*Fcw&Gs4_EJ|>{i zRLf%-A4-5bwq6HqBu4SqIIK<;Zz8cI#tL0I((hQRfVW3%qRJnge53mnJ^hQ?~_+=zoA_mQM>U)BI zW=5#kL$eQcE4IJqjXaQ z4Z{6~8_xb(i!O5vdCL4OMM0_<&}=GXhyV5oS=thlk_#L!c0kt(hMa`IVNu?eCuDqj zCP<&eQ2c?aZ>-jbH%wr2hJ6_|Q(QyHl4LnZ8SV8|M1H(B`bY~hRh=UfkJ-%oDSB8S z?=I+;`1DVIZd71ba=|_*3PqDC@@nolci-(kwqjp6IndB%9RRB3C{ zprIji2~{&yB~9M>-^IQ%z}*8~O&`grCKjWYH1agQBo6SWoJO3h&R5*MI!?@EZz|n8 z_G9CHk+$0`J~5rs1-boLO0?8p&Yb&qm`5efWj#^VyteU7U!ty^c<rh?-;o5fg$RoS%X3s3d4PKW zxAgG*8L&i7eF0kooaUI)BW}754ulS`WyVT9w{t=S@ov( zWwaRh5BIa0#=Jn@bI|p37shV;a+}(d#bOY!J&zPA$NORbCx>tu9D*4uP6Jxr5t7%r zRPd)8IB(;!I5c5t9~d;A#P*o?KOCJ_HS_HN_X2c3a6qq9&$FJEbc+(nv0;y)ry;N! z7BY~xnRw(#tU~*-(Ckx*Tw%nhXYYzM99OQA5G{QOrF{q?aQEN+0jH=qmO(r4nK zEeB14!coD{kuz_JP{?0uEFQgnb+(O}MGc)KjtvPuChPt}TdMH!(COVy)dH1pHFM~6 z_-+1t-Vi+C-h%D~>F;1%w`%94muc@F35`kF#wC$1D}Rnj$tToT41_{|Y}_=#W36mv zcq0{p{aQXbxhNDN0^a;F(yVBU!E~DoaPL4Di-P14+kuc>Vw413L0C9`V&lO?ibE`o zM}SpHHtg-m*k9sXxfTt-XMQ!r286=FL~Jd3U`3>)S^6M$!=2VI8|Ee1bZHvNLR^@ zAl5HRS0L{L=oSaim!+L=|Mwj3T|QS`6j073Z8o!A;G;7RWzG^AS83{|LIl=W13=K^yW_kT4G;63bN_vfp=K{T>QC zN$@y%wE{4sxa(Sl#g@zXg!qNB7UY(>0mHB|@+MYlcnvweMmjrqz z6@Hsene`@5o=eKyxJc z8qJAdzy1umgs4cH=IW(IW3)TTA<(W1;%YCy;8>6k0C8iKhVBV|NZ%2L7*v|j@Ay-1-Nsw5h98;mwjXnxr);@ zOFTJ4S&fc4vfU?|PV@OVQOS|k!*H(B8lk#3#1S5%^h?K3MqO;)Q2{PA=> zRf~Q1zC(^LZdiP)5$APJ%B}zDbLg?*&Xe~tK^_wlfwnSi-r^;N<1?LRj{zmW=3B1m z4Ibsg67V~4FrZ6{d2W}Ji?V{Qt$qrvbh_;mMYzU#x%IR|4=aO=ruc_o&>E5UKDz2l zP2X{Eg(%2CX;^^$r@+?c@aR@m4h=u zHTE5OXzxU?Tg(eb9A=AY2IuXka*tVOe0%nq>aHU@0o&I+&3jQkXcj3#KbR<4vutM6 zOq4@##K|Dw`w$}NX4ZexGmc2N5r>WDIOUk7IWuRmO4*O}bBlWT5Ezh8aZkXuk~}f< zV3;5oHV#Fg$&~1Qje73;^(7hidJlVFHINqxbelanF`kNhGGl-4yXz8!EP83m9Gl5w zzB{Z5Ms(hwC(CQJH}7EEq~=!sssG-Tu}~43^ur>jBBE9dcV<&#dph7EgRX}NBR&)P zG?DUs(41`QBHHM4zwhKoJ5iF2UT*I_0LX|mWXL{6Dgul;^>v;~_?%Q$46P4(3|oi;@OM+Jt>82YF6 z&HQ9pz(ogL{`|4HREX#b;i=i|;DY_dN0afH1Sc_8YZI6cuH{9N)QU3wPeY|TH_Cr* z*yz;WO}m-2PRNRTZQCZl7_koe2)KXuNd6T>E*gI{q2;)Bl`Cxf2vspYAQGmq&6M>> zMEj?6LkJnZ5h8kgaSFOp&n0oCgXcWPitK}rKGVDU*h!X&*5EE(!2Np$>t8`~_`dPT zX52GV*RV5ZM+sJl|0zjwWRpRRr!L<`H(1v;h#etlEYT`|L8lnIJrInLW{(?G>b1$A zKOZ{T(I~MCxLBYYphHDVv$^lOeJ96EVrb_M7t7#;Qb2pT9UC0D!ky%8-#*orVN6$` zkb7fgTjUqKLj-&z#^P_kSNlB0;J!e4ZB z&9kcx=L1Ba9bjUKe2{#p&Wy)<(JAjZjizyaO* zvBdDh+&^5@#Vi-yUtjWc^nR15L|JD@!{T%jK|!!iG7EGuxVl8*SrM!Xl3t+U*9H4*b?#eZWx z_X%(KRDkB~#><_(&UyPM<^@S$l}l(N32I_P1iXB&wrbO$k7ditr6#`W8j3G&igSL;H(4JtQlF4# zQld#TQo>VP$=1-2Q3LMZw*FU;uO2qPUt1Z^nU^kEqx0_@TsfDKni6-M-XYO5zH4-K zt{#n|nwp$Y()|x;Os)n@7t0Z=dil?+eg9KF+`=e&6qT`)5U` zq@!EP-@b>S41ul13^qH33o-oz>27U_-h99?TLrP=!g}Bfr`l|7`J{%pH$x;3Zc@b4 zfctlB{#OuGWb26>U7A%+C=F^7s8JqF$YTC#FO>6eY*9kHhIJ|bsK$|YiAwrF&lZXx zo-{<*#5UtA57*1Qi=VZjWxT?GO9Z+PqR*AQ?5Y+)y@f+AFkR@Tym;2_vB?dM^u9#t z+&yU)uvpabZ>UdBsR*sbD7u)I1|nggFI=3aXkXHp2&RDj88PU>9nik}Nb9y?x)8)A zq;cw##Zi6pPDlbWNv13@-kzae-BcZDPm+6 zT(@Fd=wLIUDq1W`Ee{88$dwuo;F5xFpo^M9BBI*9GYft&xEA&3m@@JY4{F-j1a> z3vkInH`84Z2Z7Sqo0Xb82qg@Jsu%QJDpsTQFkVNl{s3G`(4EA`Jf--8*8ZvO>lYgW zc@kTQ72<{kyNMXJC$k1Ch4SZ&mk7GQwF>Y`Lhfc!At8OVNjBs>5>hCA8yV>)3k`t# zcaHt9AT_;|@pCP$XN4(J)U~V&!KPKl;4dO=tEGhw+=4 zJC?&2g%2;v-%@$-(T0C$t0}z+pP4&3&sBWmL7B;{D`55c=IETwDKlITZEPQcqHQB*Pf4$)RwE^Fd)5ncX!y)qc5q_PMt%KnX>vNcS=xtF$Tsr zoF}W)3x;Xp?_Bzy`x12bH4YtDN7I`Q_^u#~!0WKZr>N_H~VUTg|!tCau^p~=TG2vBv9E8ug=#tDV>S)Lta$o4z z&&re9caY%btMM#<}RTdF*Y=#+g#aGA!Y_uMenrg*eW{=&Z`+fH*Xmh zIl|l?K_HlVi2uQ^aE{v8zZ42*!nq?p!rH|pGC|5PX?nvb&QS0uthgoKIaaA<&z;?T z&ou3o7rU-l4$uyapj!&3PwG$dqXS1X$#tqD@UwU8Q_OgtOGxOF_~)7v{m(v5UW>)t zy5AGyHuo9_G2v8iZ5`m*qz$&WsBN5L#zg>^33Ssqg@+B@^}>`ZUh2&5~s|>KEW$7UCoGnQFX_5au(NkhCU(u2OKJ`!6sOTMI*w(q=RS38q#SFUGYBWwY z5bW=0oKq&A&-Er@^;V}F2dSpQcT0y~+mfnZY~F_YzFv z5Kk?}#R;whd09Z0=NLDvg8 zt*G;({Y4z|#z_{BaHvB9D-HN`6btMEz-0y9oiODi_zLau6bJ5tK=rVmxcD$+q{ zrs)KN7J-wdGlj;1lwU5<5Kyy)>gAji9b1#1S}%mm6D?+|b<8us^CfJci~90tCwR4J zkm>NXtjUMd0*~h6WUWmq?bNym^y+jh+$cR$QVu*JDvWXC*0b*WyerO-AyTxJQD$2f zqwIM>7a%V?=-$>|HF`ldssfJ4x0m)8Ykkw#tY|(EU`RUqWhJ~v zgUS4>bve7@Rs_p87;~*(Q@+6p^Y6cffBg;z=;~|6XOG)=nC(T{5?Dzrz}SvBYPgGOT;iXSDK zmS|vc+%#fz@V`6HI5^rEb)u~b5^aBVbp-NqgKn1pdF)`EfAmN>U8*J?CqO* zm7R}<0=a+3;D68U@7(8KLEvV0hIid-(Z&ev1EVRWbi{92Rz60nZ7hFWA1Wj2XIhF| zett<;-{LYp1Ic$$iR>y*;LV4RM`=BvE7f4Qdjq(C*YN)p1n&<86#mm-r%!S*%jr6K zEn|@^!)*eIwRe#J)3uYMQ1K_<;i;Njr2SxyA6U6Qh3o}>bZkx!BEEd;xk_-XLV(K$ zy1lz9HkAF#`Gz?48bMkud3HAev!hAfxj$kPQpLpAF!eCpjZS$suC9nGYlKsrqs*~P zeUtucjDiY?&FZcS_HZo(+fJwV`F91`N?mM7ZV^E)=M4+i<$exrViGIHN|FaTUZ z&@~`IJQ2@UN5n5E^k+T%J^6#*JJ=1{t42oAmGtDx;6y;v$GJ~2?~T^W?_B%5rW@s@ zkDm2x8vH_qI4SIID^>vaZ(IK>$np5No{(dFb+@lzcTEd*$^55rxjBr3?fX`a?^2DP zPVC4Q=0&Ham>2A+6tN(is zc#DQL$Oi}Pc}V3a?#x$Jr&cwAzu&)O-M@n9IZbyku2q#=T6IfGJga#8)`Co+hHof! zV42%%ND$Px*FevUvivZ+6_6oeUlBH0q`aEbKzlpHjVg|&ekGOx0%D&YSnY}L&m>ct*Ms*{X?mBaQw;5fChG!&nCENzC;7FLE{0i;AJ`6>b)i-?I zf@KH-_us@oHy2OptCKfo(iP&&wl1!mZc)}jx*w7h{Dgo6k@3~X8M^6n)i6&b6?(6V z=f;XSdJU)_UY@2=BkrkOi)3QUtry8ML z{Rc_PKBeSwJ&U8_y*2#U>1jFEo`=1@Wb5H*nPPrnpHFQ=E(5fK1n3&{Gq6>!xmTBR zi%h!kM4o6MUsW-$2)G^W!#{9JW&}*4Vl_4@BjFNGyS?-pc`5P(`r~#EHRo@HZLJwg zX@!2keG9tYZeOngIIe_z0tkMP&xl>WM@h~SLsD8n-5uhBhuh5?JEe8{EDfR8YJMKbT~HkTvs^hGz%osZyY81T&|SBGQozGdL}9 z;*T^8FZN-NAx;NjN;Tl^w9m`&dsRb@B*ax|s&4FGmHwm7|9#>6d2T>8CYQKvz>gzB z1IYXL%+0@ou=R^bZc2#rMk=g{pYWmkoRw2{I4MVlUP3< zgN7*Ga<4rYYhKXh&y{XMQjlcL?QF7JEWrDLRFsg1zdU1HTm_^Bc>^`D+)&>Jgkp6hnt$J8iG>^ z&&l>i)*iZA87;83-I0^thv2=?8|SQVV~v?chF?EyPn+12sDG>S&<9)v(5)Mi9Ekp8 z&op(BII|Z7S#O`&Gu_m`U;8NpzeFueGYhw_0J|pQC{@Z`&%#mR^NUs9} zi;;i5`R_a1zj6NWS>S&K`Tm0-3iifyH^1{#;>?Ir4pYD^3g)J+x|oY6HzF}s#(%N^ zRcV1n*JGAsn={aYT7iyXun)=~lBa)VR{zulzF#PTE`!Ao>*qV-4b9ePwAs6B#WGXY zI~aVVEAGIa`rLKf}wbC&znLrE9UTuDQh6FGUzJ) zde4=%diTT`&W>* zaCc=PwM$F>Id7(b7CHWFk(OiFO4hY_T?sW8gnQJC4-5)8c2J(w8BI?SF<3eQ?Qc!$ zF0&Q4={4Tg-L?K*L;d%APy^lG`Y!S$F(XCQlLkl-arVJSj}zx3UAI!|&s-y0Z|Scj zNQX2+oZq}6+1PgwE$>TvGNB?xF}{YyxF6$_xNZRZ9d*#nGW1dIjL#ZQKM}!=0*a}&;I@$ z{|ZutC;mr0fzml^hot#5&b^&T$VNxmad{S^;RDmrO~5A;bqC)s{xDwW+|ZU)s$xJ( z++cVm+I-mLU7gx(IXVZlgC^*zF7%)GHF%Ey`AX@Wq%{3Tg|3=0B${UR2-87N6~P$p zy@$==`JXwzoh#+F?k`cI#8xd&2OO4ls=HT*D3G&pz|{iX_OeF!va__99x=N}I)>{( z$CJphW5rIKK+Nsf41dO7&doVLZ`hB@9Y*>1x#;Zs4V?wtQf1ABMuzfP*a+@^0j@Ua zZt3F<#(V74d&diEE0Eqa`D`+DoYZ>eR*f4_bCJz1Q?GENa`l;aW+J(Y;~w(M+n@rD6* z{WUU?wwNQ#89CKzj42!|!6wmnRIHApc1ky)p$j0dF6c^1D+y=RlxKB_U|dDaTa3+N z!06tsx)@P?`*j@k1vZtHy3#)G1@l4gebXXTi^s||5515A%&XMmD_-z?$=|W# zUqM_9gUm<^4=vGr_^NKvIwbdkQ%h z!Hv3!{)K{xWd8-RK0gkSR}XX@i2rB?di+QvUUPv{5ZV`_BZTaU#qtbIvCyfj%XEbM ztKrK3kG(U2$Etnz{bP*E&>+%4hEnFaGNb_!k)cpzh$8clAtafaWXM!fBxGo$%$b@D zr3?`&G@&GlsC2H2=h?0E?wx32qI_qy+Ut@XTN^LzZz zbIaIcfj8L!XItMrSTATgUSy_bS1?xRPte6ap0Y4M$i+Vk( zDQc=NiuA%fvqIGu*Z$mZIH^><-l_6Y4K1P&(^4enXaNIFLc!;2j&jgf( z@fCOPvjk(|=Q3T~?Pna6`{ovK&wke@Dt=?QOjz=;y+QV@bk6m&6Z|%s&3dmYcF{7L zmVWbEcL2s`L5GmW!n% zX6aPv=pV`J?pD!W&cwX*bicCfHh23(iT9!!GPcYuS8=XK>36J%x+9;qUw+%cy>`c! z*MX*2B0E}h1tOMis_*1&WRZWav)DiAh&f+Vd<>WVPFL-)LnF_sw+Ygn&+ZtlVP>l? z@2~A5=votX%ii*YGM950(TT446uSPi%l+r~%!Um79et!0(Wk8WperTTmeqbUW|dDH z`#iz%h@hN2x7^Cq4SLq*rfaxYbIKBQZHT&;?$le`e#mE)xjx5jIPs+5PL27^Ec4ku zMd{wlIV{1jL%pA_@7KU9yBvC+_{(=B*}6CiFJ5;o&p9Rhu>Io#8RB@chp4-dEyR>p zf5+qZ-)1XY=j^tPeJRhCWUbNTski5CvF#-1?eZu0nLcN z{r&Bv#n%^FO%UR>CF-VTX_WUeZ!jF16n$XH)1qAv6kuKHx25P-Y)$*fDGAB=C1Vdv zOH!XVUJMsnrZcbpP_)Vk=^3vKGjt<(DsNmXAn4i=bs4VCV;;QIYIVQpk%>^*{3pg1 zJZPlZi$p?C<6J(Tva zm#E8pH;r#sD6jmpEsj_7Cb!h~&*cw$oNK!v^^Vuzslz%sNrP$TcMtIj<-6V7@pLpW zXYljfD|uTDGA2GZvbh=$;LT8I}fPy*hfVR>MI*=+0l5K(}?34-zF=!ri*9%?zWlA z8d{8=uORjhIQO9}j86|e7^!Pd7rd#|+nCWM>|C31zELctN^Qgai0lRGf)CEFSDD|; z%D8f|TBo{BS_9n$&jhwvRpuv)bT?PNef|UAWl-YXPt=vR7d4H4c&+SomCtA0fLDtu z_xffo+cF|`q{Muo_tGYFN8uMc8>5SQM)O{$z6;>r%66{xj^Y6`pU-tlb5eIsRugm` ziMm_c51sIH3lRTs`>b?DP-5WLm8%05!4U-LdL@n2=#N|Bu9*yE$Sx_CLXQTa-LF6LrV@+dM1h z{%qJd(3uo*q4Jdafu4zz^?a`{m=}wTo(Y=K)%ok&VJ)jp<=nRsB++i^mj7s4mItFwTdHIjr`D*i zuQbm=Ca*OM*Dm>R-#z$hkiqV#`f$Ia*4mmsNW|wXJO^cAtTYeUvpz(MRN&(yx}|_q zHD}3O{shwIaDSx>mCrunSm8DZ~>*Jm%?@Lue@`^C0R$2iv?-PU4uh{bv)AzlxnZev}jC+~o; zzKz~DnXrwc%-I{C`gtkN+Y-R`soX4-<5YfE4B-rwVLaOj3X-J@%j*D{|T zyR!1r;8n{`g03e~_s(Y?b>Aw|;m@nR%2l^dtl5A1Laq2+Sx=r@c`31HpYi6edfia{ zHR45l#tOb>=UUcvNh(re@*5X@3K?S>jUL0kk+FlPDP z7m{C2u<+3Bxx1k&pzCAU%I7o2n(u!O)#lOf|+8SZ8){dGn@SQv>T$Olssb}259OH z((hBQdhchrFk*Aaua#6ti8nu*a92 zQ4;SeCg}PSbvoyUY1ok?=&lRT6;IP@{}@sB9YumT3Q&93_g zDilS}7H77bD!nlLRc*B`cee8rkvpG=^FBYKF4N7bCv_qBS6jaJ60VCW+>G>*QMdJ%uw}qhF`L(LC2DeY@vv@}oD-eAzeZ;^!0JN8z^&%EH(- zLqTJ9^}(?fy_Hwje5{{1rI5bfqC%xvr8G<5t!rh@jEb0x2OjZ>d!7HO;~T|TDbkgn znyOLqzGJSLSH^L2hBl=F~dgDW(0aEjnFMM3AZcCZj6r z^|X>Ao06QsAMuR`Js?$$k6d%OGDt_p%~08zI?EJ(BVa8y@YG51ji zuazbeMqRhY(<+858vQk;T23o7EGb@0I{P9!>ubs57$eo*=sn+Rzt5N%mwnkG=x&)T z{sxh9Uj!0$j~FhHx@P^jQv3Lh!fJIHqq3n1fnC0qOpMHjQ{0ZNjWv7oYo5fGJ-INSu_cFU*A6lM+82fq=TZ0$iLx+CrwD9Jb6xyO|76zQQ_R6FXE!q*x|PQB{HzrFi?DFF z0}`3V*H4(AKfXA8oc(KgXt+-w%k!&E$?;h~GM`z7ZO5^P5-*OSl!eiDQnM}Bse`Af z?1sxayX|5d=xf+7PH--ll@YE@F1%Y|**Y9|o=;_`IJ1*v`k@3V)@|wyjiKSTPgx9& z#3hn%5_FFcbw9I4tx6?rzU_N{$^7Oe`=YK3J8ijg>**o-1IyJ9bU0eJhUdg|=rNv9 z<<7qPV2r+`WXpt-9(SmG=IywTbMpO&zn2Rk>MFcq)Y^DjrfBo7clSl5CY)mjU$lz9 zT+}Pyym@1{g`SqKOK_>_(l4wRK8N*M7KtY;>b@8&D5a#t_9jVOU~e~mi>Blul&JeI zMt4=uf{BU3l^@ric-<>&x43{_l2!E{xAaibs2*>mYf7Qe(Jr11?G8)E6Hx!T$F=av@lS+sqAn_5E&>zA*3fq_9H3=4vP zw8ea|NPqY#_tSee9t~y<2b7=eokLNwia?J=$W9&0F6!+nDLo1ZVN$!6bL>!T7`Y z?wgW_2%>I+dsU&ui6B{59hr2m!y(5O2;M%kP31a&Z}!J{`=_eLi-Ilv#d<_V;@d3s z4V*om3xCjA)pknhft@eUlgE3yz7cef5_LD9GfRqMHCS%&?VF>~?eToab8(l}4{54j zN{{SeP1C=`eot@Jqd+x5iG@CK%fp>+CWr5t>?Lhext!qU)?hqioS=J*sGB=aQgDqu zL*2x@*GKJ+seW_i$*vlRVXxO37D%qX8)h$ZmHpXxQ-aZHv2n(UG3oUB`t$7WvlVUA zymy~;ENddhdz`52ePySD0k8L>K9?Z{`vUX$wCo)zwqJWq*Y1|r{p@{1dNx8H(o5|>RIOC7svyLBf~d>m`BZ*63oH8v*T4^ZdlhocR%!%y z4|kmv7cOQh6wNQ;4e6nKD;8vw@RL{mSl7LIY!?N)z1OEV>|)5?yk*1H4ubAUqHYG` zuAaF*lhrmRLNQ-hGq;?S?z*YNwr0gr`tfZS>2&Ikp40Q3%aq!(cv4EzV! zJkEZ-$b8(oyUWMz=?2qfEIhHIwUwnArzLiG_}EBS-Q@&88pTQkn~$&Z<8opARi|Zr;HHG6$%CwjjqXCXPvy?L^B_0w%ZH;6 zS5&MzzHEGfkbs4Ukf73q5G**x`r{c(58w5jqhBJ;zVIou$Lv2m zsu42pN1{nuq{kA)uw~9!y`WFD_kVL zH;NzD33&yWo}iR8Ns?bjBj3~ z+l_;JhD`btw;fF0`*Fb8((E%K-gu(!fSKND{-5FJjMHx4SfRGfZ-s@d2ZKmeX86^( zFJ;Ov1FSQyL=AQCu#L!GcllSr_0K(zHjlox@>o&KeCze`HFO*VUA%^rh0%rC{Epg8 zi8HobCy&{3O>F&fMX^{gviwce=Cx-L{^c#m|y0Z-Mnp?b(K64YiNm z#$LUB@2bsEC8iR;b76MBsKCv2O1I^{w04By*h9H)NkrXz-P5~QUp+aP<^Q!L!Kw3v z?1}w)mM*2X^r^)soGnh}oZ1l(8)q{ncd;k9HO$Au`Rl|ow;Geuh$QKe$mF;4ZxM8H zZb?}fV~ypOEv}P^Y>x}(Yglxv^Sz&p0F%Rml`bvc`})swMXjm`T&*8DQ)f}7Wtf+j zz|Xx>sXBZHA>MV-OILb1@5v+RVq2yxj6n*#BJOr6s=PZFU+gUfOkED21NBhHXYxbn){8TO+@(89G^f!ZD+2S;NKm zO1p+xHmk2C=;F6}%EDM6TD7Wi|EMWbqmHLN%c(CfBQIIV9(VX9|E_5Jrj1V7S6{-v z#Z%u=IpeNYyynwQf$A@AH`%i8bvWc06_UE7C6%C?Le%~7VWZ;3Jo>HL%+Y5%Y9^N? zD9FBIxb?-&;>Iy29r0_0OD^(oKl5>~yPe*5eOto$Gt3P)_DXqr1ZA!t65p|E`y@g4 zJW;pkT+z=0Qk=$`fTip!RYh&-=&s5wu-a`Zd^qg7R>+DRtJD^)X0M6v-p0Ojt5j?z z&%RmJ_sOVuX3fh7FRUw`$`W)h5OvoM$d!j{?oSCVU+(NC9x~wnI=D@gB=S9N-;nn& zVV#YP%G=yee!DJx&eXiGFKF3%<`;~!3=UY-$8Fgsv`8~{K0z0ALRlDJ2(pgm@m?$l z8Er|n501!aXJhV-aEl7o)AW&EG+1~@*jD{Dtdwh#pxiyS99;Xv^Gs^}g z<2Ec7yu}pn7gH*wru%x9tdiX2w3{_|e$Aop`yz7g!OmjmrRy%wc_mYGl5T64eQ)Q^ ztf3~ksMi;bpY-B8UrPUQiKrX1ZIGqYTKfF#`0BKfL@my_Y7uuG3=bSgR&Ncke~>Nf z8MNNu%lSaTxmgXid1`z4Q}ecOORhU{vFU1=u;IkWI{&kKa?(R)0}^Es-TN zZgMxZR;tcr*Q&9($3CSCOpXrAHEk#8W)XGERim$oE?`{obyQ~QV$Ii^>Xm1IJM8kR z-aYkj}xc8^$aw2aIqyGNHXZ~uhCk4k*+SsWqV9elp;NYL<>RpGEuk2r<=X3 zQ*Lhl3`HYh!Dn^{^$q#nR@4+}vXcf4AC9TtBMnAu{`Epx*7@R=?yR>)<7(r}k1eU- zC#9ZV(zzo@l%ShU)RnL3Vc%3&_$BarZ?MRc6{eXrXL#1JUFFpuek{#gJ6@_Sva;Z( zgw?@UtE{eYoUVvty1cXZ$Mt24&h}qsyq|oO_*|Gn)cx=|G=9J9H8lno^~Bnt6Z>}t z)@l}er7?H!%d!8S^H!7Z+XJKI@!S^8=thAkFNKXGyF#`w%y4d>)a5%T^X&}Ioha=r zm#BO9A>B6rSb_APgU@f>x182vh8&G5l3EiHVCddLws(*v4gTOx`>q<7Owne?0QzLRwZKl^QE?3wS9^Er4tH9 zZ`K!fMo5=B^LH`(v5r;Ws@AVF&P_U_@A&D4^GQ;ibCb=5P9{RU_$)_R7~f_Kwr~lE z^op?vZrP!KIAWCX*%sNON-GjO_mEBv*zp`0a1H%%?A(0IJG)o6MxMSP{&Ut{uQ5mI z&Ef0iKTnRzsMEWBm6j7_yn=tN+s%Yz-azU>Jq_f2a5&{TZRfcbveL?=D# z`!fltjK@88wWaPlbT#|2)p}K*XE*euL(_D*0K`zigL9$(@CTI$vs3wq81$XBx{e=FwC&$haZd#@rMP+ zyVQ&aXm`u=+|`@!??s%a-XQ9de0i6b%r|zvmXl^MBK|P>@jap4Kiz(%cj%>YtTEVk zrYBi@&G(Wg$DT!QAz3Zq33^DHr>MW&Cc^dcTy0f5zVC!Q;JXOQ!dUs>x!?7nrWK}@ z->g>_JT$r1HpD)><3{R9hRZGu-Mnr?yKV%*SoGPwg@SLH_a>K7=H32O% z^R+6r_^p)Ee)EaCa`pqFOe5O+6)vj_gb&Z!8?!#E`RV@MNr{u^D| ze&?G36&d<)QlzX)UbyAjHANc>!dNoK%Fgy&6>RmH^*m;dui3(-XLU4Ys1IDgIXWd? zoU2h5M)sIm$ClMQSK8Mkr*C-wlC_@4O!(09g++}HB26<}_^(O6mCgD3GJJfKx9a?0 z4u>k14g62vsV?ff!lcabF4&5VpnIFBdt?(&><-fzbFRhqT6*+3Z3>8BK6n0;)E>qP ztv&oNt}G1+GcnM-T6XLvebKrvV^R~@8aYcgWxjK96#a3$TfBt$ezK6LyEjStQ-_pc z?C3`;-iIFY`8-9opWZm0NK;@^%n@#0^K0kxLT;O70UVMW?)Pxs8SeaS8TS5;!eb_m zOG0HKdsB(uFN%n|YJ!*InY9WoiHz<`WU8tPmFHdD_K@47?WVD{r)ovjGQn02>6NeN zxj(HqD8`MuGC?@KD4dLCgh;&qJahdp-)I!Bdskn32 znICj*E$KgirZ@#??)MnEx0QBV=-yh^-qSswvJlK`E#$6j{I$i!LESi9GX-d3hMBP^@Lz|+; zNSv})>p8x?V{y;Eb-;LLW>8DuuE2>!Yr^BTAGVwjyjuNpNaXg1)PADCUB`MI5tdia+~~A+F21Xf$Z#~; zN;>1?c8OV_UV|e&-I=P_MxnTc8-gOBJwBN(_d7SKbj$v@?a0&;y&}I%bDI=Zwo#q zqAcleax`J5>FvyG*J}!72)dO--Plxx=3T?uHOJoM6|CfBV0ziW>mBV!xAkqz{eb3K zmpE&5H)<92JiF-?{8&ga-)N&XbAM;*J@YRe$L&6R-m{kYoK;2C&2xRG>2uKiQCD5F z?jE_^JIT_|QzeD#nsT|GJ33jv@Jf>;Md_#kLR8K*f1b7 zmi$!1up-&^W_#H-A;!_8p29wNBwTA*oa#<*<+>J~;^h7O7oApJ(Jy`dVS?^mqVCJ2 zn3%zZyYeLcMZ-Czq;98}AKBO7Al=>??!x_PuJ#>;x%W)ESrY=^_oPN}wNpV@ zvBtGE$r;|p#Yr6Xn(}7v#gqJ7+8md;8_$-5HrLzlN=q?UUQ`Rikl> z=z_P#zNJfJ3~&sl#9K$yl^4GBdXB!y#-3Kyc_$4w-&WxI*t%oy2aflVNnzJC(na(` zPaEyivJTO6R$sW-X<>s)`Dv*OcVFCz-)ggqXE+z<(iGi#qOQZ8O%q$I3~O7D?=6~J z+880}Et1Ma=c=$uC;xhduu8p&v%$xaH|>R93#)dW-xWN({;Kb~%lb#&B?a?!u{TWa zAm}y_b@#^_mT&d4^HwkHsS1xhBQ$50RYPRgnd^b(4{zS#ny>3IFY;&`b6k;2&YXfh z8`t#4*n61WWqB5*@wR#P@x|?u1l>nO-P~Ha*52VS63=R!D;Ct7jmW$+^}IXO_1Nm6 zMf9GW;*#zvF?nAX^%lywQQINjUr9r}dFI_v&Q8&T(u2_0>ReNUpd-nEp7&dU!z zqBhGd=@;>NvyrH~je+H2@y^eC_9do!{pw{h${)CJyn1^RcjuKzgH=Cj-G}S>Sp5pK zQo7FS%(9akE$~z0SG>i+v0`G!hYNWvs=kCgJR$0?x|BM;W7#3@+47vMkt%s9HAg*L z?_W1r5yfMuP*6fIzwiA(-R;H74PSm_`R)p>YuYeUW8w;bLB&up34h`tBPK6 zcx=vptL|cyqu2V<-~~aqiKsh#rDZMy>&{^Rg8MD&B>9_~c5P%fccI&q&3(r-Nknk< zJD7fO%-YI&e8(bAMWs5uM+vel{IBlxj;>42e-g8m_@1kosGAy)Q%I*@`Rmb@b;~~m zw!O)8V`In{BOUxHp>v+|oK9m`Ps-t&0$ewKX>F*O=OmXsl=>vSlx0bQt$u6X-IoPQ zgn02;nX)jFdib?SDH#GL6+bI9+^&C*+q?B+I8(TXqs_NBJwxyd@%km7_T0YV+vPZ` zZLd>x^4OOgS-~}%zKBLSezTV}#dj~1`>mCzYo^_r`6T+)rI#Xhva5??3vI1i)I$%= zQv6i()9sP(Wa|Wb{|)Z!T^pkoMYxHDUg)#wm`F{}X?Hzx^ht*73=e*S?lYopkj&Z7 z89HpQeig*!ewi%K*$^Phx+Ec2XGcwMvdvgloK{mtmkjG7W`pLT@ZD>x#JE)s?=)*L zR(V$VM0iBD0_P%>c-x4&iyg0Dc->~mf1qu(!|L@N1;V5$R|BN`1_czNU$s zBR^|=FZ~kzS>t1NCI8x;zQ&`APp)TN$9S8^>;d*+6y0{B?l6WIkc4&7sgKlfWYt@%39&{4pAMEp3xTGW|6#0nP z?Kx35Q{3*TYTAaFT{rcum#-;$#USg~%fTc#C^EiRukuacyPa+l`>o!LpUmnL|M@nr z+3IWKx;YJ@#u{=*$KvE7nxZz`kJQNQIuoQj z+c5j)^H1_d2M)elUXuH;WcW%q|6sPjo{JeP!e`7HS-R$GbvBN{lsw>Ejj}MRUi=pI zv)kp^cj25#1)&Wo?Z%H5ua|cyw&l3Fk)Gw55Y-dz^aLj8zV$ z^8P8#9ws$w>5i9*e}3JXr(L^CFm9h&*?m)f2ZAo%)0Bl#x-H>QUv*(!+f#b&`zzW% zO`cv*IZvr5OvJ)RTK|{d27~wB>bK(6nP+ythd;G*gMpW~60PQztyN^XoQep7B3IW;Q3S*Y54 z&Q^h)W*PgpK4&&=6)rU}Cyp1dh`LvOzofa2G0Dd1H+5?swKBT0E}f)t>6((0(~Dxe zy;e`pEYATkj)=6GiI(Ty@Chl0n!m`|!@r{NnoFN%kbcSj z&~OyZBFMOxA{1^A$oi3-MU9<_hy+qyQ!Hce%?WRoCA@2|8I~^;{4aw;I zuD-pGXHrr}B~^^uPM$G$rbx1qwaBr96Z(-dqkXHAdELhk1n}h?SD-h+p0y<9_?Y?b;3LOuf`l{2GU}Zd zFHUe*JmrzWx@gz78GHoYH$>h2Yc1Y2NA=c*^&h-7OL4Y%sZmjf?s(IQQMC?()a*{L zX5oeV1||7QC#2Wwv<2PralLC-l(>BOdu95w=+GAlTL`*uiMkhVbFnH$aAg`@m|3ki z)3(@qW&AC=B&lHAL~hnXHr|oL%tA+I=e;l)T=eT*fTSo zK9`b*cSK$B;nStPqxAM6TX4XmR5pe^96ZU} zOM=gfXFnYi8T%UJAg3Aio<1RFAwl;&QCBO!P{~#c~=AHyp(wRh`LNC?JpE5 zmm8QbJNhc~-fsJ=Eu#TG2eQPQoqOa5j5X#O&);zQiw3*=tK0Xp?tVtzg?DHbm7eT5XU2llOG|uo zOj2^`!mnqIPqfS^YTNiKar3?#3hn{AN~?lH8;KP3pK)$R@<}Lb+{IWtJ;WVsJv>P^j`k7`9wZX_Dc~`< z;Biw2!CIS%M4AOL|H+2O(iU0=^z;7z#5~aI{NFbN*v20lkVx~PZ|H?J2dw`swM9L4=IMK-+mJ+> z`)}0yx5V<_r7Y(3iplh|NFl5_X*s2OX)#x}_yQLeG4tu1q0PZ+zb(;*+yBuEp4Zjg z*3;A8*1gz*`gNO%*~8J^*^@*%u=_vnUHE@={b~CDd>O#DW@Y2z?hNbnebdk4f3p4a zMgHG2BFw#m$NxS@|F2k6S|9e$b=9WZ)qnl>nEzZ^rA0%_04)Qw4E)!~0FD7y0Q|l{ zc^3Mw5&8e@DDk@e-#j<|PskGC=WhQKs!OXQEd#U+&@w>F04)Qw4A3$_%K$9{v<%QP zK+6Cv1GEg#GC<1!Ed#U+&@w>F04)Qw4A3$_%K$9{v<%QPK+6Cv1GEg#GC<1!Ed#U+ z&@w>F04)Qw4A3$_%K$9{v<%QPK+6Cv1GEg#GC<1!Ed#U+&@w>F04)Qw4A3$_%K$9{ zv<%QPK+6Cv1GEg#GC<1!Ed#U+&@w>F04)Qw4A3$_%K$9{v<%QPK+6Cv1GEg#GC<1! zEd#U+&@w>F04)Qw4A3$_%K$9{v<%QP@E?&k70m4_?xLyOEKAoe>c^Q{Kr#Ez=q|R01L9MjC>sY2}IIbvaOta z+zha#VF6ew$j4zEm&mqCvJL(|HYtZ}t0LR5Dk>NdEY)P&EZ9~h+iJ)*tb-=mc9(2p z1Dgcdc8_esdMyQTxlgvi-+siu|470^AAk)*fWI|JIzg^SE%~@PVDl&2>c}?uJCCFQ zvaOzMn+LW)vaNw^gTFILQUe?2=MmWkf1{iv2`9xkACqnHH!Da}f3OeMjbs})Y_9@v zc|x}Fz&6H%aX%&77Q%J}fJ+nE#tYkPU>lcavTYG;H%(bcq!zMmG3;xTV{RqemVhmZ zd_A6#ZJ4{YWLq2A#s@YfvaOwL;|H52+4h`lTLv~AvaN$`69Aho+13d*+!O@1l5H=* zhSx<1*haQ>lgkQ&O`L4&A=}_j*OMg3wqCMr1=x-Qn4i~VJrUSG3&&v{@pgm%NbqOl zNxtN=@5wgI`$4j;k8BeK+aa>8A8fb@f8L$siz2XmfHlS}4)~L8pJ0uf5&-MJ6 zY?FjNFS6}3*#>_yopc-vz%op>!JkYgotd(bNF!vM4D9ETZC}VXS=etS+rE-*aG!q>ycsu*PPm49q3#(Zd?uDggE&7$*bSrV87e0bCf#wso)_17Pe-WSbgn z8$(%)iJ5F$58GQ%7?v4i+XmRyA=_BUwvAxh3^t6Nm2BGt+qc1nvCkyi)M2}bY@0>4 zX@E@-wsDzFw!xoJCJB*kY-AhOL6~e~C)>2ZwvcS&AltOThJ7aHf|G390^67ujA;(p zrb9jseV9jZlcdPwhd(v~SY|4F$;zn0FhOO&z@wn(RNKXC!USM{h5a`Rfc-P}$Fl(J zZ?WIP{xl2@4hJFt7r+(3vBDkj06YOFz!`7^b^s=TDPRWd1a<-D0FEcS0R=!2z_A3! zj&uOWiwqzW$O0|{*#M3ixxf|RDsTzPzN*s9D~FG9Cyxx2KKesw_-noeJA#n{J=6m z5Ws#2`{<)k&*K1&IUztO;0qiCaLmCm2FH|Oz#H%ZX21nw0a$^VfDz~z1KWX>u&)Bg zj6n>afFWQQcn!P(x`7_R6pq~s>wSPd&Bfd-%!r~@v6{#{t#10Di+ zFG#}qqyT9^29O2h05L!USPI}6qy@Rz0_XrzKs=PUh4T9Vd%yv}@eTW4>{qcLjR1}U z>!7?Eum)HKU_)l&b1AKvVd<8~;cffn#Ezk?#y<-OKhiwO- z8E65X02!d430Oj$djJE#5HJFq0T;j(a0fg9PrwK81^fViAOHvif`G%o5g-Hz1;T)E zAObiF90yJSCxKHy6c7!>0I|SnAP$HJ5`aV?2{;3s1+D-%N5DCOJZvXG9g=`uP(O13 z{><*wIEZ67j@in93ZMpT1k?cyKoigcw1F)Ej@vj+;kZ6P7xr6W{S>$e@%;oQf$zW|@B(-aR05ZPOuz=pSOJbu#uGRI z_yE3uAAsYtKY(NMVc-aWV=<1sfj}q_4pe}KDfk>=?F_g9I2PmB8vx*VdlHBQP6KfO z&i!z{b_V0_Xt-fFhg|#|<3guph@U496@rARf2| zWI;VI1KB_pobNJ_4deoOKrCn+2O@x*aC|wy3w9iDmjXD(E(gv5DL^W46flS5Er8vC z6<`hQ0dS0%58xR86PN^k0VJ@o03om$3WNb?z@7-i12}iM0ydm8u>tG=2fzu;0p{Nu5@Fv2)~0|NuoEZ+aQG_&@L56$@+ttw;e6Q-+G7x~2~Y*pfCG3@gK z+E51P=XPMjx%ONj66|Y1Z#AF@Xu`e%9Ag2#bx@uQ*2e)A@HN9)AN*&*eh;?YVSNJZ zDX`rM^aCG&PrxKl2uQ&(l0YPEp8{~+l??lFKooEt_Va1z)8@+c@fTUw18W{ZJ-D!1_Z!g0c)I#!~#2DdmEq+NC2o+0*JtI zD*%3A34qUVSPs`&3##g{g;05p;s0YM>I=~O`0K@=MfDQC!1F(rr zb!slc1Zzk$2`)Qv{}J6+E)VD-!TAq4EBe3j%5J09XuZA0XQGP@qQsNAD9Q=d3gYC0Nc+3 z0DZVknKw}ODf0(Brx<|e#W}MK=F^k_8kC^`wR>M7*j6L4j2HGTH+$|HoyjW4_E=20I_}+ zu#a(n0x<48;3KdHz}WWz82e7Z1lSH30>*$5umiyO@fe&#m;#t;R!bM*j}>*fI4lylp|HeUY_pbdBi_yVo~C8ut%jd8gE7@HFy0yqMcdhCa7 zjF%a}V=2d=4fmY^EQ9-~{nzrip8;F~(t(RW8juQH0L}v`z&Ripz;PSnP69B082>5Y z1aKS(1cCv70PEue900rkPrw841`Yz)2K@kv&Jox?3xz000L*VR6H0jLKa0Z)M^Koigmv;Y_vYEjmhCrW<0VH@+a z4Cnx!14_UPpbO{(UIMRxb^!B*b;UB6_cs7)y$9X_=?R06@LJmc`?S$UZ!m6+qF(I*kHffiJ)a;0WM3_5m0RmfsGb{xE>`v;|ND z%j3E681&<~kqPS`0Jg1h0FS}CVmZv`1b}@LZU+Ot03QFHyiK_$Ct?35*-o+Hu^2z) zI-n*!9SrdRUQ@irl(-nchR3Y|Fg_;O$7ghAzy|gg!rBVf7%wFsyI~vST@6sm&xGSp zBM-p5U>k1-Six=pYhs?3!TwG_7r=aAd|UwL1rKE0U?Z>@&;{^$3ggrP^Z>LY7%S!hpScVGLja$nwgWit-wBuk zW&qY7>y34_1+ZS$fF*$SSPNLe_8!0n!2V`0tg#IG-C)}Rpyb&Vwp{=x0Q2k!{Gal? zACCF=$}{GIk{4&#ro>69C!UL1J-xu^33y{UpabfMHq0UB)EDppYJrEq1K=J|4crB4 zfGPm{>lXlCOUzLvtRsOS0LPGnu*RGn0s?^mz@NN60qY~cVIUYd28043Ko}4Xp#2r- z9EEiRfagOW+K&Tx3}qjW!~K&0YEjCf4Ua`_$~jNLb_H+;I8C;f!@3M81t^*rTM1AE z6auJq8^C8yiY76(e6ZgHVu2gLbs!VC1|$LJfvdn30PC3tWCK}125<>T2QC6>Kq_zn zNCD!3D1Z`g3~XZz(E#QK&lv|`9nS%1O8}CAv%nbuV@L$hhvg7F9@kg~w<)?gEcFx8Gt_6o<-gs zfbD*=5A%n9wDIE$OIV%LEObynUP4-C zdX@#AXi2k^%L`Q2u+Uk7KGY$|3)cLweo+6YpI6^P0@M^Gq!mCe4m=CNW7od!hOzkS zH@`i$9**|Tp3rX^1s%M~ne`1kYb3D9)RWBuD0ANW!v`ykC-7DZJksc?0X3*o5c8Yi zdBzO$4}eDo>mxn&v_20!BM-Sf`jfu&fk$e(J_Ar@F?duN)R@<=>GlVYoP-prxw_kW zdfMB%cUnjp+z>4~2_9J}BLm}}hq!~ShbJkaGP9}5w4xNxvql0=H8siHU~V zT7yR(vLib^&zu9En*#kd+Ey;P^caCOp2!xi9@gjJGsoQt6|T1QbP5u(QW6R<_8zcx z_Jl$3<&2CC>hweBp$tXYvqk_%~J$=ePx@^X@M+W5FeH?J8CB=!&V>%|Kd=5N{600F?BoAAs1GX@=w z;0f)(8e-Ep-<6%lUGfb)GSgQZzXYP1QBg_J5&jty^mI}ZI9rCiO;?9BQ`>3T39s{q zpbTUU^M+q&d7(_my5>dNjSn>G>14=dQpsw5{;I3fCU!93dEicfLJl4-&QM{}T6b#; z6`maLsR(57nr1^8%;?>yS*O-*f6q=&Cr4H*1P`_Y`z`yqBx8;S(bGwjJ%7yTR12ws zGP9wK%HGC3{^1Tncphlha2Z~L2k*K3@uknBf>H|S(>($UUjKerbHI8gr-GE^%p;xi z|0U{ia+zVbr9b>{@LvAyVPu+)ZKcvBljXa<#{Tw9HEO8ozQ}a#7QNGwod2RW16mca zU31c@sz8UpudEP8Rx{Zec|v?R=I(Uf6d`YajbPdXZJQJYWw53z&C?$!?Xp}79=twq zXJG{5Hjehgwhf6Ac_L?jtKEh&Y)~d8ZSH}qW%di^(qEV!3(0DQ0`rvuFIQ~;t@h`Zh#3`vGMIza-!G@{^mWE|4Q&)XzEwt$F&XemRo$okkgMA|TuD1aXw%#QI-GUXY0!83~kp$~=nd~v6OYYDZJMT)4 z06bKphVxKY3xMtjdnDtg4?=z}oTi`#7YAdj05i6ot&&w~3u~+AgNNLz{&=3L(TvJ@ zK#dhDgYCfDO-My;7RPE(!>a&Mn}7#v`otu=QR~b3H}rIYkTmH0|H0kZ4FxdjaHbfM z4yBF`P=i?jMos-*=qE?udEtCo%7t@q9&CwtZ#&|k1=rMI>2jYr47)Ca2ip#)jgiZ6 zri8}U9)8L;T?SjPCZq=IbI#|Wok@WI*57J>$Q!m0P;Xl&RL`OeY5lAD|V4m{Aez<~DWt1uNC9h@F}a`kE(n}!u5?obA1D0rTIRvzMZ zj#hhPJNFf{nRL{GhkWIzM?DE@IHyR=SoLx2t=#~W!RrHRyl@h1qXBc3Wp3Se#1W9( zMjaq$*g`0?CwjV7cx%8S4Q25DNs!ll^ z-)d}d`=T1Fi}JnxZD&fLg~&_D;QZh+cyMg|c~0?=n4zTT?=t_oK9ty~_oLM7Lp^F6 zdvSYbI~US=hFL!xK3swE6tXkb5_37Hv$I;ec2MRluMc>z4}lkix4|=Y&sl!>H4$Ys z3Lcn6HO{HOCbp@IS&J#zruUD@2w%mqgru$Lq_4(_l`Mb>DsZSL|fKhL1 ztxkGD z#lz9cV;^Mn<2ly(D{W6cf->ZLP8ihiF44<-;{Ea2Lis7r)R^_x);s@S?napVJG<<$ zC54zM*v)zH!eTzmgr?_-UqB5K6r^47>(z^0uZ%&B-22I z^wi)?VuI7-6PVJmv`(32&<|{XBo@$?@KXsGC3y!V8K_ zyzm2)L z`W+ucfND_FKlUy-ts<%OOlMSOq~dxlr~JODyiJY4$H9YR38RUOQ3G=}&WLf$f-+s; z!Mv@K-2CI)&iVM1LvA6v;UO4Dz?Y`i&0gfS5$3&);F$v+N4h6lE??{mgfis5iu&yK zuTKTP%TVv%{@UVy_x{xTH(MurPfuHS->k|Dtvj}_F@y6!JuyAh`>FtPO@ldhB--nW ztot1s^}gyDl);SZ&)RXI^Ai8j-(?cP1Gin!&Z{Lwk4oBJ|Mp~)^A==M79^Q{|HW?) z^frn!tniX{5Q6J)?53>Ti#$ zxT8I!j`Y=B|HMy^+Ew5o&yik08LUq{XV7|C^DEH%!;Jtbg>NY^G^1L`uY#2CJY3FD z2JaGR*PFqE_x9@##k>{#Kc9dH-X5Tb9v+XdjAW*2#oJKpfGN+^tcLp4re4!ypoZD0 zW9eJ2y|uO;)X1}%KisF}IXU&&6ZO{nciQMqm~LTgYwfZKUaz zI{$Gzm4=HdOFim$OQ-Lj`u#6+N)_TJpr+(DNaF+h%$2E+CDdE*c8Cq{ z({Go`#{6V9>HW^=-Hsc%?Up+y)RtFD`X059?x`b%sTTn_%{5!2`2dF{dL8rA>lyB}x z;s7;r3!#2*+xocL+IYg(8!>qX?*1^t-w{y1>%HMTc(nzc#&?IU*S7dwhWay85V@vl z@%TRAs)US37sNoYB7w7d7zf;cB&kJx>|KU^4pWf6@y;r85oxf94>OCLz z^SHnR2F~A_RlerQ(2wA~4LuU}JJd5u{XGAmRlxv^J>S26EA{VteW*vBAvpC5^yzn*E#QG-L1o91mio686LRp^z6!oPke`e)p$t4A29fN_Yd%Iz z)d%12Kt=vIKbU&j9sX1Q1|E4*DX3xIi6OxAQjbo!m2ZzeX)xSO5;K4h1gPyUT?#Wmj zX{X9ak(QG^yx*KYUfv>bjN*|e{jndNidr7ZU_UzW{>&Le$!Z-aL!KY(v92ZBj+XlOtUr94f}0d)(M}$45?Ipn zYg!7Po!X4w&89wZklsM^z;-QsH^XqnA_qoFeWXd$-z?yd7qLF;=jYh-Ufq81cYXfO zH5~;tyryHx9Nl4swI`<|fJP$4y>dFX+65C_GdVuDOndMJf(&@@z02C7<3``P_S~S9 zktgYa2ND&;ku#a=bw-GN+Jo(Y`qid><^FhmrZS3i7b`~(l0SV5B@ z+Ya6f)I3roe(0I;-oCeZ-sHJH4xZ`Q@N&z52Ofcf26AjKr93@<>$gWAJhQPriH|t~ zBXknL15fYxI{Xj67=TuQ?SOh;^@raQkl*IbUx<+%&+K7TC9B|Uz0DYW?{=eTpa-;#6BjC53fKtOCrOI%ealy9_ymHj8 zwz$+E%fNe_fBhweGCKc%E(5=wk^9f6&p-2drrwAA|G%bxjbOUH;pYnK?`o*@{?e;S z+t*C@*Qb*CyM6@8<1;P%hUp)_&7(d?`q#htfw2S!+JEqtn)+J;>QDUCpXaE*M{>1y zxAKHf4~GT^e3i8q;FCB$y~FbY_4i`?Av<&6-ewcNqrB;fq%FA&^e*?nGxffggTQ_~bFk@ou9lnAvuNn%NukQq*gRY>4IRMY1b<@vTrgsLJl3#qB zezPr&?b;1I_|&#zTeGhD@WXB>gO>p!I0POXgCCysXXmDG@xgB_P$9SqYt*LODAT(* z1?R*o_)e8v27Z@gNB zSfa+*U+jO&i~4?R&FsBrmzg=-yxrW zD6Jl4r&<9UG@LYZ*P&P3ax_~S1#PKg8}@^dYpWw!VDxrAy(HJqr$;2@QS4qap8F1!-qCOWae`JgKh1=F=7?!Z{z3R{p zMXy)srN6#K^}5)qgM{pTZ-e2Rum9s6MuRpv|LA*LziTyasu+!(D<5whn0x>|odiTmE@@Qv8s8^PH zJscy< z%OAfCRKrR^GgFJ(g2N)XzhiazoqY$q^$~HEkZ+}FLh{{r!Lv`EcKffcL5h?+$0LRG zs-yn;^?M7JY(Um(P1p{<{G;N+<*KV9@S z+JHQnVXxA!s;2;kWa73Lef(8rkIB$#{QWt7P4&`W-_~)hlkG@sVOj|ahJu3W|IxVJ zEx(w(c}RhN*Eba#YiX(0aNdzlwOewEzTGySF6?}h{;=*&GuC~O*0i)Y1y9UWY|u8w zr)$xiqKCNy(k zNWlcqwmE1!ebK+?Zad}mv%?gg;p$=|Lnr|`wc&4AL?yk+c+30q@_JOZT~CZJNq@VU`YKSkaY3~c4Y zpP2R5%*qKN1qJvqXPwsK4M%@}yY+v*;$2SRS*Dz+wmb9Oo~OLKzgd0QUbLeo<#lQb z!(22=NTjAs{(Sx(cdyG52~wEsIZhwXjw67mI=6!iU((0Bgc-0;=D-wr(wDOi3{|LCRVKUXH|*V}q& zsn^By9+G;QsIj)94fL~Fs-2JfC&dyh`Fb$gns{f`vB$l$^+Oww)kF5ej!40Qh!eBr z;}6X&T0#Cu(#kd&DFc!6;$2f$zHwGN?W~gC3)=J&RzFVlI|6#SqxbXHOQdO_dH|>% z@bN`UW;<;(2h+hI@Tgu^>G)uDgT|X1*z`MHZ-W9F_1%lBzZ?AiSL6vJC565h^nF^$ z%yUT@TlRJB-QEB69`sSae^UJYKWKvo#26e1 zOtoKgie?`JT$M@zYn__OW}!S@$unFr_y1Jw`|h z_xN|ZDo3(yU9OM^A%$kzP5T`=Y}&AsAzkG4Aq`t0g(%o#)YKntanhe@b|zgJR8skkWDvXrobo!Se0zI(XTYpMnB9eS`XRAcbV_Ti5q2 zo%#Cw&ygZwXotfE|6Vb4zm84sTtrq~a4${5t~bAiBV7&8j`{5E4R6|sc9%zC1cPeV zt5tJ(uc3RFSGQbv&;7I$Nn8c0k3%_RTi^VlrR%+X>aVXwij>z&kV2AtbpEDK9(kg@ z4JqpG?N&BjA&V*w-E;7XK3@_NYPHLoB3*aMd%g=Qv<(_4_T15%FI;(#Z&{^%x} znIwncbbGM@e`D6&;ot**F#8Oo&^|5NdJSNx7m8m_{Nmt_!?xsdaE?B8oKou`MepbR zCa@9r4(~kZ*Oeg$(f;X3oMI#yvW`ee-evHiggN|$*LEGW^;GgBCanfNSAl9v*lv3G zgmd?8yKV=hpnRgb#dXU#MBnhjc8~9H$^q}w`iIy6Oaojb|BsjC9!-six%)C&*pJom(|*IG9MZITml zzW~lrwlq9>@t>c$e%033AcbZOh)gKZEMC5Od)rSxuWquOVaC$V_ra}VloWRUZu2$g zH6PNq4>2#gwBh(RQO>+c=PjE5^h*x{hBSQiPbOQc5c|IH`PnVMz4#64Q{3`HEb=8_ zsJG8Quj&40Zkx3k!?4`Z%aAy>fql+^ioOM~%*Y9BnR~Z+V9NQMf5ud^98IN-c~qaG zkuIoea?bMgolQD~B!6Mij^9k4y=Xm9AjfH~l5^;Kp#RwL#6KLh>lvppZM@%Dt`&Q- zINH7QjUO2IQO8boWfM==O6uCk}my;d(ym;1(WJ!@1F~T z>Q`1>yHWPA%P$6P#J%XBlwEnblb@oyNSUZVlb^C*PYs81mV>Ej?R@Pvvo8JW)Ni+! zZ4Hi3u?@;Gr{CAS3VSS@0Nd1;PTFqLI$s_LY{UoXIZca#0)2f_#*e(iE2$%0S{6Py zz0r~S9+RR8vD_Ji6p}ltCd5Oo;Uihzq-o`zVW-}^7ix<3q=CAYIudKQ|2K3bVz^Wt z30my`*O6#6>a~FX%{o$iHp5uJ+(@cWZ|26Q=F3|J7frwP%enc5EJIkgTuT|k6T|-< z8GjLGW||wX-gwBN*Nu1&YfX$dUVYqv6xtoT?&v$G{9;9aoHs)XEdf(jV8=_XrlX^V zSrxvtE))kq;d9y;tAqzpky zNBfj7x?bJ$x17TI+ux8v?e?Gh%$_y&kRcPploU>+c^l=ll(N-IuIQd|_|E$~f4c8) zfRUO|KWL*{0-L*J@Sf*BdQ&q}$QA$%WjIm>BW3-Y4;i-Q@_db9cyCwl_oVZ$8U?Fv z>Z%Pj)z7qJK*1nTaMRM?^xg2BKQ=H0?9aC!Qm94u+VQGU1NS}W5~RrW+zh0U=CJF~ z^0K35^iWN)TA(&avHZxhaK}h&lh)k(`HF#;oD3NB4>4(SMlT}oF2MgXeo3>t=hYuS z@^H_b0$|YBxSJF@QsQ<=q758U$Q5B-_o~ZZK5y0Z)7~7(w2h`UQ+~M6uaz_3r2K<- zG%!e6uUo+EJ?G=jufBJYZ}mV;2O(u+(00K6lQx}JnKo0F14+IeQfOV@xYvE|+h@$6 zI|?O_c1vtK9K6lN_wW7EU`}BTzh95w#MN8f^U{o)?l2n<^VY*5)r*iqw5_vZ>0{fS{N|-H1)QkoYdzI^ z+S*EGtX=W;!rs##zODV|w9=F9mReI@qxYs9eH)~f!!7#2v0`k0cp%DSEAXyIUSRV;0Jx6&PxIAW}$D{AbG>@BF_-$NqpR;5FbZqzpyMoN2GlcxU=fWFI97 z3n`}Ow-R8e-8TBpg|E*Yz14}bKIqd^kwR;k(ci8bHm%l+e=#@z7&X1|_&e{sj}_uEjwV0vuO%lM&y zp>`Yhg9W=bUi3jDV8}`^7Iy_8g{a={g#CB^sr6l&{ZR~~Xu=K9ClIfZNbBcyDCl&e1OK7H2mZEochwz8FwLSwt!wD8({PS|sR zgqZ*f6H>^cwb_nuZS%@G;+9dg8&WPo${?gX{chLuf7#-Y8zc-UxCtr5@k90*yKn8@ zCtj2(=($H^%1M{qH)zdw&ZPA=^#WjCli2zVs@`_-1^fFl1f%2=q)>f6++b)&`%_;X z9K!THLA1fF>yG+(oBUzVa0>coY_H@_E8S3-!6y5*@0_~$u0Q<@*wAXkA^MRu2NV!( zGqMAo-F3wr(V|=*{rE}cc%IFUJ5jXt9o_Fve}4b3Y4=4+F^#lDyG=YvjGu;ypLSk4 zW%03L>*y)?K46FsHaV+%n{QrtoV;FTFIDa3E!|LC#x zW{vSbk4>iyjx?-{G*m;9>swSmZ)>m_<$(qU<5aJ4>7`}P%Ty|vo`%7%9C!EA*@=T7 zt4P~`6w{Q0n(BL7-v*OT7ZUc@>#r$vpStR4Sq|h*Z`K&+0~^^xD&JiD)w8cJ@pn8S zVb^-SfST&-qi;98zN2Y3^rZ(%vl zX(#~I`f@b1Vb;`ZkosQGYbYAp(5JnktsC@#t70}3w6%sd%+BdDgqB8n9@XebXq^id z3;lYl{ZHzA`}w|GOU(g&s?jNol0x4L8vOv+G#sMW4~&vezsk|{oRO>68e1=E)7t_x zR2yZ8jzh+z^C+*XH9ZIUreAAn)_~|!J=J<_8W{ACW-Ne1(rZfA6}`3J&Nyb)c zl%t2yS)B0(QtHWJGJom)o-}RHOL?&DY++@aIlIqRcf4{d*_Gw`M>FOiUH(-RXv*nj zZ|h~Ro)0vwqvzgU(x#_CGv@RwJy4L`5tuxQjslEK<57BH4cJawDy$JpUp%nSjZYo} zKVmr7vQNo{NZA_mPv4hLTX_CY#uUSp-ysE?0w)%~`^nv_pWhz4JU-0JNZB4KR}Xvn zq189;hxMtSlB5kgo@1$?l<^~JBma2>TB2FZ8B$I*t(|OYwt5OOtIwk1hShEApGrd)MB)OjslS z_{Q(b=b!Z%JbPFoVVuH^nm4q(`yY7m(Vu=mRw=Roj>7w)fFYe?)ZUlvu<+!Kx8M}E zO6fgr3T~y%1?PWy#h?{^&uu-2B?WsS>OI<%UPr9Q1IskD&OlHQ^KGTM1Sw>lR6H@| zS&>u8l6Hn{FQ(FWJQbjSPKc)L*>NG~0I|LDg;YP*pMvf+iFigNBha^&az zm#jKlwj26K&u@Ak&DVjAtcL4MJGQI5^WXLjM^>sQGoA5o_zEz?0JHSg`|itaJ8Dq~ zqpy#CZ0kobieX=B|6N7@#4#?cuw9F$;THk8k1*m85?-?zMl)ba_-nU zm;L^)8(|k4n+wF&4f#?FKXG%<>z$K+IdK|EWk>^H9JK~88-s#hUGn{Lnd4qPe+axp zv53K6{B_HLecnS}l0>ODMPdR%g?55=haC0Z+X_{6OtN*vNsW;W`kOERdH1%`c6oX) zkg!U&wNG2>3`o;ls)wYQ0aLNDi;Dg>)6^3#?C+v~lapSCrG1&?JD$mxMBzChc8k|?>{q`p2X{Azmfl4x%z*y)76%*AiZ-~M}fm26|K=vDEMXru7mXxy(G zkJA)0`5ENQ(l&YcsPG}&36Y0zt9;ii-v9ZpA(vOqJ7-99t~i3?HhN{{UVj@l|F=~S z7q{UZ)T5sse$rvBQ@{B3--LE@%7n3x_30k)%|8kce_XnVs^PJHC;#@prp&(QLflzJ zGx9@c-1ztV4xN6*^$62`+h3|b&JAoi@WtB@9*pqi^JXt@owCnXo1G|HaOO>iqC}nXqUK3id zGt*WY;Y$stoUgUzijGHlas|rjHC21ct~Y|7@SKCI4sd7KsF5;`Ud$4o*-EZlb;QIq zLi|WvDe2rQSeVgEz)rSQY|XVfJ_Qk2NkTNP>cNjG8dWRSJh#OsnCWGLVhz&awO6ZU zZ;ufpu$>AIoJvn)v0Uiz8cUV75sADb9KRvq?~Hn5PH3#QEl6)r6XMh!0QN|SU_jIB zK9K@i+|C?o8kWcpjw#`Msm)lWpk&HO^}&zB$C$V(brCJf1hDuZaJ(u=gw_Qv>i~H9 zFMn+eUP zvEUX;xdkqtNM-io_ih~_ALNSKX?Clb#*xGKn$XmoX?F7?aM;CdB1|J#oMBV1AcIsF z&cmejstItFvfq?cM5B>0nFxm^Beeq=0MHGB7@|@LP`(T>k2N@C$nb>=hx6&-k^IFn zWh6;aJU&>>wc=HB1J&Gmc-7j%7vL^NdkhU4%ds|MKJ~}VJ2V+16*5M>u9J4B25aUh+QHo%>ztI2r}Ic zonRHjGvf3CU z$OG`;8`FerJnm$#+LL!pv$~QCXp|86n0gV^XG?jw{XnyVa$7a9SR@}+NrmG^u`A|wE ztdt@IxCgzW00ml)&wr{KsQga{Z&ecynK?-5Gr%e#jBVmvGjxPJz)M1@0_4dK;3h9u z%;qz>3QzCNrEWtd5_y4<8Wm7bdg*y>3pxBSIDq(<2av4-k(USdCMNoQhQ{0=$F6~DMa=;$ zt8Pkj$u$|)HJM^_EswWIo6!!C0GT$qNQ3Z~X%$yp+VLE3Dwm5AssIWOR022>vapmT zi+C}K*NIK90g#iTWgG~qNP7ZNtVCh-jlyYq9)GoBOAeQcaV7&bYBr!zgESh)S*MYB zv&*Ihu6S$n9Lu6G4ntif;0%=Nfz+}>R9sx0jTn%sGEE$<&rCcq@KV)4Ee~o^^?@b$ zR)lODz0C{_%W3t>xonAF7cig;@&H}%4MOa~Rw)RuN{H1yoCGv;nY@<{pz;gNN}E|` zD6X-vZ20w;c8>TuffaTSTC|JH<12J;1Mk5I1i4DK=JBUn?95e4#RBev<#)$dGP;g@JIQ3>JmZ&|51Ir(83UlNQLde1y5s5!MS>oLmoDS_{n(wL;NU^+aA! zkcfkN1789gH_%#GM-s3aNv?~@xpsJo9?1MpP)5i8z^738+1D@UnO0;8XKgPCV*Q&)tUfHn-EiuPqkyg*zouliQd1VfRPPH@-&+i$;RFDUy1mE>(1?_mOgc^;0(dV+cXk}9NEhu8i zST>X&RbzlI8i8R$Yh|JqHB{3`1&*|6?l{}}Owo&hMhSr$J41@)h+F~z zJ`zUxP!lZeARuTB6MzQ`8XK&gn}D-j&ua=}8hSev@4yxYnBQ!z+f4H>St`W`_b?Ao zSatFa_6gcdi@h)tFoXe+4I>w|Yqcbp)ru*a5!j*;;8=+f5~)}#G#f2sK_1`bm= zL175<)m1_iGwov7^Z=zS04pI3OuGR_Ud04R`32^snE-6pgA?v02g+2<#Jx%`AW=fJ z&1031N|yjy2`Q|?Ivm-(-AuvMhLQCuu*JkRZ6Da$QY{J?)F3PBb#cDrwxB+O`IHK= z_!XkuBkix)=H%UCo6*J_$w!q_;aEtqz`=}Hu^L0eOh6O{cp_mehE{e9IZ^?80O@~H zN86VUYNY|J20^~mu4sYjv|`8_CkxHz2? zf@Qyfq?FvioDy4C6GucN<6$AGP-h^8hma}^fglm5pppw=*fO&7Sa^aXgHJ;_N-mV3 zgm|3T7PM)44A7)S*EQ~vwMZe##vR;D6)|o2ttNwNgHg5-t#t1z%`X*CbeFsoOawxi zpM~ODD7DnEahJy(%wh^6e*rGcD`v`Gdr5ADG?$FxjWhigU~C-|;Q8;%s^SIjS3 zt(n*o#G}|Sb7A{Q>RrAULr<}q>Bg$JJ2jq7L&8r$py3G79KvBtaF^IpgtgeCy{}rO z;xED-+z5*TnAnzFYb$^7avKvVU#eNmRBM$?9s{y~^`B`@iseL|V=)+qwEt|D7D)>H z#*2`pw4h0r4b+Gp0kG_v(2!yPN_J+5fICR3 zjscC01Ax?)g~ce(<*B^LmkT=qAA6~pnse~Ysir2u-0yjCqA6kZTFt>{L~wL;Ajtjb z0yflB)8(E$&F<+4u)m+f=C6aY;El`1C@PRfUOGS#Tc|KQfd4bt)XI|D-~*&m01Y3n zE@mCi#c`KLRfjIT&9tN%pe7H-~ka$_CsuQ@`Ym6#RI0;^p}VLioF5Pl}lu}eEG`@aXdx%U5qx2inw16 zjbY|+7?Ejr)Z#or7bKx^i0Q^+#*|y|hVn2v=n8JY$S)pKBPF30$;h6c0OeoS-fUL8 z0nPIOSUm#_~4+g~L| zZcF|k^2smfbMSENX7|Y!7XlXo3ggqz#8SZm+49T5b_3nZOT5}Rg8a3(GvzLrdAvwc zMNb2z_)yxxKuENjo~9;BS7~zernFe2hK0lu2siGbwhZHFO(K06Vva-;-a58c<)D)? z61aSEDe7!fyrOiaFkwhtN}{McoNLY6oh&5K5`Z)K7Gw%jc1I-#2jDI@pQm)PK=BNt zL}M5UQxYW*AF?aEfrB_5E>@ zRf0}|QD`9900k0acv!o}WqdkBTykpk?4P*x{}fmv1|qzFEHB{`B92fRKpN`N+Ojp2J0(uwnW5>(W(On zP=6U9r?_y}OQ_Dxl~NbniQ%Vjv~C4%)u1EzhT-0ByG*)RlLl$i3RJRCq#A@`=L>t* zV#kaeIdat43FEVwVh%?H;1g4IU9ys4FCDviPPQH9?i@CP$-%RN6!@0G21~xNP6TgD zvthKQ1Aw&j1hEw4;WK&Ca8L}JvjKaAHXx0JSv|v%471!yt1>X9MYA9rkK@8-jB0}d zlN#jeal?-GtpbHDt;UM>sk4=%l!t3?xu8zeEs+DIk@I9- z45KSdUFaK1RI~j9#U{)U$s!Y3dS6_^Hj*eUkpqR{h=G;C1usS0)L^+uDOYRd>3wxg zwx$FHrp*69Bd7+kM44)0@2e>^0f%gIi4v5wf1na^(_o^Qcm^s9%3-gDqA*b=iV)Gg zZ>6|-G*Li20~cjwe6nzdr-*9j2&E6@W}D*u+1e~zED9Nu1*g>uPTTpPJlosG zMi-p8+zKcXAFL9wBRw5;V-Gz;e+GE~AAAd?(YCCtVhsc+`e6Xu+^w_%z?2Z{mA2BF zu{Z!2{UE&2UPK0#pexv~AobM;VZa;l{JFZTiuSNvZ_gUV_s>;b>)ldS>ZJ z2LHr|fhSY*#|!fDU_8ph;s%Ur!sC z)lixR5>!}nu!OLUr;t)03x&Og6(80_X8g_{l4i2Hv6Lp%y3)FB9n2Ib5F@Ps}_ z$^xHm6M>(G@y>%F4-w<%XYJm`RuNZMK>MB;q5GifBWP$AH5>3?)RPZdh{g^Y9^oYT zFtj#E6enIFQ9=q5I?`V%V(q3Ro2X049>WbKK~6FOZfv6zO2)Hr@vOipfzWYsu|vXN z9*QwgsN@0?CBzf8?ScXx3X#({K$4798qh!r!>N5o#tR=`Jbo=u`Ui)6RDM`NAzU>A$396Sq!0ul8@ivg7DdzGI<9gJ?vB{ZH_6H%53mQ{ zY=N*1=%5&%E_&Tap~}!OF@k|07DE$-)yKNUr6ZvL79Ws>q!vMmj#yO+863SfDFxXQ zP-IJBVY-YA;0D5jW8qw?D~^Z*(k_GrP1I%p4FgJhNz*8&&7DiCgRBRX3@oV#)IeDx zZ%~Z%m*?&Z9lT|Jp#gFlyMftDh(mD$-82%OtFnT)?D+ zcp|e6-txRQ2ls>nQhs6J+81E7=K~P>;e~OqI#8~4GutARj6kG>lqNQC5}b$&Wj2_} zF9=6@DBZ)t8eadFOVEN$C_RLLxU>(Pd3m=+4aUFR$Ts_e;4L}Cc>NPh!f5&yn`oV{BCV=%We@8K8sTnhUQ@`X)qvLn^s@TCkga%MyRe28BTCz*;Yiq zSisXV1d|O-P96?VWV+A{I7J~&s@AX@=7gSM(M72Rg|Q<1XQGT!kwTv+AxL1fNiuT7!ddrc7!Tp zw_S1bvXcaW!vGtdZ2NA}i-iFnjX=vtD;ybGt!LD5nG{gqUm?0}UEKla4&Z3VQn|byo|vBXSy*SxJ=36IG4F9bU2aH3pAnqb@DipP34e_(R5 z8!HtVfdZ9KU8+aYHGu98vvIMqagQ>U5SM9#_V?}q>VKl9_EO{05%BS-@J{tsoZ7d( za}j1DTmc04xQ*8!zB>U$Kgd5;h&EUPZd+#?VtKQ#PZ*W)jZ4i<9y^ku%HKXbDOLj^LYX!7Bv3PlZ9i zZ(Q*0_WZ?<1dz7G00vSyJwS|0(CodL0I|_f;@~x z=0_{q{c_SSk76XrOF!%Dl@1!mnT}2fFC5`uZ9z;)e3?DH|76<%!EtLa60nF56l>Qa z$~8C$Lsw_G*$q~FP`pgE4mc21oe_eo^x3@isY8eT`VUs#$p($O`68*BCCvAu`ssjf@!N3svE6dz%cgl7ef$R6aiH% zhP%?n0O6Vo2w*x0)_I2J^kMvU8zB8pp3Jy+%(+~#?vuy&4b9;1r;yJskg37CO4|9GkKDK^2>qy zu3ew=`%hhq1BV)nc+AM%g79=iNqe+A@rs)NfC$VB+sK3A!A`J}6vGJ=mw-H@JkFxW5tSFW- z+-O49*e`*PAy8=r9yLguB4t+$DAM7E8k)dRSOg7ATC1RzUBH?F%QU-5-{)EZTA_Qp z{7*;*G6b7#1R`@pH4RWiVu6j6t-7#9EO#NgNOWCOhonyWGV`01Av!fS#MZ9u>*}1xk)dD zGA}vDfBK7Ly?i0iR31Mk7}a8lfRt#K^EUaFQaaG3#PaZ{lT~H6i#ZVJqC6s}MtI-L zjRCgUI`mW%Oo$$b8sTeEEs-Ivk<1ym)Uk>mw>y!Dg>zaQ&YsCaWodE>t?;8EGD#{m zESiNVXrxXcV=a6hWK3J7R4X_4$PiAZ)Ub5L;)rd{WWM$0jOJC{82)#6{&y_@JC6UQ z!)0OxIKj}bQIu%2Xap%gk{P8l67~34147|l5WjPlY#hs@M&2(mPH!eLa zOcP~`*!lE$z<1`{E=NEq;Sg&qveb%O9pHb8`-ZWRSfaTDZyMkPDLwTAi9rYKa-Ddl zOk5eN5JH!SvWFD2c_348v|OwktL?C;7R5XDj+e*dzVZ5 z0T_`71qa_;n9U$WxmoH-Nd9I>8>7VO6bK@u*NZ3G00L1o4w#5}&8!QGg6pS(@48xn zhNtX*l&*vr+E%V2ZsgWIAo92vfl^+37GNsrPtwNP%&*^+KW8 z)J?c(b`K|WrmK!wgdqS9o)p0KXu}Cj!Y^OdEyvOO;eLae@ymN51~(IqlegwN8p@*-=1RG&6*)Dp+hJbeGMWW#gy4bA`iNBn*-=Gq%wA!yon6yr~;)+s*7qV&J`0rh)qUvZ`-t- zlpO*fONj+GdYsa%kVoI#As2nyqQbCw5z>*iwZSW6oAn%fZnVCkVefyU9`*P}z%ZhS z4su(>P7Ba*$0bwHZ}LC_4aN3c!KoF=v5d?;rsZ%-ZmxC$2Q!9E=%o>-p*bYjAes{R z)E%lc#A-T9u%8kU%*c}fFPCn@BpyQTm?K0=U+V= ze1n1PSFDo?)J#5s;)CCT65JwK9xgQ4StT!K%3x>+e%^O95Qz_vZFkQM@B%FO##pkS znId9vR)-GlNZMrxp1$@499%2?^9TMXtFk<8@ChL5LqlbQJSaT)uFDZjX;r`~p}ORK z3I|7qB2Y%c^>JScRw=85-vF>i!U|U0DO_%M(d8*P#38ZBxMcxFF})e9Ash$_0}3^U z9@EhWRKgQ16q5!lL3IHZd^4-tMyM#CZjag} z?oBOkdt~+oD*h!_l%A9ZCh{Sr%R2$fPrzgM(b}(kV-6Ob@@Zip2)+dcHf1(Ekqy`| zfO?O$D#A^97f-lV+UJjG?;^K-SYC*o=oUY|b3G*%KL6lYE1#z#27wWbxId{5ttdd% l;&x(RRvgOXFZg-cy~4sehMpmn3fwa2^n&c*hX191{|#I`pQHc) diff --git a/js/eslint.config.js b/js/eslint.config.js deleted file mode 100644 index 27568347..00000000 --- a/js/eslint.config.js +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = { - languageOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - globals: { - window: 'readonly', - document: 'readonly', - process: 'readonly', - require: 'readonly', - }, - parserOptions: { - project: 'tsconfig.json', - }, - }, - ignores: ['dist/*', 'node_modules/*'], - plugins: { - 'unused-imports': require('eslint-plugin-unused-imports'), - '@typescript-eslint': require('@typescript-eslint/eslint-plugin'), - 'eslint-plugin-tsdoc': require('eslint-plugin-tsdoc'), - }, - rules: { - curly: 'warn', - 'prefer-const': 'warn', - 'no-else-return': 'warn', - complexity: ['warn', 1000], - 'no-unneeded-ternary': 'warn', - 'no-alert': 'warn', - 'no-empty': 'warn', - 'no-useless-catch': 'error', - 'require-await': 'warn', - 'no-continue': 'warn', - 'no-console': 'warn', - 'unused-imports/no-unused-imports': 'warn', - 'no-magic-numbers': 'off', - }, -} diff --git a/js/jest.config.js b/js/jest.config.js deleted file mode 100644 index ceab6905..00000000 --- a/js/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testPathIgnorePatterns: ['/node_modules/', '/dist/'], -} diff --git a/js/package.json b/js/package.json deleted file mode 100644 index 9496ba1a..00000000 --- a/js/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "@zondax/ledger-zcash", - "version": "0.0.0", - "description": "TS / Node API for Zcash App (Ledger devices)", - "keywords": [ - "Zondax", - "Ledger", - "Typescript", - "Javascript", - "Zcash" - ], - "homepage": "https://github.com/zondax/ledger-zcash", - "bugs": { - "url": "https://github.com/zondax/ledger-zcash/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/zondax/ledger-zcash.git" - }, - "license": "Apache-2.0", - "author": "Zondax AG", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "files": [ - "dist/**" - ], - "scripts": { - "build": "tsc", - "format": "FORCE_COLOR=1 prettier --write . && sort-package-json", - "format:check": "FORCE_COLOR=1 prettier --check .", - "lint": "eslint .", - "lint:fix": "eslint --fix .", - "test": "yarn build && jest", - "upgrade": "bunx npm-check-updates -i" - }, - "dependencies": { - "@zondax/ledger-js": "^0.10.0" - }, - "devDependencies": { - "@ledgerhq/hw-transport-mocker": "^6.29.0", - "@trivago/prettier-plugin-sort-imports": "^4.3.0", - "@types/jest": "29.5.12", - "@types/node": "^20.14.10", - "@typescript-eslint/eslint-plugin": "^7.16.0", - "@typescript-eslint/parser": "^7.16.0", - "eslint": "^9.6.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-tsdoc": "^0.3.0", - "eslint-plugin-unused-imports": "^4.0.0", - "prettier": "^3.3.2", - "ts-jest": "^29.2.2", - "typescript": "^5.5.3" - }, - "volta": { - "node": "20.11.1", - "bun": "1.0.20" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/js/src/__test__/addr.test.ts b/js/src/__test__/addr.test.ts deleted file mode 100644 index 9bac8f37..00000000 --- a/js/src/__test__/addr.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * (c) 2018 - 2024 Zondax AG - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -/* eslint-disable no-console */ -import { MockTransport } from '@ledgerhq/hw-transport-mocker' - -import { SAPLING_ADDR_LEN, SAPLING_DIV_LEN } from '../consts' -import ZCashApp from '../index' - -describe('ZCashApp', () => { - describe('getAddressSamplingFromDiversifier', () => { - it('should correctly handle the getAddrDiv command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(SAPLING_ADDR_LEN), // empty address - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const div = Buffer.alloc(SAPLING_DIV_LEN) - const response = await app.getAddressSamplingFromDiversifier(zip32Account, div) - - expect(response.addressRaw).toEqual(Buffer.alloc(SAPLING_ADDR_LEN)) - }) - }) - - describe('getAddressSapling', () => { - it('should correctly handle the getAddressSapling command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(SAPLING_ADDR_LEN), // empty address - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const response = await app.getAddressSapling(zip32Account) - - expect(response.addressRaw).toEqual(Buffer.alloc(SAPLING_ADDR_LEN)) - }) - }) -}) diff --git a/js/src/__test__/keys.test.ts b/js/src/__test__/keys.test.ts deleted file mode 100644 index f125b592..00000000 --- a/js/src/__test__/keys.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -/****************************************************************************** - * (c) 2018 - 2024 Zondax AG - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -/* eslint-disable no-console */ -import { MockTransport } from '@ledgerhq/hw-transport-mocker' - -import { SAPLING_AK_LEN, SAPLING_DIV_LEN, SAPLING_IVK_LEN, SAPLING_NK_LEN, SAPLING_OVK_LEN } from '../consts' -import ZCashApp from '../index' - -describe('ZCashApp', () => { - describe('getNullifier', () => { - it('should correctly handle the getNullifier command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(32), // empty nullifier - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const pos: bigint = BigInt(12345) - const cm = Buffer.alloc(32) - - const response = await app.getNullifierSapling(zip32Account, pos, cm) - - expect(response.nfRaw).toEqual(Buffer.alloc(32)) - }) - - it('should throw an error if the device returns an error status', async () => { - const errorResponse = Buffer.from([0x69, 0x85]) // Example error SW - const transport = new MockTransport(errorResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const pos: bigint = BigInt(12345) - const cm = Buffer.alloc(32) - - await expect(app.getNullifierSapling(zip32Account, pos, cm)).rejects.toThrow() - }) - }) - - describe('getIvkSapling', () => { - it('should correctly handle the getIvkSapling command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(SAPLING_IVK_LEN + SAPLING_DIV_LEN), // empty ivk + div - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const response = await app.getIvkSapling(zip32Account) - - expect(response.ivkRaw).toEqual(Buffer.alloc(SAPLING_IVK_LEN)) - }) - }) - - describe('getOvkSapling', () => { - it('should correctly handle the getOvkSapling command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(SAPLING_OVK_LEN), // empty ovk - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const response = await app.getOvkSapling(zip32Account) - - expect(response.ovkRaw).toEqual(Buffer.alloc(SAPLING_OVK_LEN)) - }) - }) - - describe('getFvkSapling', () => { - it('should correctly handle the getFvkSapling command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(SAPLING_AK_LEN + SAPLING_NK_LEN + SAPLING_OVK_LEN), // empty fvk - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const response = await app.getFvkSapling(zip32Account) - - expect(response.akRaw).toEqual(Buffer.alloc(SAPLING_AK_LEN)) - expect(response.nkRaw).toEqual(Buffer.alloc(SAPLING_NK_LEN)) - expect(response.ovkRaw).toEqual(Buffer.alloc(SAPLING_OVK_LEN)) - }) - }) - - describe('getDiversifierList', () => { - it('should correctly handle the getDiversifierList command', async () => { - const mockResponse = Buffer.concat([ - Buffer.alloc(11 * 20).fill(0x01), - Buffer.from([0x90, 0x00]), // Status word (SW) for success - ]) - const transport = new MockTransport(mockResponse) - const app = new ZCashApp(transport) - - const zip32Account = 0x01 - const startingDiversifier = Buffer.alloc(11) - const response = await app.getDiversifierList(zip32Account, startingDiversifier) - - expect(response.diversifiers.length).toBeGreaterThan(0) - }) - }) -}) diff --git a/js/src/consts.ts b/js/src/consts.ts deleted file mode 100644 index 19cec868..00000000 --- a/js/src/consts.ts +++ /dev/null @@ -1,65 +0,0 @@ -/****************************************************************************** - * (c) 2018 - 2024 Zondax AG - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ -export const CLA = 0x85 -export const CHUNK_SIZE = 250 - -export const INS = { - GET_VERSION: 0x00, - - GET_ADDR_SECP256K1: 0x01, - SIGN_SECP256K1: 0x02, - SIGN_SAPLING: 0x12, - - GET_DIV_LIST: 0x09, - GET_ADDR_SAPLING_DIV: 0x10, - GET_ADDR_SAPLING: 0x11, - GET_IVK_SAPLING: 0xf0, - GET_OVK_SAPLING: 0xf1, - GET_NF_SAPLING: 0xf2, - GET_FVK_SAPLING: 0xf3, - - INIT_TX: 0xa0, - KEY_EXCHANGE: 0xaa, - EXTRACT_SPEND_DATA: 0xa1, - EXTRACT_OUTPUT_DATA: 0xa2, - CHECK_AND_SIGN: 0xa3, - EXTRACT_SPEND_SIGNATURE: 0xa4, - EXTRACT_TRANS_SIGNATURE: 0xa5, -} - -export const P1_VALUES = { - ONLY_RETRIEVE: 0x00, - SHOW_ADDRESS_IN_DEVICE: 0x01, -} - -export const P2_VALUES = { - TX_VERSION_SAPLING: 0x04, - TX_VERSION_NU5: 0x05, -} - -export const TRANSPARENT_PK_LEN = 33 -export const SAPLING_ADDR_LEN = 43 -export const SAPLING_DIV_LEN = 11 -export const SAPLING_IVK_LEN = 32 -export const SAPLING_OVK_LEN = 32 -export const SAPLING_NF_LEN = 32 -export const SAPLING_AK_LEN = 32 -export const SAPLING_NK_LEN = 32 -export const SAPLING_PGK_LEN = 64 -export const SAPLING_SPEND_DATA_LEN = 128 -export const SAPLING_OUTPUT_DATA_LEN = 96 -export const SAPLING_RND_LEN = 192 // fixme -export const SAPLING_SIGN_LEN = 64 diff --git a/js/src/index.ts b/js/src/index.ts deleted file mode 100644 index 33e5ccfb..00000000 --- a/js/src/index.ts +++ /dev/null @@ -1,451 +0,0 @@ -/** ****************************************************************************** - * (c) 2019 Zondax AG - * (c) 2016-2017 Ledger - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - ******************************************************************************* */ -import GenericApp, { INSGeneric, LedgerError, ResponsePayload, Transport, processErrorResponse, processResponse } from '@zondax/ledger-js' -import { serializePath } from '@zondax/ledger-js/dist/bip32' -import { ResponseError } from '@zondax/ledger-js/dist/responseError' - -import { - CHUNK_SIZE, - CLA, - INS, - P1_VALUES, - SAPLING_ADDR_LEN, - SAPLING_AK_LEN, - SAPLING_DIV_LEN, - SAPLING_IVK_LEN, - SAPLING_NF_LEN, - SAPLING_NK_LEN, - SAPLING_OVK_LEN, - TRANSPARENT_PK_LEN, -} from './consts' -import { - AddressResponse, - DiversifierListResponse, - ExtractSpendResponse, - FvkResponse, - InitTxResponse, - IvkResponse, - NullifierResponse, - OutputDataResponse, - OvkResponse, - SignResponse, - SpendSignatureResponse, - TransaparentSignatureResponse, -} from './types' -import { signSendChunkv1 } from './utils' - -export default class ZCashApp extends GenericApp { - constructor(transport: Transport) { - super(transport, { - cla: CLA, - ins: { ...INS } as INSGeneric, - p1Values: { - ONLY_RETRIEVE: 0x00, - SHOW_ADDRESS_IN_DEVICE: 0x01, - }, - acceptedPathLengths: [5], - chunkSize: CHUNK_SIZE, - }) - - if (!this.transport) { - throw new Error('Transport has not been defined') - } - } - - //////////////////////////////////////////// - //////////////////////////////////////////// - //////////////////////////////////////////// - - async getAddressTransparent(path: string, showInScreen = true): Promise { - try { - const sentToDevice = serializePath(path) - - const p1 = showInScreen ? P1_VALUES.SHOW_ADDRESS_IN_DEVICE : P1_VALUES.ONLY_RETRIEVE - const responseBuffer = await this.transport.send(CLA, INS.GET_ADDR_SECP256K1, p1, 0, sentToDevice) - const response = processResponse(responseBuffer) - - // FIXME: probably incorrect.. and this should be pk - const addressRaw = response.readBytes(TRANSPARENT_PK_LEN) - const address = response.readBytes(response.length()).toString() - - return { - address, - addressRaw, - } - } catch (error) { - throw processErrorResponse(error) - } - } - - async getAddressSapling(zip32Account: number, showInScreen = true): Promise { - const sentToDevice = Buffer.alloc(4) - sentToDevice.writeUInt32LE(zip32Account, 0) - - try { - const p1 = showInScreen ? P1_VALUES.SHOW_ADDRESS_IN_DEVICE : P1_VALUES.ONLY_RETRIEVE - const responseBuffer = await this.transport.send(CLA, INS.GET_ADDR_SAPLING, p1, 0, sentToDevice) - const response = processResponse(responseBuffer) - - const addressRaw = response.readBytes(SAPLING_ADDR_LEN) - const address = response.readBytes(response.length()).toString() - - return { - address, - addressRaw: addressRaw, - } - } catch (error) { - throw processErrorResponse(error) - } - } - - async getAddressSamplingFromDiversifier(zip32Account: number, diversifier: Buffer, showInScreen = true): Promise { - if (diversifier?.length !== 11) { - throw new ResponseError(LedgerError.IncorrectData, 'diversifier Buffer must be exactly 11 bytes') - } - - const sentToDevice = Buffer.alloc(4 + 11) - sentToDevice.writeUInt32LE(zip32Account, 0) - diversifier.copy(sentToDevice, 4) - - try { - const p1 = showInScreen ? P1_VALUES.SHOW_ADDRESS_IN_DEVICE : P1_VALUES.ONLY_RETRIEVE - const responseBuffer = await this.transport.send(CLA, INS.GET_ADDR_SAPLING_DIV, p1, 0, sentToDevice) - const response = processResponse(responseBuffer) - - const addressRaw = response.readBytes(SAPLING_ADDR_LEN) - const address = response.readBytes(response.length()).toString() - - return { - address, - addressRaw: addressRaw, - } - } catch (error) { - throw processErrorResponse(error) - } - } - - async showAddressAndPubKey(path: any, unshielded = false) { - if (!unshielded) { - const buf = Buffer.alloc(4) - buf.writeUInt32LE(path, 0) - return this.transport.send(CLA, INS.GET_ADDR_SAPLING, P1_VALUES.SHOW_ADDRESS_IN_DEVICE, 0, buf, [0x9000]).then(function ( - response: any - ): AddressResponse { - let partialResponse = response - - const errorCodeData = partialResponse.slice(-2) - const returnCode = errorCodeData[0] * 256 + errorCodeData[1] - - const addressRaw = Buffer.from(partialResponse.slice(0, SAPLING_ADDR_LEN)) - partialResponse = partialResponse.slice(SAPLING_ADDR_LEN) - - const address = Buffer.from(partialResponse.slice(0, -2)).toString() - - return { - address, - addressRaw: addressRaw, - } - }, processErrorResponse) - } - const serializedPath = this.serializePath(path) - return this.transport.send(CLA, INS.GET_ADDR_SECP256K1, P1_VALUES.SHOW_ADDRESS_IN_DEVICE, 0, serializedPath, [0x9000]).then(function ( - response: any - ): AddressResponse { - let partialResponse = response - - const errorCodeData = partialResponse.slice(-2) - const returnCode = errorCodeData[0] * 256 + errorCodeData[1] - - const addressRaw = Buffer.from(partialResponse.slice(0, TRANSPARENT_PK_LEN)) - partialResponse = partialResponse.slice(TRANSPARENT_PK_LEN) - - const address = Buffer.from(partialResponse.slice(0, -2)).toString() - - return { - address, - addressRaw: addressRaw, - } - }, processErrorResponse) - } - - //////////////////////////////////////////// - //////////////////////////////////////////// - - async getIvkSapling(zip32Account: number): Promise { - const sentToDevice = Buffer.alloc(4) - sentToDevice.writeUInt32LE(zip32Account, 0) - - try { - const responseBuffer = await this.transport.send(CLA, INS.GET_IVK_SAPLING, 0, 0, sentToDevice, [0x9000]) - const response = processResponse(responseBuffer) - - const ivkRaw = response.readBytes(SAPLING_IVK_LEN) - const defaultDiversifier = response.readBytes(SAPLING_DIV_LEN) - - return { - ivkRaw, - defaultDiversifier: defaultDiversifier, - } - } catch (error) { - throw processErrorResponse(error) - } - } - - async getOvkSapling(zip32Account: number): Promise { - const sentToDevice = Buffer.alloc(4) - sentToDevice.writeUInt32LE(zip32Account, 0) - - try { - const responseBuffer = await this.transport.send(CLA, INS.GET_OVK_SAPLING, 0, 0, sentToDevice, [0x9000]) - const response = processResponse(responseBuffer) - - const ovkRaw = response.readBytes(SAPLING_OVK_LEN) - - return { - ovkRaw, - } - } catch (error) { - throw processErrorResponse(error) - } - } - - async getFvkSapling(zip32Account: number): Promise { - const sentToDevice = Buffer.alloc(4) - sentToDevice.writeUInt32LE(zip32Account, 0) - - try { - const responseBuffer = await this.transport.send(CLA, INS.GET_FVK_SAPLING, 0, 0, sentToDevice, [0x9000]) - const response = processResponse(responseBuffer) - - console.log(response.length()) - - const akRaw = response.readBytes(SAPLING_AK_LEN) - const nkRaw = response.readBytes(SAPLING_NK_LEN) - const ovkRaw = response.readBytes(SAPLING_OVK_LEN) - - return { - akRaw, - nkRaw, - ovkRaw, - } - } catch (error) { - throw processErrorResponse(error) - } - } - - async getDiversifierList(zip32Account: number, startingDiversifier: Buffer): Promise { - if (startingDiversifier?.length !== 11) { - throw new ResponseError(LedgerError.IncorrectData, 'startingDiversifier Buffer must be exactly 11 bytes') - } - - const sentToDevice = Buffer.alloc(4 + 11) - sentToDevice.writeUInt32LE(zip32Account, 0) - startingDiversifier.copy(sentToDevice, 4) - - try { - const responseBuffer = await this.transport.send(CLA, INS.GET_DIV_LIST, 0, 0, sentToDevice) - const response = processResponse(responseBuffer) - - const diversifiers: Buffer[] = [] - while (response.length() >= 11) { - const div = response.readBytes(11) - if (div.toString('hex') !== '0000000000000000000000') { - diversifiers.push(div) - } - } - - return { diversifiers } as DiversifierListResponse - } catch (error) { - throw processErrorResponse(error) - } - } - - async getNullifierSapling(zip32Account: number, notePosition: bigint, ncm: Buffer): Promise { - if (ncm.length !== 32) { - throw new ResponseError(LedgerError.IncorrectData, 'ncm Buffer must be exactly 32 bytes') - } - - const sentToDevice = Buffer.alloc(4 + 8 + 32) - sentToDevice.writeUInt32LE(zip32Account, 0) - sentToDevice.writeBigUInt64LE(notePosition, 4) - ncm.copy(sentToDevice, 12) - - try { - const responseBuffer = await this.transport.send( - CLA, - INS.GET_NF_SAPLING, - 0, // ignored - 0, - sentToDevice - ) - const response = processResponse(responseBuffer) - - const nfraw = Buffer.from(response.readBytes(SAPLING_NF_LEN)) - - return { nfRaw: nfraw } as NullifierResponse - } catch (error) { - throw processErrorResponse(error) - } - } - - //////////////////////////////////// - //////////////////////////////////// - //////////////////////////////////// - //////////////////////////////////// - //////////////////////////////////// - - async initNewTx(message: any): Promise { - try { - const chunks = this.messageToChunks(message) - - // Add empty chunk to trigger the init/reset - chunks.unshift(Buffer.alloc(0)) - - let result: ResponsePayload | undefined - for (const [idx, chunk] of chunks.entries()) { - result = await this.sendGenericChunk(INS.INIT_TX, 0x00, idx + 1, chunks.length, chunk) - } - - if (result) { - return { - txdataRaw: result.getCompleteBuffer(), - txdata: result.getCompleteBuffer().toString('hex'), - } - } - - throw new ResponseError(LedgerError.UnknownError, 'Unknown error') - } catch (error) { - throw processErrorResponse(error) - } - } - - async extractSpendSignature(): Promise { - try { - const empty = Buffer.alloc(0) - const responseBuffer = await this.transport.send(CLA, INS.EXTRACT_SPEND_SIGNATURE, P1_VALUES.ONLY_RETRIEVE, 0, empty, [0x9000]) - const response = processResponse(responseBuffer) - - return { - signatureRaw: response.getCompleteBuffer(), - signature: response.getCompleteBuffer().toString('hex'), - } as SpendSignatureResponse - } catch (error) { - throw processErrorResponse(error) - } - } - - async extractTransparentSig(): Promise { - try { - const empty = Buffer.alloc(0) - const responseBuffer = await this.transport.send(CLA, INS.EXTRACT_TRANS_SIGNATURE, P1_VALUES.ONLY_RETRIEVE, 0, empty, [0x9000]) - const response = processResponse(responseBuffer) - - return { - signatureRaw: response.getCompleteBuffer(), - signature: response.getCompleteBuffer().toString('hex'), - } as TransaparentSignatureResponse - } catch (error) { - throw processErrorResponse(error) - } - } - - async extractOutputData(): Promise { - try { - const empty = Buffer.alloc(0) - const responseBuffer = await this.transport.send(CLA, INS.EXTRACT_OUTPUT_DATA, P1_VALUES.ONLY_RETRIEVE, 0, empty, [0x9000]) - const response = processResponse(responseBuffer) - - const rcv = response.readBytes(32) - const rseed = response.readBytes(32) - - const hashseed = response.getAvailableBuffer().length > 0 ? response.getAvailableBuffer() : undefined - return { - rcvRaw: rcv, - rseedRaw: rseed, - hashSeedRaw: hashseed, - rcv: rcv.toString('hex'), - rseed: rseed.toString('hex'), - hashSeed: hashseed ? hashseed.toString('hex') : undefined, - } as OutputDataResponse - } catch (error) { - throw processErrorResponse(error) - } - } - - async extractSpendData(): Promise { - try { - const empty = Buffer.alloc(0) - const responseBuffer = await this.transport.send(CLA, INS.EXTRACT_SPEND_DATA, P1_VALUES.ONLY_RETRIEVE, 0, empty, [0x9000]) - const response = processResponse(responseBuffer) - - const key = response.readBytes(64) - const rcv = response.readBytes(32) - const alpha = response.readBytes(32) - - return { - key: key.toString('hex'), - rcv: rcv.toString('hex'), - alpha: alpha.toString('hex'), - - keyRaw: key, - rcvRaw: rcv, - alphaRaw: alpha, - } as ExtractSpendResponse - } catch (error) { - throw processErrorResponse(error) - } - } - - async checkAndSign(message: any, txVersion: any): Promise { - try { - const chunks = this.messageToChunks(message) - - // Add empty chunk to trigger the init/reset - chunks.unshift(Buffer.alloc(0)) - - let result: ResponsePayload | undefined - for (const [idx, chunk] of chunks.entries()) { - result = await this.sendGenericChunk(INS.CHECK_AND_SIGN, txVersion, idx + 1, chunks.length, chunk) - } - - if (result) { - return { - signdataRaw: result.getCompleteBuffer(), - signdata: result.getCompleteBuffer().toString('hex'), - } - } - - throw new ResponseError(LedgerError.UnknownError, 'Unknown error') - } catch (error) { - throw processErrorResponse(error) - } - } - - /////////////////////////////////////// - /////////////////////////////////////// - /////////////////////////////////////// - /////////////////////////////////////// - /////////////////////////////////////// - - async signSendChunk(chunkIdx: any, chunkNum: any, chunk: any) { - return signSendChunkv1(this, chunkIdx, chunkNum, chunk) - } - - async checkSpendsGetChunks(path: any, message: any) { - return this.prepareChunks(path, message) - } -} diff --git a/js/src/types.ts b/js/src/types.ts deleted file mode 100644 index 1e4c752a..00000000 --- a/js/src/types.ts +++ /dev/null @@ -1,83 +0,0 @@ -/****************************************************************************** - * (c) 2018 - 2024 Zondax AG - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -export type AddressResponse = { - address: string - addressRaw: Buffer -} - -export type IvkResponse = { - ivkRaw: Buffer - defaultDiversifier: Buffer -} - -export type OvkResponse = { - ovkRaw: Buffer -} - -export type FvkResponse = { - akRaw: Buffer - nkRaw: Buffer - ovkRaw: Buffer -} - -export type DiversifierListResponse = { - diversifiers: Buffer[] -} - -export type NullifierResponse = { - nfRaw: Buffer -} - -export type InitTxResponse = { - txdataRaw: Buffer - txdata: string -} - -export type SpendSignatureResponse = { - signatureRaw: Buffer - signature: string -} - -export type TransaparentSignatureResponse = { - signatureRaw: Buffer - signature: string -} - -export type OutputDataResponse = { - rcvRaw: Buffer - rseedRaw: Buffer - rcv: string - rseed: string - - hashSeedRaw?: Buffer - hashSeed?: string -} - -export type ExtractSpendResponse = { - keyRaw: Buffer - rcvRaw: Buffer - alphaRaw: Buffer - - key: string - rcv: string - alpha: string -} - -export type SignResponse = { - signdataRaw: Buffer - signdata: string -} diff --git a/js/src/utils.test.ts b/js/src/utils.test.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/js/src/utils.ts b/js/src/utils.ts deleted file mode 100644 index 4cfd3493..00000000 --- a/js/src/utils.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { PAYLOAD_TYPE, processErrorResponse } from '@zondax/ledger-js' -import { errorCodeToString } from '@zondax/ledger-js/dist/errors' - -import { CLA, INS } from './consts' - -/** - * @deprecated This function is obsolete. - */ -export async function signSendChunkv1(app: any, chunkIdx: number, chunkNum: number, chunk: Buffer) { - let payloadType = PAYLOAD_TYPE.ADD - if (chunkIdx === 1) { - payloadType = PAYLOAD_TYPE.INIT - } - if (chunkIdx === chunkNum) { - payloadType = PAYLOAD_TYPE.LAST - } - return app.transport.send(CLA, INS.SIGN_SECP256K1, payloadType, 0, chunk, [0x9000, 0x6984, 0x6a80]).then((response: any) => { - const errorCodeData = response.slice(-2) - const returnCode = errorCodeData[0] * 256 + errorCodeData[1] - let errorMessage = errorCodeToString(returnCode) - - if (returnCode === 0x6a80 || returnCode === 0x6984) { - errorMessage = `${errorMessage} : ${response.slice(0, response.length - 2).toString('ascii')}` - } - - let signatureCompact = null - let signatureDER = null - if (response.length > 2) { - signatureCompact = response.slice(0, 65) - signatureDER = response.slice(65, response.length - 2) - } - - return { - signature_compact: signatureCompact, - signature_der: signatureDER, - returnCode: returnCode, - errorMessage: errorMessage, - } - }, processErrorResponse) -} - -// /** -// * @deprecated This function is obsolete. -// */ -// export async function saplingSendChunkv1( -// app: any, -// ins: number, -// chunkIdx: number, -// chunkNum: number, -// chunk: Buffer, -// p2: number, -// _acceptErrors?: any -// ) { -// let payloadType = PAYLOAD_TYPE.ADD -// if (chunkIdx === 1) { -// payloadType = PAYLOAD_TYPE.INIT -// } -// if (chunkIdx === chunkNum) { -// payloadType = PAYLOAD_TYPE.LAST -// } -// -// let transactionVersion = 0x00 -// if (p2 === 4) { -// transactionVersion = P2_VALUES.TX_VERSION_SAPLING -// } -// if (p2 === 5) { -// transactionVersion = P2_VALUES.TX_VERSION_NU5 -// } -// -// if (ins === INS.INIT_TX) { -// return app.transport -// .send(CLA, INS.INIT_TX, payloadType, 0, chunk, [0x9000, 0x6984, 0x6a80]) -// .then((response: any) => { -// const errorCodeData = response.slice(-2) -// const returnCode = errorCodeData[0] * 256 + errorCodeData[1] -// let errorMessage = errorCodeToString(returnCode) -// -// if (returnCode === 0x6a80 || returnCode === 0x6984 || returnCode === 0x6f10) { -// errorMessage = `${errorMessage} : ${response.slice(0, response.length - 2).toString('ascii')}` -// } -// -// let txdata = null -// if (response.length > 2) { -// txdata = response.slice(0, 32) // fixme? -// } -// -// return { -// txdata, -// returnCode: returnCode, -// errorMessage: errorMessage, -// } -// }, processErrorResponse) -// } -// -// if (ins === INS.CHECK_AND_SIGN) { -// return app.transport -// .send(CLA, INS.CHECK_AND_SIGN, payloadType, transactionVersion, chunk, [0x9000, 0x6984, 0x6a80]) -// .then((response: any) => { -// const errorCodeData = response.slice(-2) -// const returnCode = errorCodeData[0] * 256 + errorCodeData[1] -// let errorMessage = errorCodeToString(returnCode) -// -// if (returnCode === 0x6a80 || returnCode === 0x6984 || returnCode === 0x6f10) { -// errorMessage = `${errorMessage} : ${response.slice(0, response.length - 2).toString('ascii')}` -// } -// -// let signdata = null -// if (response.length > 2) { -// signdata = response.slice(0, 32) // fixme? -// } -// -// return { -// signdata, -// } -// }, processErrorResponse) -// } -// -// return undefined -// } diff --git a/js/tsconfig.json b/js/tsconfig.json deleted file mode 100644 index bf24a795..00000000 --- a/js/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "moduleResolution": "node", - "target": "es2020", - "strict": true, - "esModuleInterop": true, - "declaration": true, - "skipLibCheck": true, - "outDir": "./dist", - "sourceMap": true, - "inlineSources": true - }, - "exclude": ["./dist/**"] -} diff --git a/tests_zemu/snapshots/fl-mainmenu/00004.png b/tests_zemu/snapshots/fl-mainmenu/00004.png index 5686e50ed6cbf3fad1aad76fa960448b640b659b..88a45f6f98350f8f022698722eee40270ab4280d 100644 GIT binary patch literal 9865 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 x=MAJ*3zE#GWs?Oeu`(JiR@$&!x literal 9633 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 AzyJUM diff --git a/tests_zemu/snapshots/s-mainmenu/00010.png b/tests_zemu/snapshots/s-mainmenu/00010.png index d84dc33b0d465df0284f2ad093d0b6f281024b29..50a4d14c125d128759dfcf47f842a797dadc1cca 100644 GIT binary patch delta 460 zcmV;-0W<#O1LgyeB!8_*L_t(|ob8#*vV$NDhOu*e{|9#ASI_vw+9Dl?bXQNsDU)-bVn~h02J}jIlxRYK!Ur1 z_^PH$u?_DFsxoVz*{LK&oT_-!WYL$QPcPY;xBdOg{$~qL_kZ~~B3xfcv=K#zS~x28 z0+{Fl${UxpLAom>PdX2%eG*!du20pZ_XK8uRvCQR$Ou%$rO*WGwABWwmw~=qGB*U# zxi-z4$Db00_tBQF2j%c7AxQMrsMGVf|h?y3b+0fsTEEcrIoDIev)w=93$uyO_8U<7aSH z7FRBU=_rEMKS(V^Ll!qirS1LOmcB!8<(L_t(|ob8#*vcn({U11soJBf}5yW4xW}NU%7fq_7 zAQx>)K@bGNTiIp^IS)zl?j2AWA(y!Aa(i%)-d>&jjT%TJpYG@d2!JAfItQ331|YaA zh+CB&#WuVzsLG;!VW*lDajN1=lSMyG{NZtd;yQr7NnE{I5 zbQ|dBsep6ola(i?DyX^fd#fPjl#3L36E66EhT|Yc_cqRzgVzsT_XO)O@gT24FCWD07*qoM6N<$f|mc; AzyJUM diff --git a/tests_zemu/snapshots/sp-mainmenu/00004.png b/tests_zemu/snapshots/sp-mainmenu/00004.png index 5ebb8454f0ce1cd51b54d40eb373659586f2b66f..6f686e225709d8f5acca4727110026f975ef19dd 100644 GIT binary patch delta 425 zcmV;a0apIL1H%K5B!7xYL_t(|obB0La>F1DKvB2Tov{BUv6p^i!Z4DM1r~NXz2_@& z5n%C%i;n{U0000000000003<9b-jvOtG-xDxmcl7L*HU4#VjAJWHxG{r0?fqyy!$$ zw;aJHw)P=W!T>aSDVS5WeKpJI*kCF}c`;6-R-Dd{qRf)ZzJC+zdJ!EhZ{oAKjdoqv zW71iO>^5f8$Jut&N2M?Ev=!jYI8i1N?r1Bi)*9ceo!0%X_J7Tt`!6{I5b0T;;?dR= z%<1eHw5VXoQPhqB$lQYZzE0h(-hUFU{anW{UL;q*)SPM|;=}RIX|1*YZS245@MGrr zFJ4|Zt)tAonSW8Ey9hc-?~Ww~VVGpHe;Xs!WdCN2!IRj9o^+CA#$YR*-h|W8o0(5? z&Lif+V=IPEpTYhAGd@uMVcbO`U*af+DSQY2AZ%d;G^yRpk@-I0apn@)bdI0pF7di_dLynA4M03rYY0000000000@UQ#=;VDYn T0e@b*00000NkvXXu0mjf_%73L delta 420 zcmV;V0bBmV1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000F1DKvB2Tov{BUv6p^i!Z4DM1r~NXz2_@& z5n%C%i;n{U0000000000003<9b-jvOtG-xDxmcl7L*HU4#VjAJWHxG{r0?fqyy!$$ zw;aJHw)P=W!T>aSDVS5WeKpJI*kCF}c`;6-R-Dd{qRf)ZzJC+zdJ!EhZ{oAKjdoqv zW71iO>^5f8$Jut&N2M?Ev=!jYI8i1N?r1Bi)*9ceo!0%X_J7Tt`!6{I5b0T;;?dR= z%<1eHw5VXoQPhqB$lQYZzE0h(-hUFU{anW{UL;q*)SPM|;=}RIX|1*YZS245@MGrr zFJ4|Zt)tAonSW8Ey9hc-?~Ww~VVGpHe;Xs!WdCN2!IRj9o^+CA#$YR*-h|W8o0(5? z&Lif+V=IPEpTYhAGd@uMVcbO`U*af+DSQY2AZ%d;G^yRpk@-I0apn@)bdI0pF7di_dLynA4M03rYY0000000000@UQ#=;VDYn T0e@b*00000NkvXXu0mjf_%73L delta 420 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 LG`m`H84>$$9foZD diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 5ebb8454f0ce1cd51b54d40eb373659586f2b66f..6f686e225709d8f5acca4727110026f975ef19dd 100644 GIT binary patch delta 425 zcmV;a0apIL1H%K5B!7xYL_t(|obB0La>F1DKvB2Tov{BUv6p^i!Z4DM1r~NXz2_@& z5n%C%i;n{U0000000000003<9b-jvOtG-xDxmcl7L*HU4#VjAJWHxG{r0?fqyy!$$ zw;aJHw)P=W!T>aSDVS5WeKpJI*kCF}c`;6-R-Dd{qRf)ZzJC+zdJ!EhZ{oAKjdoqv zW71iO>^5f8$Jut&N2M?Ev=!jYI8i1N?r1Bi)*9ceo!0%X_J7Tt`!6{I5b0T;;?dR= z%<1eHw5VXoQPhqB$lQYZzE0h(-hUFU{anW{UL;q*)SPM|;=}RIX|1*YZS245@MGrr zFJ4|Zt)tAonSW8Ey9hc-?~Ww~VVGpHe;Xs!WdCN2!IRj9o^+CA#$YR*-h|W8o0(5? z&Lif+V=IPEpTYhAGd@uMVcbO`U*af+DSQY2AZ%d;G^yRpk@-I0apn@)bdI0pF7di_dLynA4M03rYY0000000000@UQ#=;VDYn T0e@b*00000NkvXXu0mjf_%73L delta 420 zcmV;V0bBmV1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000F1DKvB2Tov{BUv6p^i!Z4DM1r~NXz2_@& z5n%C%i;n{U0000000000003<9b-jvOtG-xDxmcl7L*HU4#VjAJWHxG{r0?fqyy!$$ zw;aJHw)P=W!T>aSDVS5WeKpJI*kCF}c`;6-R-Dd{qRf)ZzJC+zdJ!EhZ{oAKjdoqv zW71iO>^5f8$Jut&N2M?Ev=!jYI8i1N?r1Bi)*9ceo!0%X_J7Tt`!6{I5b0T;;?dR= z%<1eHw5VXoQPhqB$lQYZzE0h(-hUFU{anW{UL;q*)SPM|;=}RIX|1*YZS245@MGrr zFJ4|Zt)tAonSW8Ey9hc-?~Ww~VVGpHe;Xs!WdCN2!IRj9o^+CA#$YR*-h|W8o0(5? z&Lif+V=IPEpTYhAGd@uMVcbO`U*af+DSQY2AZ%d;G^yRpk@-I0apn@)bdI0pF7di_dLynA4M03rYY0000000000@UQ#=;VDYn T0e@b*00000NkvXXu0mjf_%73L delta 420 zcmV;V0bBmV1HJ>0B!7iTL_t(|obB0Lvcez?fZ=+^ov{BUv6u7U$S?uY0HH18|2=6X zK*Obq#{mEU00000000000G4>oR}o_@FNP2%D^zO8TMQvo%Nr}{jT$Jadr!uTPIz@o zVQgY)9~?OhKvFJ+>Qqf{t7XbqV=6^?F;1;kl+L%JswId0Ie*smAvzkq#A|UI>3UgD zRhb3LZc}agINOf$DEB4qwgQwHC(2mD6=@~K810+2(z@Q&{8Qh#|KT$LmY(G)Zf#A* zoc4}EiZYgLMXeYB&n+nLYuDYD`;Vis$F=?9B)I~*=2Qw1FOF|cV~qK;F@IZzA3fjy z?B&a*%cyGKs((?fyD&OQ?}{Y`p_yc|f0;_E$^OL{gFCSc-RUIBjKNadr?>U1)$-MF z`Hdp~I;vta_+cR?w000000384T00000uJjLh%U6Mw?Crn+ O0000