From d2f8d601e4d029ec18717dabd589106f9b9615c9 Mon Sep 17 00:00:00 2001 From: Andreas Beck Date: Sun, 29 Nov 1998 22:56:33 +0000 Subject: [PATCH] Initial checkin of ISDNfax. --- COPYING | 29 ++ ChangeLog | 5 + INSTALL | 57 +++ Makefile | 20 ++ data/isdn-samples.alaw | 13 + include/ifax/bitreverse.h | 8 + include/ifax/debug.h | 21 ++ include/ifax/g711.h | 40 +++ include/ifax/ifax.h | 23 ++ include/ifax/int2alaw.h | 7 + include/ifax/isdn.h | 12 + include/ifax/module.h | 88 +++++ include/ifax/modules/replicate.h | 11 + include/ifax/modules/scrambler17.h | 12 + include/ifax/sincos.h | 10 + lib/Makefile | 12 + lib/bitreverse.c | 46 +++ lib/debug.c | 59 ++++ lib/g711.c | 311 +++++++++++++++++ lib/int2alaw.c | 253 ++++++++++++++ lib/isdn.c | 207 +++++++++++ lib/module.c | 117 +++++++ lib/sincos.c | 543 +++++++++++++++++++++++++++++ modules/Makefile | 16 + modules/debug.c | 88 +++++ modules/decode_serial.c | 186 ++++++++++ modules/encode_serial.c | 184 ++++++++++ modules/fsk_demod.c | 215 ++++++++++++ modules/fsk_mod.c | 112 ++++++ modules/mod_scrambler.c | 84 +++++ modules/modulator-V29.c | 158 +++++++++ modules/pulsegen.c | 89 +++++ modules/replicate.c | 94 +++++ modules/scrambler17.c | 111 ++++++ modules/send_to_audio.c | 67 ++++ modules/sinegen.c | 86 +++++ test.c | 130 +++++++ v21_softmodem.c | 341 ++++++++++++++++++ 38 files changed, 3865 insertions(+) create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile create mode 100644 data/isdn-samples.alaw create mode 100644 include/ifax/bitreverse.h create mode 100644 include/ifax/debug.h create mode 100644 include/ifax/g711.h create mode 100644 include/ifax/ifax.h create mode 100644 include/ifax/int2alaw.h create mode 100644 include/ifax/isdn.h create mode 100644 include/ifax/module.h create mode 100644 include/ifax/modules/replicate.h create mode 100644 include/ifax/modules/scrambler17.h create mode 100644 include/ifax/sincos.h create mode 100644 lib/Makefile create mode 100644 lib/bitreverse.c create mode 100644 lib/debug.c create mode 100644 lib/g711.c create mode 100644 lib/int2alaw.c create mode 100644 lib/isdn.c create mode 100644 lib/module.c create mode 100644 lib/sincos.c create mode 100644 modules/Makefile create mode 100644 modules/debug.c create mode 100644 modules/decode_serial.c create mode 100644 modules/encode_serial.c create mode 100644 modules/fsk_demod.c create mode 100644 modules/fsk_mod.c create mode 100644 modules/mod_scrambler.c create mode 100644 modules/modulator-V29.c create mode 100644 modules/pulsegen.c create mode 100644 modules/replicate.c create mode 100644 modules/scrambler17.c create mode 100644 modules/send_to_audio.c create mode 100644 modules/sinegen.c create mode 100644 test.c create mode 100644 v21_softmodem.c diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..9c12db3 --- /dev/null +++ b/COPYING @@ -0,0 +1,29 @@ + + Licensing information for the isdnfax project. + + Authors: + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + Copyright (C) 1998 Oliver Eichler [oliver.eichler@regensburg.netsurf.de] + + License: + (2 clause MIT style. Note, that this is compatible to (L)GPL and can be + re-/sublicensed to that) + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..265693a --- /dev/null +++ b/ChangeLog @@ -0,0 +1,5 @@ +Changelog: +---------- + +98-11-29 [becka]: + * initial release. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..3269210 --- /dev/null +++ b/INSTALL @@ -0,0 +1,57 @@ +Welcome to isdnfax. +------------------- + +1. Introduction: +---------------- + +Isdnfax is a project aimed at providing a fax transmission and reception +system via the audio capabilities of ISDN4Linux or other similar systems. + +Note, that this is ALPHA software, not certified by anyone, and comes +without warranty of any kind, express or implied. + +CAVEAT EMPTOR. This software _should_ transmit data between ISDN4Linux +and remote modems/faxes, _but_ it might as well set them on fire, take down +the public telephone network or whatever. +The developers are in no respect reliable for any damage arising from the +use or inability to use of this software. + +See the file COPYING for details on licensing and warranty. + +2. Building: +------------ + +2.1. Downloading and unpacking: +------------------------------- + +You have already done that - else you wouldn't be reading this. + +2.2. Configuring: +----------------- + +No compiletime configuration is currently available. This may change. +Watch for updates. + +2.3. Compiling: +--------------- + +Just type "make". Should do it all. + +2.4. Running: +------------- + +The following programs are currently available: + +2.4.1. v21_softmodem: +--------------------- + +Emulate a V.21 (300 Baud) modem via the ISDN4Linux audio layer. + +Usage: ./v21_softmodem -i /dev/ttyI[0-9] -m MY_MSN -c NUMBER_TO_CALL + +The program is currently originate-only. + +Have fun, + +Andreas Beck + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c170605 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +LDFLAGS=-lm +CFLAGS=-O2 -g -Wall -pedantic -Iinclude + +SUBDIRS = lib modules + +MODULES = modules/modules.a lib/isdnlib.a + +PROGRAMS = v21_softmodem + +all: subdirs $(PROGRAMS) + +subdirs: + for a in $(SUBDIRS) ; do make -C $$a ; done + +v21_softmodem: v21_softmodem.o $(OBJECTS) $(MODULES) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(OBJECTS) $(MODULES) $(PROGRAMS) *~ *.o + for a in $(SUBDIRS) ; do make -C $$a clean; done diff --git a/data/isdn-samples.alaw b/data/isdn-samples.alaw new file mode 100644 index 0000000..b7d51fb --- /dev/null +++ b/data/isdn-samples.alaw @@ -0,0 +1,13 @@ +Prr*PPrr*PQPP^RZRFQP@W_AZAGG@DWOX]L]YOPDLUACMAWODRNXYN\ENPFLTBBTLAPID_HX[H]GIV@LLBWOA]HZYH_ZIPFNT@MOAVNE]NXXNRELVAM@CUMGPO[\N_XNSDLTACM@TNDSNXYI]ENQAOCBTLFQNE\N^XIRDNW@MMCUOFSI[_I_[NQGOTCCLFWLESN^^OREOWABCCUMGPOZ\N_XNPDOUACM@TOESIY^I\ZNQALCCUBFQOZ]O_YNSDOWAMB@TOGSNX_N\[OQGLU@CMFWLESNYYNSEOWFMB@ULGPO[\N\XNQDOUFCBAWODSI^^N][NQAL@BUMGVO[]N_YOSDLVFBBCTOGPNX_N\XOQGBACBGTLZPO^YOSELWFBC@LGPNX]N\XOPGLUACMAWMDRNY^I]ZIVFLCCMFQNZ]N^XNQDOTACM@TLGPOY_IRXOQGM@CMDWOZSN_YOSELTABB@UOFPN[\N_[NPFOTABMAVOERNXYI]ZNQFMCBMFQNZ]O^YDr`ppa{PccdDcffR…ckg~QphoGqjiNMjpGjvBos^gjrDŽvmxKUa`eՅkl@IwEk]jy\l|]dh|ۇO`xHQͅej`dPrkoLIksXk\h~Smzziy҄McewąecgEthnKChs_hxQhzTbzxnxЄBagsޅxjb`EtihwGi|neUoecdxneUEfgpօkm`CNnjpXnyieodfjdʅ}mdPXȅgf}ԅ~iobNOnjrSozoflafjgͅrmgRWƄzaPqnomKFl|Qldlfbfdk`DžqcfXUej`y\qnnmp_m~mdbam`˙dk`Ņw`aDބyjbe[tonnp_b{bf͝`cɟabΘeib߅t``Bބ~hbe@Nlho}Tcdɜ`a͜ccϜabĘyob܅NfbIք}hmdMHbkiU`dœa`ĝalfořyolԚOgbJSvilguZchh~ʞagŸfbĜfl۟dlޘ|mnP@ʄejltQqolftZckkegfߜgmܜdoٟgjiҙrcoWḠzjotYunnaqR`je͞gaޟgo֜enן{khљrbi_EχyhnrEHmi`rUagřdbן{oUeiԟxhhQvahEVڄyiisBLbhcrWϛgfޙ{bT{nSykW|iStakGVۄ|ni|HEckb{ϘdaݙzlUk\k\si\HfLЄvok|JE`km{dbTn_k[|_}lZNdjIԄvlkywS`leߛzcՙnYr@qBwlFCdjuԇKbeqVɚgldܛxm\sh@wMpjMtmNExhv\JberΚgndԛ|lXvhOwJujINcKYxiv_L`d~ǚdi`՛}nEvjOIuHhu@cJS΄|hrDXadyĚzi`QshOHwHvOitBfwQ„por@Xffz߅zkcDqhLHvBrEnsXfqÄplAQ̅daeօ|kmGwktC}Xk|Gor_gk؄tbxHVÅdadW}jlOHjvEjsYk~]o}PehڄtbzHQͅecdQ}hjnNLkpYk~QkxSbPei~ЄMcewۅxcf]shnOLir]k{QizTc{ynzԄAadw߅ykc`EwnirXn}Sh{VodbdoeTZfgsׅ~ko`CLnhpXnxnglgcd~mgPYgfWrhlbHLnj|QozldmfakgpbgS_ȄdaWpinmuLmUlelfmadkfpcfZTej`x[wnnlt@mUbdb`c`˙dk`ۅt``Aބyk`xZuonnpXcgʝcgb``cɘdobޅK``C҄~jbeBKlkn}TcdΜ``̜`mßfm™enbޅugbO܄}imgN@mhi~cf͜a`ۜabgořxmmVCdmIфrilgHDcjhyșgfǜac؝fo؟goߘ}mlV@ʄejmwSqoofqY`kj{Ȟfaٟgmۜdnޟeiߙ|bn]^̈́{jowXJlofqR`jeÙdbߟdlҜdnџxkhәr`iY^ÄxknvEumn`Tʙ`gۙdbПenלzhԟyhkԙp`hZSۄ}hhrDAmhb|˘fgۙemWyiP~hViVwfkLWل|ni}B@bibxgfԙ~lQ~i\yXsi\NgjM҄rok~K[aklzƛd`љoY}k_p[pn^NgjKUtojywPajleŘecVrhZrjDr@wlDL{juTulxqRfofӛ{m_shFpMqkMtmCAxht\LbepƚgngЛym\qjLtJukHHbNZir_M`d}ǚdn`W|lCKjIJtuhvCcuP̄|nrEAag~ޅxhcSrn@JwMtAiv@`uV΄}lB\afzݚxhb\piHCqBp@nsYfvVĄwl~BRffeӅjklAvkkwBsFj}EmsYaksńtl~JυgaeQ|jjlCukkvAjsEk~Pm|]ehلHbeJυe`f\rkoIIk}]j_h{PlxTzi|ЄIcetDž{ba_tkoJOi}\kei{Ub{xoyքLadvمxkbaCuhitEiTizndczyozP^ffs܅kmcEuojs^o{Unelgadʅ~beP^ʄffՅ}hlcKLojrRlzldlffgɅrbg\Pd`~UpholtCoVlglfbafhaƅqcgEPz`yRwiiowYlyUcgmcc`ɘdhaąwaaGUƄ~jc{[wlio}\m{Ȝcfϝb`ab͙ei`ޅta`Nل~jmeEHliip]`dʜ``̝`cɟfmxnc݅KdcIӄ|imgOMbknyT`gfcÜabßflٙomЅBdmJVpnogNDbkk{afğfmǜflƟgnژ~boVGemv]vnlgKEbjke̞fa۟dmߜgn۟eji֙rmnVA„{jlw\unnav\ajježg`؟dlUdiٟ{khיsci^[ÄziosGIoi`sʙfjd۞d`ӟzn՜eiџ{kjWtck[YŇ}inrALmib}ʘgaޙebWxnWyhUnjPwakGPń|iirJCbjbgaܙ{lPxk_jProjStfAT݇voh~JEckmydcЙxo_rkX|\slAMgLUtlk~uS`lzܛxbTn_}jMrXvlABeuTwbjepW`oeӘyb_snFwBpAvlOYektPBbesϚfngӚ|nXphOuNtjOK`I[xivRLcey͚dngP|oZwjHttHjJB`K^̈́iq[XafyĚdiaQ}iFtuBwOht@apW„}orB\fg{߅zicEthNHtM}CiwZfpUpoM\Ʌd`e҅{jjmCuktBpZjrDnpXgks߄umOU΅d`dԚjmFuktC_k_oReh}ۄtcxKͅe`f]phjmKHkq[k}^iyRl~ziyӄIcetم{bfRpiouMhPhyUieWbxT{ozфL`ep҅ykbaZwhhq[i|Si{ng`x~oeUGfgqӄrhm`Dwoks^n{Uield`eȅmd\RɄggrׅ}kobLIoksRl{ofmfafsbg]\τeaVsioltGmk~QlelgcaahaDžqcfEQdc~[vnnltGmxbfmac`giaDžva`DUxj`eDuoioqXmecf˝```m˜zoa܅uac@لkc{FBmhnp[`dΜc`ϝccßfb̘zoc҅HgcJք}ibdMLmki|W`dƜf`̜alǟglǙxol՚AdbHՄqnlgHFbkkxfafcǜflڟdjlۘyclQDʄejmqQqnnfwFck~ÞgaşdlҜgiݟenЙ|boPZ̈́xkow\Ill`p\ajdÞg`şgmҜziܟzhhWqciG\{knrZIoi`}Tɘgjdߙ{bПziԜeiԟ{kh֙pfi[\LJrii}BLmib~șafߞemTynQjVnj]wajAVń|ih}C[ckbŘdcݙxnV~hSj]slj]uekN҇qnhxK[cjmzÛdaW|o]sjD}ZpoDOgIՄumk~wTϛakoeߛ{bW|n_rjDv[vmLGevTtlzvVʚaog֛b[vkFvBqCvmF@ykwP@bd|šgifјxl[qkOuHKhJKcu[yipSObd}Śeif\riEtNuuHktBau^„pn}E[`f~ۅzi`VrlINuApOiq@`qSro|CRɅfg{՚ykbZwhNOuMqZopZfvǗqlB_faeӅxhmAujtApZjsAo}_djrڄwmyH̅g`dԅ|kjlMHjwFj~_k_oReh}ńt`xtąecgSphoKNjwZkyShyRlyxhy҄M`et؅{bg]qiitAhrSh{UieSb{ynzׄMadsӅ~jmaGwihq[irPnend`e~neфGfgrօ|hl`Gunjr\ixndld`jg΅rmdS\Ʉgg|Յ}kobBMlj|PlzofmfajfÅsbgQ_τzja~]siomJGmyVlzmabafkaڅvbaZU{j`y[winmtZbxbgm`c`di`څw``FĄyjceFuoiosYbecgȜ`cɟ`c͘zn`݅u`cG݄|hmdBIlknsRcgϜb`̜`bŸab͘zlbЅLgbNׄ}imgMOlkh|`gÜacaoǟgmŘyllԚAdbNTwnmfuLbkhxafǜam؜fmğgoؙ~mlUFȄzjmtTsnoawZcjkyϞffğgmҜgoܟdiљrmoQE΄{kov]too`sPajdϞgcٟdmӜdnܟekhԙp`nY\{knrDHoiarQfgǙecԟ{oќdhԟxhkיp`hX^Ƅ|hirMMbicafٙeb՟xnTxkP}njRvajAWۄrih}BGckb~ØdaҙxlQyk_kR}oYJgjBևvok~NAcjmzĘeaԙ~lS}kE}XpoDOgNԇwmjyt\ʛajldݛ{bטn^sjEp[pmCFzjtTtmepQalgӛymSpiBwApBtb@G{htVLme}šgnfӛxlYpkBtNwkuOcJZxhq\Cce}eiaWroDtIttJkuNat_Ȅ}isGXag|Ņeh`SpoBuKLqOiv@`qV„|n}@_ʅffyӅxhbEvhBHtCq@ipAfpDŽplyA\˅ggeԅyk`ZtkJAvC}Fi}_dks߄wlxOP…dadՅ}jmAuhjvXq[k|_l}^dh|لtlzuƅej`gSrjoLOks[k|]ixPmr^zi~ЄMceuą{jcf]|kiu@h~]kyPieUcx{lxׄD`eu܅~jmaFwhiuGn|Skendce~oeWGʄggpӅ}hmcMJiiq^oyneogbgȅrmd_^ʅff}ՅshlbLBokr\mznemgag˅rbg]\faySpnlmKBo|WldmgcagjdqcaXUe`\vonluMmxbala`c˙dhaąvfaFۄzk`~DKoiopYbxcglcȟ`bϙdhc؅uacM҄|hbz@Llii|SbeϜ`aϝccɟam̙dnb҅NgcuӄhldN@mkh|`gfc``ßglǘxlbхOgmI݄rnlgNFbjky`fǜabۜfmǟgoؙ~lmVDʄejmtWqnofuZcjkyʞgf۟glۜgoܟeiҙrboQDɄxlv]vlofrRajd͞g`ܟgm؜dnܟeki֙rciS\xjirEJoi`rQ˘agdmџzo֜eiџxhhԙsah^\Ąhi|ELmh`~˘afڞemԟynTzhP|njRwfhDPل}ih}FCchb˜gaܙ{mQyh]~kS}n_ufhNЄqohIDckm{ƘeaЙl\|j\|YqoZLgIքtojytXajldߘ{b՘|nk^sZvmFOejuVuoepPaldЛxmVrkAvApFtbAByhtSObeqϚfnaћxl_pkMuNvkJO`IZyiv_BcdpŚeifW}oEwjIttukuO`t_ʄnrG[agڅeiaQpoGIjuLtIhqF`vQ̈́}o}CQ`g~؅{im^vhHLtHvNnqCfqP̈́|o|N_aaeӅxjmBwiILsEk`F\_M__MYYHSFOQ@LMCTLFSI[_I\[NQGLABMGUMZSO^_NSZOWFB@AMDQO[RO_XOPDMUFCBAUMEPNY_N][NQFLCCMDVO[]O_^OSELTFMB@UMDPNX\N\[OVDMUABCFTLZSOY^NSZOWFB@@UBDQNX]N\XNQDLU@CB@TLDSNY_I]XNVGLBCMGQOZ]O^YOSEOTAMB@UMDPNX\N\XLVDBACBGULZSN^^NRZLWFBCCMDQN[\N\[NQDLUABCAUMDSNY^I\ZNVFL@CMGQOZ]O_^OSELTFBCAMDPOY\N][LVDM@@BDTLZSN^YOSDLWFBBCUMGPI[_N_[NPGOTAMBATODRNX^I]ZNVALCCUMGQLZ]N^XOPELTABBAUMDPOY\N]XOQGMC@MDVOZSN^^OSELTFBB@LGQN[_N\XOQDLUABBFTLESNX_N][NVFMCCBFVOZ]O_XOPELTABC@ULDPNY\I][OQGMCCBDVLZSN_^OPELUFBB@LDQNX\N\XOQDMT@BMFTODRNX^N]ENQFL@BMFVNZ\O_XOPELUFBC@ULDPLX\O]XOVEM@@BDVLZSN^YOPZLTFBB@LGPOX_I\XNQDL@BBFVLDRNY^N]ZOWFMCCMGQOXA[igg@Ʌrno|TDgakuڅuh`e^Symns݅Bgaj@ȅqnl~V_zbiqڅwh`dEʅ}loՅFd`jM̅qibz_Zeciq҅NjffBȅolUXd`hJۅqnbz^S~lo|хOagjBÅrnbyR^ecktąKh`gFʅxlorՅBgfhJÅvibzVQxmnp݅O`gB|ol~P^echutkceYT~lop҅Af`NȅphmxRSzbiqمuk`gZ~olԅGgckK̅vkceZQymnrڄKagM˄}om~Q[echvۅuh`d[SymorхLgfjKribe^_ebiq؅vhadAloyՅCg`kwvhbeX^dchs߅NafC˅|olxQYdchwڅtkbe_TylnrӅFffO΄pib{]_zbjwƅt`gAooօGd`kwwhbeR]{mir݅IjffjOsnm{S^ebktĄwhcdGQlo|ՅMfajuͅpim{VYebkqDŽIjagMV~nnօGg`ktƄrnl{]R{lnr܅Kkfg@rnlxRDg`HÅwkceDVymi}хAgaJτril{Յ[echqޅwkad[TolyԅEg`uȄsice^PybirمujafLȅrilyUFd`jqtk`gXUxli}օMgajKτ}nl{VRzmhsDžujcgEol~TNaaH΅pkcdY_{mipڄOafNɄon|ԅGdckvńwhbdDU~onӄNfaB˄phbeX_zbhs؄K`fZU~oi}҄Adcjqukcd^]zlirބJ`fG|nozS_emkpvkcdFRzlir߄L``Ḧ́rkme\^ebkv؄ukbdGQxoi|ׄDg`ktۅqhbe\]emkq؄KjbgFrily]Decjvwjbd_Relhv݄CfcJɄqimeS\emkwńtjbdY|no{UXdbupkbd\_emkvلIa`OɄshlzTDgcjqńpkbd^S{li|фMaaA΄riox\_dbkqۄqjcdAUyoo~PAg`N̈́vkme\_dbhs߄HafL̄noxԄ_dmktwkbeXR~oi|ЄAaaNɄqkme]YemjvÄtkcaF|inք@gcjwphmeR]emhp܄BaaM~ioxRDgcjwƄpkbd^VyooԄL`aǘrhlzPFdckqĄtj`fOU~oi|քGf`J̄}ime\SzmhrЄJ`aA}hoyՄEg`ẗ́tjbgZxli}݄@f`HȄynn~ք^emhpڄwcgEno~ԄCafOʄskmdESdbhp߄u`aInoӄCfcjtńvkbzZQeli|ЄO`aM|ily]YzmhvDŽtjbgGyni}ЄHaaJ̄vkbg^]elkp؄J`fAWxohфXdmjwqjbdXWxoh|҄tcfAskmzP[dbhvĄu`f@Wzlk}߄Bfcw|hmz_^eli|؄ucgZUynoyQDg`vÄskbgEQemkrބJaaHsioxVEdmjwƄqjbdDPzmiyքGfbHȄshle\YgbjvۄucgF|hnyք@gcJqkle\Relkpń@faBɄ|io{TZgbwÄwkmd^U~nn~UOf`IτrhozP^elkqڄucfHT~onyׄGgcI„skmd\Xxok}ЄM`aMrhoxWFfbjvĄphbfGyih}܄BacKȇ}ho{RYgbjqۄJcfDni|ՄAa`J΄pklzPVxlhr܄H`aN}hnxVEfcwÄvjbgGR{ok}܄FacIˇ}hl{QXdbkpŇucfZTyhnxׄOacṫphle_WelksڄK`aNʇyih~WGfbuqmd\V{ohׄO`aCˇ}ho{VYdmkwڄwbfExii~҇@acH̄pkmeX^dlkp؇Ic`C~inxՄDgmqvkldY{nh}܇Na`Lʇ|hleSYdljwDŽucfFV{ni~ч@acu̇skod]Selh|ڇtbgFioxTEacuqkmdD]elkrلK`aN΄|hoxVXebjvۄwjbg\Uenh|ׄFgcuɇrkldSVelksLJwbgA}hozW[act̄wbg_\dlkpهMacKrkoxV_dmkqLJqjbdD~inyՄMacH·pkmdXZgmjqLJu`aMˇxniT@fbjwÇpkoeSRelhr݄H`aLˇ}in{RZgbK͇pjmdEnn~݄OabḮ}kleRFfmqLJubfZ|hnxUMacuχ}koePRdlkpLJI`aMˇniyTGfbuɇwmgZUznnևBa`N|hozUDdljqƇwcgOinx݇@fcJ|kld_[elk}هLa`NinxׄBacwqjlgZ{ih~ӇI``N~iixՇ[gmwuca@Wynh~ЇN`aN}jlzVPeokr݇ucf@yih~҇Efcw͇pcgET{ok|هH``ChoeVZdbjrćJbf[xikއHa`uɇrhod_]eljpŇJca[WxihxׇXfmuχqbg[Vzoh|އKba@kneׇ[gmvćvbf@\eojs܇Macu‡rjleY]dmksڇtmgE|nnxՇMgbw͇qjoeXRelqŇH``LrioeV_gmjw‡vog_S{oi݇BacJsjoeP_dlwvbfG~kiyӇGgbtÇpjmg^\dojpۄHca@ɇ}kleQAgmppjld^V{oi|ևLacJskleQEabvƇtcfCViixՇGfbuχrkn{Q]eoj}هM``Bʇ~hn{ԇZfbN·wjmfXyij|݇Ic`NȇskizT[glqLJumfXxih}Ԅ@fmHˇ|jod]]elkp܇OcaG|kieWCacuwbdDWxnh|هM`cNɇxhixV[dlsćJbaAxih~ЇLbaOpjodRVeojrއKca@yiiчAabJÇsod]Pznkr߇N`aL~hixUYabtvbfAT{nh|ӇL`aLˇsjl{P^dlrهwca@xnh|чGdbwȇrkld_Sdoj}߇ubaC}hndVEfbqvmdXTeok}އL`cHɇ}kn{W\gmqwbgDU{ihׇM`cHˇqjme\SelkrŇtbfCxii~ԇDgmq͇vmdXSelkr܇BaaO|kneS[dlqvbdDxnhx҇BactÇpjoeTXgljsƇH`aG{hiyTAgmṫ}jod]VenkڇHcfM|hneVZgbwÇwmgGVznh}҇Ga`Hɇ|koeVZgljv؇qcf@}hnyЇ@actrkldY]elj|ۇI`cL|hhxTGgbvÇvmfYW{ni~ׇB`cC|hneU]eovÇqbfCUhiyЇOacHʇslgR_dljrއub`M|ihyׇZfbv‡pjld[Weok~هIc`A}koeS[dmvtbfA{nh~߇MabtȇpkldP\eojsهN`fBiixՇAfbtȇplg\U{nh؇uccM~hnzUZfmqucfFSeoh|߇M``K·}joePPzok}؇ulgD~iiyчBact·pmg[]eoqćN``N|iixUZfmqćqmg\Qznh܇CacMrjneS]empćJmfF~ihyӇBfbJχsjlgX]dojpڇIc`F~iixՇDgbtÇsld\Venk}҇K`aBʇ}kizՇXfbtƇqbgDVxoh~܇GacNˇsjn{SYgmjrهtbaAki~ԇDabJˇvjne^WeojrۇL``M}knxT[gmJχwmg^QzihևL`cJȇ}ko{V]dljqƇtmfGynh~ׇBacH‡sjldYReljsއHbaFxii~U@gbvwjmg\znkrهOcaKhozP\dmw͇tbgXyni|݇G``IʇsjleRYdlkpۇHcfA~hhчGfbt͇rkleXQ{oh}߇ucaB|hnyPGfbwwbfZVelh}чLa`Hȇrhi{W]dljpۇvbgDynn~ЇGacLqjld_PdljsLJucaB}hn~чEfbtvmd_elkrهLa`M|ho{P]dmjq‡tmdX{nn~чOa`Jɇqjle\Xdmks؇t`fOyioxׄ[gbu͇pjmdYRzlk}҇I``H}hl{UFgbv‡vjmfZW{nh~ӄCa`KɇhozW]dmjvćtcfGyni~ՄF``H·qjleSWemjpۇI`aM|hh~ЄFgbẇwmdYU{oh҄C``B}hozQXdbkqucfG~ni|ЇAf`Kȇqkle\\zlksŇK`fAUiixևFfbu͇vjbgYUzlhr܇ucaCinxTZgctÇJbg[W{ok}݄LaaKˇriozRRemkpćtcg_U~oiׄBg`Lɇpkmd_QelksƇuaf@}nnyքGgcjwÄvjbd_Szlh|ބBf`B|in{Q^ebkqƇvkbgX~ni~܄CaaLȄphme\[gbjvu`fA|nn݇Zgct„sho{R]zlh}ބNcfCsio{U[gcK̄wkmdEPylhr܄Cf`N˄sil{ׄXemjvĄIkbgZW~nnԄBf`Hˇphbe]TxlhrۄHcfL~nnЄEfctvjbd[Q{mhr݄IcfB|in~Մ]dbhvۄujcd[W{lhr݄BcaM˄qhmz\]{mkqĄHcgZTxoisфZgctτthmd\WxmkvۄKcgErileWSebtwjcd_Vzmkp߄Ma`OτphmeV\dckpńwkcdY{onׄ@g`kKqhlz_\dbkqڄtjcgG|ol~PZg`KqhmzRPdmhqلFfgB}noyՄRebjutkbe^W|on|ӄFffMȄphmeR_ebjt„uk`fErnoЅAg`kJÄpimzRRemhvلBffA|ol~VDd`kJphbe^Vylo}ЅL`fL΄pnlyWDe`kwtk`dB~lis҄GfaOȄsnm{QSzciq܅uk`gF}oo|օZgaHɄthbe^UxbipބBfaCʄrno|ЄXdckuÄKk`eYT~lo}ЅMff@ʄrnl~QVzciwŅtkagA~los܄BfajIqib~]QecipޅNj`dATll|WXe`ku̅wic{^Wxmiq߅uk`gM˄pnmzWYecktJk`e_Szbhp܄GgaNυpnmxQS{bhqąwhce_}om|ׅFgakKÅvice]PzckwDžOjagLȅllUDe`hvąvic{PQymnsЅCjfdL˅}ob{R^d`ht…th`eDrll}҅FjgfjIͅqnmySXechv؅BkfgGrll}ЅXeakIυvnbz^QzbipޅLkfgFʅsll|ׅYd`kHͅIkadXUymns܅Ckfg@˅qom~ՅR{cnqޅuhadE|morхDdakOͅtnc{XS{cnqمOkfdD˅|lmUFjeahJąHncz_Wbos܅OkfdjBυrmmyPPzchuIh`d[ymosК@jfgjO…wnbyPRx`it؅Hh`eZ|lorӚ_eaiNDžwocx]Pxcnv؅LhadFqoc~PZeahHǚJi`zXWbopݚAjgfkKͅvlbyQR{`nwۚKi`eDU|blrךZkgakH̅vncx_Rz`htٚOiad[˚rll}֚ZjeahuښtncxPW~bnvߚ@kgdkG΅plb~W^e`iuąuiaz_|blsכ@hggkBͅtncxRR{`nwٚIifdjFʚrblsњ\eahNtn`{^Sx`osݚBigdjDɚqlc՚ZjeaiuĚJn`eZ~bopқAhdghOÚplm|P]z`nuٛHhaejE}bl}VDkdgkCwoc~RVycltޛBigdhOΛrmm|֛[jefhOśuoa{jZWclsқZhdgkL˚plm|TP~`ovޛInazjErmm}ЛFhgghLϚto`z^QcowٛChgdkAU}bmpUXkzaouśto`{^W|cmpћNnfdkA˛plc~]]efnKڛJofekFT|copқBkggiNwl`RRyaotܘMnfeX|cmsԘYk{fnJtla{^T`lv؛LifekDϛwm`~T_jefnuŘInfzjXVy`mvܛZhegiI›wlcPP~`otߘJoaxXrbcrԘEkegnHڛuoaxRPy`lw؛Iigdk@țrbcrS\jxfouƛKof{jYPy`lsјMndeiOØtla~]]jxaotۘtoazjZțrcmr՘YhzgnKĘwma~R\k{fnu٘OngdjZ˛qmcPEhzgnJśtl`ST`mvߘFhegiMqbc}Q^kxfnKƛOofxkZ}ccsU[hzgiLØvm`Q\j`lvޘOndzhM̘qb`|ԘYh{fnKvlaxkYPj}`bsљDiegiL͘qb`VXk{goKŘMngekZsccrԙGhednOvbcQQj~alwǘMngehFϘrb`}V@iediMJlfyk[ʘW}abvЙAidenBØpccsT_kfltٙuog{kZUjs`mw֙FoeehF͘vba~j]Rk}fmpݙ@odeiFʙqcmsИAnzgoKřumayjYVjr`mqәFnediEΘpc`rVShyaouۙLod{iEərccpљAnddiBƙwmajWSkamwݙLndei@̙Wj}`bq֙[i{gmKٙKlfykX˙Tk|fbqЙ@ngzhF̘wcfjV^h}abvܙBlgxkYșVj}`ltҙDizdnNǙKbf~k]\i~amtߙClgxh_˙jq``}U\iyfnIڞumah^˙Wjr`mwݙMoeenC™wm`|jTSkxfoOߞNldzh_Wk}`bpԞDiedoCۙuma|jQSk|fmwәHlgxh[̙qcasjRXiyglHęKmfxhYΙPkxfmtӞ@oeenMtca|k\\h~fluٞJmak_ʙUkpacp՞Yn{dlLڞtbfk_PhflHٞBldeiDÞjwccpjWZnzdlK؞Omf~k\Qh}abvӞGndeoGĞvc`skR]k~gmuߞImfiXΞq``v֞FnednO۞wbfk_RhgmJߞ@lzenC̙jp`asjWXixdlK۞ubfh_VhracsמAle{oLƞwbarjPRhxgmJޞOmgznD͞kr`cqԟYnzeoOƞubf}k\Sh|fbtџMld{nEϞjvcaskQ^iydmJ۞ubfiYɞj|fcw֞Do{dlLƞwca}k]_iydmJܟBld~iEΞjp``skVDnydlOĞtcf}k\QhpacqҟOle{o@jq`a}kQYnxdmHڞOmdziDTh}fcpԟGozzoBǞvcf|kS]n~fbwޞNld~iG͞kpa`skU[nyeoBǟJmfiXʞRh|fbwПEoe{oAƞkp`arjT[nydmNߟubd~iZkv``q֟GlezlLÞjv`f}h]\n}dbwߟClzeo@͞kq`cqjWDoxzlI۟Icgxk_Vhrf`vk՟DleeoFÞkv`arkV\i|glK؞JbdxnGƟUhq``pkן@lzelMƟjubgiR˞]igbwџCmezoFkva`qk՟YnxdmJݟJbgh^ɟhrfcvkUAl{eoAjw`fsh_˞Xn}gbuޟAle{n[hsa`skԟGlxemI۟jKcfyh_Wip`ctӟBlezoAkw`ash]YngmK؟IbgxiXΞkqaasjןCl{dl@şjwcf|iRRi|gbtӟAlzzlM͟Tira`pkTXnxemNޟJbgi_ȞUiqa`pkUAmgxn@ڟjwcf}kPYoydbJޟLme{oF͟ThpfctjџEoxdmKşjucf}h_Pi|f`wjלBme{oEΟhv`frhVYo~dmO؟Nmg~nZßhpfcvjןZlzzlMğjucf}hS_ngbKПBmz{nZŸWipa`vkTEoxemO؟ucfi[ɟVhsa`qjПNme{lFƟjvafsiRYn~dmKݟjObdynGWh|f`vjTClxzmO۟ku`f}iSVi|fbuҟMmdynGŸUisaarkQ[oxdmN۟Ibg}n^ȟWh}fcwӟGmd{oBƟkwcarhQRngctӟCmeyoEʟhsa`vjԟEnzelB۟ktbf|iZʟSn|fcvџCmexlG͟jv`arhQ[oydbHݜjIbg~nEΟQh}f`wk՜Fo{elNğkt`frhYʟ]igbK֟Jbd~oG͟WhqaarhWXoxdmL؟ubg|i^ɟVh|gcwќLmzeoBǟkw`arhV]i~dbuݟHmdyi[ɟh}fcqkԟEo{emC۟jubg|i^ʟ\i|fbwݜNld~nDŸkpafshVDlxemIٟOmdynZ˟]h}f`vќClzzlIڟhvafrh]]n|gcujݜKbeyoAɟVhqaasjWDleelLڟjJcgn[ɟ_n}dbtќMmzzlAkq`aqkTYnydbuݟJ{meMyofU`n[c㍍}鞝qYTvR_nlji~tS{zkhyG]g}놅cdkʟTUaefaڙVřaocg凁gT[Ɯzjg옙`懄~ݚNݝxc㚅m턘vDžvAAkjㄆo㛞v̄vuYh퇀lo噘qJqNmkho|SK|zj끁i~M_gvldj񟘜Ga}`儃ahΞטgana䇃`Ҙ]ǜgid뛟b熆eمZҝxkf훚mㄚ|؅KZwjlℇn⅞qstYhjl㛞s􄁗vr[ljkm嘚~CtqajjkgP@RdrhdD]`smahVUggꅅkc憃`ǘ\ƞgofbↁ`څGĝehdl톄zͅuVc⅄o섙}􄂟~CBkjㄆok⛞r񇀑|I_hjkb䙘uMKmk醃kn{兛XZ^yyj聁hg嘙_]XfvbgiRׅVfy`䇃`hșDژecbc憀bƚMynd蛞cㆇdޛKǜsk`⚅mㄛ~…s^Chn텇n욟p|OQl섁imᘙs񄆔vN\b醀b䛅x򅅕_Ow{jg_C{wi儀fZ[dpb儃ci˞Rݛzdic懃bۛA̞{mdlㆆcÅIxn{蛛i⇚{…KRuic셇h}􄃜MRol~󄁗|KRl膀c昛{IMHfn嚇g兘]EZxp儁aS\Eeui燃bi𞚟X݅Vghm懃ljϘ@ȘdcamↁlɚHɜ{ne雙l솄gwٝphf욅n釙xyWGnnkk󇃐eXUo`☙{凇sCCcj醀b䛅g儚@\\r{j兆`盙SVOzvi焀`hG݅Xerm懃`nNÚ{gocㆀm̚u񙘑}lelↇa͚w˟tlgn쇛e˅|џEobjryDМm臁m혞XSbꆀ`ᘛgB^]Nen䅇g嚙YPNtj䄁a\ՅCeJomn𞚟Fؚe~oblƘF|`do톁m͚Ksbx뛞jfsٜKlaj鄞~xXPmi臆nyx[גc`㘙{qDTAgb暄a煘ARZq|j愆`䘞DQ@zNhmnBӅVdqkoㆃnhueao큀o􅁙}񙘐rc{ꛟh`~ɜvi{녚釘d򄂞eПRnmk腟{g^Wm臁ag准^Paaᛅa愅tT\uk䅇`F҅N~w愁bh䙙NڅL~uoᇀmn󙅜wʅSr{lmↀoqp`{nↆ`˅s񟘒Om~ꛘkf񄃙zj؟Fla酄ꄟ~񄃝dU֟ch脆mdxTUa`g凄pT\XxmᚄcᅘCWJtK愆a䙞@݅t|Ok⇀bnNY}rln㇃lh񘄞Jrdgnn񅁘p𞙐wUb}j`|̟Lbd腅脙deҞԙcbn녜dd^ߝfa훙d凇}XW\ga㛅aᄛK\YtsiㄆmHхtpF⇀on䙙KƄMswkhhowȚTsz`ois𙘖vbxk遇l{Klx뛘ꆛaejٟ^ca년jgfUTڟ`i`雜f凁dU]ݒcg훛bᇅr҅@[~mᅄm⅙JĄvJNlhᘞvτtr@killsCqrlo솃hh}qg{hl󅁞xLQ`|k膅cfk[bd년ꄞgfיߙalm뚜dgԘRٝgha☙g燄yܚCUxbᚅ`wޅv@KjjᄆmᛞI؅qqZj퇀il噘vυMqunn쇀inr򅚕Vuxdhi񅆞~CRf}끄m󄀘~IWaꇙaejٞԘ`figdWTfha`懆eכ[ܒef㛚`}֚N[rl텇oㅞHDžsqZj퇁ni昞u΄t|Oikjm嘅r􅅕Zv|ah遀kk|KRf}ix򞙒@Qbrꆚ`gk̟W_meja䇃c٘]Ğfl`cᆁaޅFĝdkgm톄zمOP}cl섙rȅsLAjj℆hk㛞vɄpvXij⇀hb瘛r񄇕HqulhozSu~ek끁kxUYEap끄mgkRf~`凃`jϙX ٛgaoꅜa燀`ښMzhg雞`懇eܚBܝyjf욅bpŅqZuoℇo⚞vÄrIRi쇁nlᘘs񄆔quFojhlRBsgk끀kxD[zvle񟘒YSasb儃fkÞ_ӛgdi`燃aۘ[emgc懆fڅG۝yidm{ŅBXrj`i셙q̅rI[o턆hi㛞p􄁖}IRl膀c䘛NKwaj醃ne嚛Qu{rk儁gV^Z`tl燃ai󞚟SQaxjmᇃcjÙYdbcbㆀbMϟ{nd雟n톄dۚtߝ}g욅iy˄pEOkok}|HSibᘙsCAbk醀m嘅zCCUpxjꁁ兆a皙Q_FdwnchQU[d}b䇃`iʙEegoa燃c͚Nʞ{ogꛟbㆆfǚuœridn쇚eʅrלHim셇n}΅xYTo쇁ho☞y򇁗}LPmc瘚{OFKfjid䚙YSGpigTR@dKm焀ci\مdxk`ᇃbę^{`gmcŚAΟsne蛙n톄d̅vќtnfh􄃞~F_ln釆ixruגb놀`㘘zqBAam的f兛EX]s|䅆a嘙^WAguhᄀchX݅\g}koᇃchCÛefco톀luylxi톇a̅w̜|iz隚iexTAimj酟~zDԝl釁cgFTb膀aaIWVuzi慇fᅙGՅMxKk愁lk噙X҅Fdtl燀ln𙅞GÅxzocㆃlv񘛖cgo톆`sqoe雙i醅f􅃘|ߟAof酄j{zRџlh鄆o{e[Ւc釀`dw]PGdm慇g䅘MUGvv焆f噙SUNxOncnFŅE|}hlㆃliLrgfl톁oȅuvl~hf…uǜMle녅釙e񄃟~՟Pcb넇i腜z󄀐z@Ւcꇁa혞d准x[^fcᛅf䄚KR\uk䅇cᛞZׅOeOci噙BӅGethomn𙅟uɅy{co쁃i򚆙p񙘑`{kl}Hl~뚘놛f򄃞xޟDb`{fSПbibf凁e]֒`g훛f䇅pQSMzmᅄ`慙O݅IpulkᘞIDŽKOjhᄀolu_}~on솃nk𛇞pp`go쁁l񅁙|󞙓pbh醅`x̞Zlg隅jꇞegљҙbl넇n隟eg]Tۜaj`㘙gT]Qebᛅf愛u߅tNqjᅆb曞HۅqpGj㇀lnOOrKnh퇀li񙅟w񅅕VvxfnnrOR`|j醇csɜObyꚛꇘaeݟS`fhꅟdaPٟan`f䇆ePגdf㛚`ᇅwTXFsoᅇbN݅I}Bj㄁liᘞuąJ|Nhk솃nlqGs|`h遃kk󚇞rvf~遆n~󟙓Hbpjcejǜ\cddfԙܞ`oꇇb뚜g䇁fԛQޝgjdc懄yКGP{cmㄘv؅tJwjj㄁o㛞v΄qsEjk⇀im䘛qʄ[rwnihn vxein{MR`sj聄ldkEcxꚚꇙdgkU٘c`n녜g净`ћ]ǜfkd雞cᆇeКZܝxka⛅c㇚sŅu@ukiᅇb㚞v΄|t^j℁lo昙qqHEoh퇀noq^t|fh聀j򅇟|H\ds끇nx😒ESascgkÞWԛgekffԙRgma蛜`熁gWP۝zkg웘mݚBSrjm⅄o텞p΅qJDh섆ikᘞvɄqq_nkl嘛}󄇕Cqtcj膃ji]IUd~끁kxCRfvꁅm儀gk]`a燃ajęRŘalꄇb``қDƜgid雞bㆇdۚCWxjf횅o쇘sۅt[Ikn턆h셞s˄rwPhjb|wuFok醀lyXu}dk聀kg囙\]_fpꁄn儀gj򞘒WRQa}b䇃akϙYښggia憃bśZɞzla蛟cㆆaƅHƝid웚l퇚yɅs\Oklⅇn셞r˄~C]iioᘞr񄁖pt\ojkb嘚~MEvajiz^ZD{}kdWWRatbghSњdyj`燃`řDÙea`bbܛCΜ|ix뛙l㇄eDžKѝuha텄l~ɅsL[hihk훟|t^o膀jm癘}󄇕uKOck놃m囄{YAUsg嘞]XXgth䄀fhQSTd}mᇃchəSؘgfbbᆃc؛M͟elzo톇fǚIǜrhe隚h{ʄrPGhbh|OSob훞{~O^c膀b䛅e儅KFwdꁁi䅆f䚘XWF~qk儁fDхEepo燃cn񞅟[څgeibᇀlCʙ{cflↆcυvʟ}oz雘n솅e΅qܜOhaix񄃜zRToh釆n훟x{ZВl膀`zp\Fao嚄z兛ZDZprj兆g噞XTO{Knᇀai򙛝DۅYzrkmᇃbkȘ@˛fcl톀mƚ@mxꛟo솄aͅJߝwoe隅hxR_nb脇jjxCӝb뇁c☞erCFab盅gAE_uyk䅇f嘙YS@zNk䄀`hX՚[dtlᇃcnLυe{bl톀o˚uxczn솆c̅wʟsix뛘j膚f򄃘|МAna鄇j脟dz^Tliꇆm웟ez[UԒcꆀa㛛fᇄr^QAgo煇a慘BךM}wᄆo瘞N݅FzIiᇀmnAP~snmㆃnktffl솁o}sl|h醄`󄃙{͟Ilg酅뇙zdPVmo鄇i~e]Uߝ`ꇁ`㘙{|PP]gm的f焛tхCwvj煆`盞MĄwIᄀ`iIÄF|Jko㇃mnBɚ~y`l톀nvq`~ic􅀘qʜLmx蛛j臘gלYmc脇녟z󄃓eRӜchcexYWfaa䄅v\^BnᅇcHׅM}Olk䙞BąBx@jh퇃omH̅Tmokt󛘗rg{il}񞘒tbj놅cyjΟDbf腅ꄟfdTV`lꇆm蚜g凁gSQܒfgf懄{՛YSecctӚMtwjㄆlᛞHąt|Gj⇀nl䘘u˄E|vin솃hor򅚔regihrwSb|h醄czjAlz蚚j釙ddj۞ԙbbꄇnꅜgfכQƟaj`훞d准z֚YҒdc曅aᄚrޅtF}iᅇc暞OńwvA㄁mi䙙uppMki⇀nlp󅅕Et}cihs𙘗KTg~km񅁞y󞙒CWc}膛azjşPbf년fgՙUƞfoc蛜a熁g՛]ŝejf훛`懅y՚XW}mm⅙w܅usFjj턁mᘞvts\kk쇀nl噛vGrtmhhir򛛔qe{kꁁkyu_apꁄmzkD`xa燃fڞWݙaclf熀f՘SĜdhg雞`ᆇeК[גejf횅oㄛ}߅KLHjn턆i횞p„qwEhhl瘙p􄆗HtLnh솀kmxXtxfnkeTBPf|끇odU]Tc~ꚛꆘ`ahȞ]Лaaka燃aٛXaof雟f燆fҚFƝejg⛛`㇅xυvX}m텇l텞pɄM[j퇁inu􄁖}vZih쇀hc䘛|ButchkkyQG\x}k遆i򅁟zYGgql{k̟Wgx`燃fܙ[͘dbcꚜ`懁a֛Pzngcↄ{ݚCН}k`횅l턘svCChh턆i⛟vτsuRn膀km晘}˅OKCbk놀jl{ROyjd嘙ZXgwnek󟘜T\Wa}c燃akÞS؛ffl``ޛ[ϟdlelↆgޚLڝhdo~vZwkm셇h~ʄ|w^kjl⛞󄁗suEm醀b盅zIOpfh끀i兇g䚘YZ^zrk儁`VXVfqꆛm燃`iEҚfehcbژA˙dbaꚜmㆁcJɜxhzldɅtҜpb⅄i􄂞xZRihhh⛟}񇀖{MՒokc晘~vZB`ꁀny[_Xpe䘙XWAeun䄀dk[҅Rgrb燃`k™FɛeacbbŚB~me뛞n톇guޝqof욚n섘|SFnlh}􄃓y@՝njꆁjb☞y򇆔sC^cꆀb嘅z@FWqzj兆d囙Z[ZyJj儁fj]Ӆ^etoᇃciCؚzyolㆃmΛGΞzcen솆cÚMœ|hz蛘i醅eʅrםKna酄k鄞x{@Soh臁o웟zx@Plf㛛dwCO`jn䚄f慘G^[~s焁a䘞FUGdIiᇃmnCڅTdxkcojȘKʘzcfm큀lʅw}l{뛞o솄frKifheeU]oohk횟~d^ҝm뇁c㘙e凇rG[`mz焚JPYvy兇f盙BԅLyKh愀`iA߅E{wjoᇃmnF͚~zadgi充h뀅NwmwcTgRiQ恅Vf蘖|`mә hIC҄Dmf󁂐}n㇄Ȅ{k˟qd腅kxzVRhnki욟~򇃑{D֒m臁`㘙d凇qZT^`놀m囄d䄚B\Ys|兆f曞[TI{th愀`nA܅SzplᆃlnIȚ{dmbㆀlśv𙘐sle뛟l톇f΅wΜJodn{rWGnch酟ze[Ԝmk뇁m혟{rCWa`昚gO]\Jxh䅇f䛙]ZC|u䄁`j噙^TFKoᇃbo󙅟ODžW~omↀo˘J|aei솆mͅN̜vmy뚘j醅f|ٜNmf酄ꄟe󄃜xSVmoꇆlezYVca☘f凄qRTFgm的f慘CSCvr愁b昞F܅N{Ikbn@Dž_esilㆃni󛄞qfao톀m􅁘s󞘐vmyk聄c̟Lne隚j뇙fzҞ^mm鄇jk酜ed_ߜcjꇁ`혞f准~SSacᛅa愚w]GIiᅇbH҅u}N`n䙙JڅI~Jn솀no񙅟uSs~ll톀np𘘖v`zimwlyꚛh膚fjڟ^bcꄟzdWޞch臆bz~[TНga㘛f凄wQGPzo煄`M݅utNᄁm昞G߄JrLjk⇀mn򞛜ADspli쇀ih𛄞qveek遁o􅁙}񞘐wT`rj膄`󄃙xj͜KmeꅅggОU`l넇n腟ddWVӝfjg옙g䇇~_VSe`ᛅaᄛqׅ@tqko⚞IڅtsLj㇀no䙘JυLpJnhioq_sy`k聀i𚆟~vTc~k聇l򅀙yBmx蚛aejٟYb`넄kꅜg冃a֘Wڟcka雟a憁eT_ݒfacrޅCEyoᅇm⅙v„stK㄁lh昞ǘwpCkh쇀imsEppmnnj񛇞~IWg{j遁ox򞘓BQc}醅f񄃙xkΟR`g녅dgؙXٙalb뚜a净fћ[œdjg`燄֚CT~b`慘wڅqMLjkㄆlMpt^h퇁ol䙘t˄BqMlhhorvej聁hyuQd}jꁄlzF`~adj؞Ԙfcꄄnf燀aQPƟehd뚟bᆆdКZВ{kg욅m|؅uGphnㄇn⅞wɄsvGi퇁il㘞vɄwsEnkjb䘚|󅅕Zu}f醀kjxOVgjꁆidY]frm凃fh˟Scgk`䇃cߘ^Ǟama뚜cᆁaۚDĝzkd웘mㆄ{ÅBPjc텄n턙rs@Nk㄁oh⛞s􄀑|uZn쇀kb瘘r򄇕Nuwbi솃ii{\DPxxk遁hd嘙F^fqm儀gh󞛜\Taxa凃akÙXٙg`o녜g熀bĚBΟxnd蛞bᆇeĚHۜ}ia⚅lㄛ}Džq^Ahn턇i횟urJSnkmp񄆔Ht[lj醃kl|XMqejꁀ{TF@zphe򞘝UPYgwa釄br ̈́ksRb옖FahI{၂f^q}fvft_ᆅlGJ`٘^םGPb䘚nncedHƝgg웚c煘uڄsGKjiℇoᛞt΄ru\h턁nl瘙q􄆔ttAljin}ZIdh醁h򚆟xZGgvꁇmy[Ta}c䇃gkğԘfgia燀cјSßdof雟`ᆆgЛ]ߝykg훛m㇅s܅B\ulⅇo텞vƄvq[i쇁in㘞sɄvvAo醃kb噚Nuqfj聃kx嚘WIRdp끆h儁eGR`wm儀gkɟWԚa{ja熃`ߙSƙgmaa憁`ۚEƜeiz雙lㆄeŚN֝|`텄i섙΄sAMhh턆ik⛟}|t_hkc昘񄇔BwImk놃joe ]OT|xh遁jd嘙R_[fvn燀fh򞛜QVWf|a`h˙[ƛgfo`懀mۛFϟeneꚞmㆇgDžLĜ}ig욅l퇛~΅pYNinㅇo텟|xLQiim㘞󄆔}FRbj醀km}@ETvgꁀjd囙SD[zvꁇnd\՚]gvb䄀`hΞ^ޚexhc懃`ؘ@Þdcgb憁fޚAœ}neo㇅{ǚuѝtib셄i}CSokki㘟s|uTm釀jc瘛{uKIaꁀn嚄z兘DG]{sdS_EdKo燀ah𞚟]֚UgrjbᇃckϘA͘db`m톀bIȟ{oz뛞l솄aυuӝrhgi~τsSAnojj~񇃓~Nםo臁`혙zr@_mjꆀb盅d@AWvzꁀk䅆`盙AօCeuh愁akYӅ^dqlᇃbiB΅zeobㆀlɛO|bdꛜl쁆c˅vϜpoeie~UZnm셇hx񄃝eXUmk臆kc뚟cBwV웓ꄐd~q 뇁cjv遄l昜F}c}僇oᙐ_o{fnenꅐ偁텒Ke~Pppj놀lɜEdm鄙UsIbv~mfh䘙Nӛcp`䇃`h˙Dśdgo`ᆃmšKʞemg蛟l쁆`K~ig욚b㇚xpԜJhci셟|~E\nhm㘞x񄁗rLPc釀kb瘚xKG]Odj醀jn兇d䚙Y^DyskdZ߅Fzpl儃ah[ٚg{hbᇃbAzcabㆁ`ۚJȟ}oe雙l톄g…pޜIn`셅iZPnhjh욞|}uՒb臁cᘘyuJFfo囄e䅛^D_p}䅆f嘞]R@xOn儀ai[Wesklᇃbk˙FǘdgcoↀměI~be뛟na…Jǝrle隚i釘{􄃙|WBkb鄇jj腟y{BPl臁c☞e}C\bb盅gOYVteh䅆f皙GTMvj䄁akDӅ[eqnᇃbn󙅞N…zeobↃoɛw𘛖xcgo쁆bͅvȟsnz隘nd|şOo`kyzWQlkl{xE֒c臁ae凄rEQ^do䚄f煘LWCrp䄁`䘞@ЅLxKh焀`oC_z}km톃lht}aalↁoɅv𞙐}mynaɅqĜNmdi{􄃞|]Rmm鄇jzdYӝbkc㘙eq@Sgcᛅg䄚O_GHr兆aᛞXWMxIj愁`hFӅXyLjo⇃miCϚ~xco톀oq񞘑`{kb􅀛qϜtlx뚛k膛gҜFoa脇넟zeP՜biꇁbdzPVԒcf⛛a燅wYSZeo慇c慙LԅKstmk昞KхBIjk㇃loHͅ\y}ooↃikp񛛗|feno񅁞xtl}k膅`󄃙y͟Bld腅脞geיW֟bo뇆o障dd\Uߝ`ꆁa⛙g燇Q]Sgb曅`ᄘv҅LHp愆muvsBj⇀lowɄCstklↃoi𘄟v񅅕Vvz`o솀oΚv󙘑uVa~h遇`󅀞ʜBcx뚚h釘gzџPcc넇kꅟdeTQĜfkꇁ`f准DQܝeacᇅtQDYqi慇c᚞I܅vwG㄁mh䙙@ƅH{Fih퇀nn򙅟JȅYp}biis򘛖vg~j끆nr񟘒Icsꆚ`zk͟Fbef凃gәSПamb蚟g䇁dTSܝckg웘bᇄrWF_{mᚄbwޅuwJjㄆojKt}Ajj쇀ib昘rApqlihi|󚚔Uteei聁j{BS`r끄m{jFcxꚅagj۞Tԙcb넇of熃`՘X؜ahgcᆇgݚFНzf⚅`ℛ|܅vFwhl㚞v̄|uD㄁mn䙙twvAkkhlr򄅕Zwpanh@_d|j聇l򅁞e[Wc~ꚘaehžWWafꅄf凃fݘGǞgoc蛟`憁gܚFƜzkf⛛bᇅ~߅FVrjlbㅙJƅpI[k℆ohẅ́pvRonlq@vu`h醀khxvzꁁkzLYgvmdkEfxc凂fjǙPߙgcba懀aК^dhdlㆇzƅOђ~a횅n섘qŅwNLhh턆n욟p̄|v\i醀hmᘙy񄇔wu@lk醃joy\u~dkꁀeB_dri儀djXTa|m懃`hș_қgfncᆃcDßfng蛟caKڝejd웚b㇅xpRukm텇o텞|Ȅ~M]hin|sN\nhc䘚{uLwfk醀jkz嚘SFZ{|hd噙QYYdslai^܅gea燃cޙAϘemcꚜa憁`ښM̟~nemㆄząJНvnc⚅l턙s̅rZ\ih섆hh욟sτpJUm釀kcᙘ񄇕uHBcj놃leQuSryje噞R^Xxpo儀gk𞛝PWQerm燃bhʙ@ǛggbbběZ{le뛟o톇gÅIٝrng욅i釛xȅs\Milh}LPo釁jb☞ypHZc놃b䘅eBOteh䅇a䛙^DDevj儁aVV]fpl懃bn𞅟ZښadicmȚIxbgm톁cͅt~nzoeɅ}ٜuhc셄j鄞y񇂟{_Vnkhn훟y󇀖xFSoj`ᘘgvFO`l䚄f煛@\D|pf䘞^POzNl燀cnG߅Qz|jb懃bhəM~fbbᆁbupmzꛞn톄dDžtǜJogky՟[nokj酟{ʄEНm臁bysM]aꆀb曅eME_w|k煇a盙^]FyHk愁`kSׅ[zwoliDšyxmo톃mÛJʞ~czn톆cpϜplz雛ker֜@lc鄇k酟{{EUbhꆁme~ATmagwAIdl慄`暙@^Dw愁m䘞D܅Fy\놚c慟aNmO턝j쇘^kiWkT넓Ai뇙Bm͜ʇqcemsglچRGͅh[phatcT ȇf䄁ahĜ [dd蚅g凃aݙۙalm뚟f憁`כ[Ɯdjf혙`ᇄ~߅AT~bcvͅrLLk℆nv΄}u_kio噘vJwNlhni𘄟s_O~ek聁k|GXap놄m{j^f~`凃gҞ֘gfna燀`טYڜzhg雟c懇dךSВyka⛅l⇚p߅LEInℇl욟vŅsw\kkoᘞsʄvs@ok膃km~Aw}d聃jx囙NRgpꁆi儁eDRfpm焃fhȞTњaehf熃`ݘPgoaꚜbᆁ`ߛ@͜xhdoↅ{ƅO]}j`텄n섞r̄rBBij턁hh⛟|񄁑}wRnkb瘛BttckꁀnePAUex聁hgS_Yawl儀gh󞚜PT`yg凃`jƙX͛d`lꅜ`ᆀbGÜehd雙bㆇgwޝ|jf욅l퇛}ɅsE@hhㄇl횟|yNWnkl瘙}pLEcjl~DFPqejꁀyUEAzvhdj]Zdsc䇃fjƞRۚednc燃`ߘDΙymf뛟lgޚOÝxiz際n퇚xͅuRJhb셄i}|BVoko☟x񄁖sIXm膀c瘛yLLHfn嚇{嚘YF\xwj儁dS_ZdKo燀ai񞚟RӚf~hbb͘G˜zbfmↁcǛNyoz蛙n솄f͚uНqnfh{Ȅ}][inkh|񄀑xK]lc㘘{pBGcjm囄g党DބNyadiS}dمb턛fQhqђ섞mꁀkɘtD݄[ldƄẗ́zeflↇby񟘜vb{蚛k醛feӟYbc酄j酟xf^۟bjꇁb훟g准xQQג`aᛚg懅}W_C{n煇a暙K҅OsI愁ck癞IDŽu~Mi㇀bo󙅟Eυ_}lbↀok񛇞p𛛗qgellpJmx뛙jaykŸDmf酅ꄞeePҞboꇆl雜ee[QŜfa⛘f䇄r\AzmᚄauTMuw慆c昞BƄvrAj⇀ol噘KZuiiinqs{gi遀h|󞙑wQ`sj끄m~̜ulx뚚뇘gejŞPmb넇iꅜf䇃fPTĜckfa燆xQ\֓af훅cqЅCHnc㚞K؅wrK㄁on癙uu}Okn톀hls_pscnkj}wQf~iiywbꚘjꆚ`gjRbf腄ꄟdfՙPٞcnc蚟f憁dS[ڝff㛘a懄܅@]~mᚄc慙uDŽwNHᄆljǘwqZj⇀olt@qplo솀ii򛄜Wtddk聁i|D^fsj膅m󄀙ykT^cxfdԞәa`o뚜a净gU\͟fhfa熇d҅GВzja⚅mp݅KCJjnℇi⚞Iمqw^k쇀nl晙vτJvDij膃hopIEgeQㆇ臝wbaanyd}gbi󅆟yw`wietずH`腛tFld뚘jhŚ_\ᇅi嚛JJ~p똞b懅~􄂘djݝ|kai셞r􄃜xYYnh臆ly򇁖yNRbꆀc昛dJMBgn䚄f兛_^Zxpka噙^Q[fwn愀cnX߅d~jmㆃmhCϘ{`al쁀l…t~le蛞na΅wٜwia횅n釙y􄃞xQ[on섆ij욟xz^Ԓl臁jcᘙeqX^c놀c䛅g焚I_Xv~e盞AVuxui焀ciD҅Gxqm懃ciN͚zdlcbśKmen톇fÅqvoe際h釚{ȅܟFnbj~~Fџcj臁m옟z~@Va뇁`ᘚeKY\Hzo煇a䚙ZSB|u焁`]݅LxKn懃bn@ąTyrno㇀lH|fgn톁bΚwpmyꛙhg|؜Kof腄j脞xzVPmoꇆo蚟ezEҝca☘gr[Efb暄`煛O]Xv}ᄆc曞@ՅNNjbnKDxvhi퇃liHΛ}gcnↀor񞙑qbz뛟ncyvlz隚h뇘d񄃞zjٟYomk녜ddSӜbj臁b㘞d円yVTV`ꆀ`f愅wV[Myh䅇aᅙLхu|Oj愁bi䙞NńNNjnmltRs~loↃoj񚇞|򘘖pa{ib̅tJUcx뛙j醅gykŸGlf腄넟edTӟai뇆b蚟de[ޝdf㘛e|W^^zl的`慘LWIuHᄁb昞EޅJ|@h⇀ol噛HυX|qnn톃nh񘄟pqzgh솁o􅁙sHVa}聄`󅀙ȟCce腅ꇙdzПPbcꄇode^ܝcjfa䇇~_PՒd`㚅bㄛvTAu|hᅇc텞}DŽEeșfgiЅdVxzせ݅`섛xQcg֝jهscb噞Wol򘅝p˛t`o遀jk焁`򘘐~EØkFih釆cޚJ򙘐Mm~j醄`˅pMme蚅脞e򄂟{TVco臆i隟{eEН`a훙drSYg`f煛NQMwpkc曞BхJ|L⇀mnHӅ[{whn솃in󙅟J͚~dcnip񙘑}`yh遇m󅀙y˜vlx蚛jꆛfejܟ^la넄jꅟgd^Ӝc臆a雟g䇆e]Uaf⛛cᇅvU^Fylᅇb⅙uۅupH焆mhᘙLDžHuh⇀llw˅^}}ll톀nj񛇞|uaenl񅁞~HUb|kgxkΟ]bd녅脞efәОcoꇆl蚜zgUSޝga혘g䇄|ӚY]emᚄcᄘK҅IHu愆b昞Iمvp^j㄀cowτCsunn솃nn𘄜qwddiiuS`|kb󅀙ʟBbyꚚꇙgdӟUabꄇh녜dgԛTڜfhaa熆eV_Ғxa⚅ctWGLpoⅇm酞sT[{ᅟą遘py}g燅fZht慓E r}a΄ޘۅf򁂓c嘅t̚vTvcliᄁeʞqxd隟뀄PubsochcŅvAPck`}ßXl{ꅅ뇙d󄃟dמTbci녜dg\]ǜakfa凇RWWgcᛅf焚vQZMvhᅆbIڅtvFln瘙tąHrMkh퇃lo򙅞IɅs~`ih񚇞s򙘖qf|j끇o}ubraejƞ_mfꄄjf凃fיTٟ`oc雟f冁dQQٝ`jf훛`ᇅU[Z|lcㅙt߅twN㄁okᘞp̄wp[jh쇀ilpDpslnkh}ugehh~UBTb|j膅cek˟Z`e녅ꄞg凂fܙPܙ`mlꅜf䇀aКVƜfkf웙cᇇeمLН{`㚅bᄘrƅuFwkb㛞uÄstZjll癙wȄJpOoihl|󅅕Vtgh聁k}N\g|j끇n򄀙x𞘝FQ``{jߞћffhꅜf凃fTP͞go`雟`憆gUFڝ{jg웛b|݅OYvjlⅇoㅞO܅vHYk쇁inpɄupYi醀kmp[wvak聀jhywe}kzBSapcdhɟWTbza燃aęQ؞fccꚜ`䆁aߛZ؝didmↄe؅OT~ja⅄m섘r̅}CKjih⚞r|KZi釀jb瘘|wvNlhjl~SLUzk聁eC\fqogjWS`~c䇃`kÙ]؛fclfᇀbߛC͟eigcᆇgښuĝf횚o⇚|DžuSIjl텇n셟s˄u[h쇁ho昙psKZnj膃kmxDCpaj놀kj򚇞QA[xsꁇhz\QYdpm燃fiYߚgdk`懃`ޘZΙdmfc燆gܚIɜ~iel⇅zمK֝uha셄o텞}…rC^okii훟|􄀑qvPm膀m瘛x򄄕NK@`j끃n{兘ZOW|kdUZZdKl儀ah𞚟UWdymcj̙[gabbㆀb͚M{lzꚞo쁇g…wӝpid酅nxp[Lhokj욟}M\n臁b󄆔tuEg膃oi񙅓e|moΙoiPԒ넜nhugHhe_Lt 燇a@LxI{zigƟheriG՛z\ꇙxZyieי uGzdkoᄀgԞVϛeb`m`ěMɟ~o{뛞n톄dۚOӝrigiȄ}XLiojjxMWo뇀jb晙x򄆔vNIcm䛅e@O}{jd嘞^^Zdui焀ck^U^drm懃miDzdml톃mÛOʞxbg뚜naͅpÜ}ien쇚z􄃙՜Hib셇j넟~xGRnjkl☟x|EWb놀`昚d凄tXTKgjhf慘ZWF|}焁a噙XхLewlᇃ`n𙚟AۅSdhbljI{camↁcǚvpnz蛙i톄dsߜunah}΄|]Vmn鄇i}񄀑{Xѝm놀cesZU_fl的g兛Z_Dvr兆d^ׅKyIh愁`iDم[~qklck˙Z͛xdclↀourcxi솇a΅vǝsmei釘e􅃙|VFlb鄇酟xyFUc臆b⛞zL]aꆀaa䄅u^Rtxn慆a暙AՅHu愀bj噙FڅBzwjhmlLU{xmm솃nwr`ek솆bpȟql{雙jd~ޜHla넟dd]Toi뇆jlddYђmag䇄rWPDeb暄`ᅘNׅApp愁c瘙CބuJk愀boH„G}il㇃ni񘄞K𚚔}ffmㆁbυp󞘐vTl~h`~jHme蚅j뇙ezݞWml脇h腜xdVН`k`☞zxV]Vgcᛅg愚w՚BAqk煆a盞DՅtrL㇀li噙A߅CxIhn⇀olH΅Wr~cl톀n񚇞pqUf~i遆m˅ruUcy蛛j醛fݟAc`脄eeQҟ`iꇆmgeQђdf⛛a燅}V\EzlᅄmᅙN҅uqN㄁lk昞@ۅw~Bik⇀ooKÅ[smn톃nk򛇞s𛛗sgzh遁o󅁞|󞙐ubx蛞j끅`yj͟KbeꅅgfҞQbl뇆l녜g净gY۝ajf옙`憇yTRVdb暄bㄛt؅KIwhㄆn㛞uŅvsGjᇀbo䙙qɄKqtin톀nl}󅅔vyfhi󅆞LQa~k遇m򅀞zG`j臘fgkU`aꅄk녟g净fޘXǟgi`d准{TYݝdg훚`愅qօ@XqllIŅptZ℁li癞MwvFhk쇃oltEt}cihj𚇞p𘘗tTeyk끆i~򞘓IWapꆚcdkϟRfeg䇃fўTҞgocf䇁fU\؝ehgc燄y܅[Rc⅄mtڅtHJjkㄆn㛞tqq[i쇀hm䙘p􄇔Npwlkn|Uqyek聁k{MP`rꁄlxjFc~`凃fjڞҘacꄇo`憀cݛYǜdhd뛟bᆇdݚAҝ{`m퇛}ÅvGuoⅇn텞w̄}tDi쇁ilᘞpqtZnkkb嘅󅅕DJv`i遀keTG^g}jꁇig][a}c儃giSћfdjg䇃`ܘ\enaꚟa憁aڛZƜxhdmᇅyąJ֜tb⅄m⅙s|KZh㄁ohwȄsuSn쇀im䙛s󄇕BKHbh놀joSFX~yꁆhe_Cdqꁅl儀gkRf~a䇃ckǙSܙd`ma燀`ݛ[œyhe蛞meޚLѝshg욅l턘|̅qFtioh횟rɄstSn釁jmᘙ}ʄttBb膃jo~_N}zeQXXgqh儀fjWޅI`g옙`ffꅝMbaqbN㛒imHiQDbלnAhy|™`nkݜ|ÅlgxęYљoc脇k녜egWQڟ`hc옟d円eTQђfaa懅r՚ECn慇`wڅJsK愁ak䙞K؅HrNjhbn𙅜HʅRrrlo솀njvsdzil}򞘓LUcj놅a񅃙|ݜ^cg腅넞z򄃝g֙ܞcll雜dd_ٝag혘f䇄sS_RzbcJԅNKHb昞J܅upEjj⇀lo噘u…E{wniii񘄟r𚚔pygii񅁙}򙙐tUa}m򅀞eBmyaejޟR`ciꅜg净fQUڜ`ifc燆~T\Ւga㛅cp݅NGqiㄇmㅞtŅwp@k쇀in癞qK|@ikjl|Pq|`n醀j𚇞~Of~h遇oeBm|ꛘk醚`gk͟USlgjf凂`Ә_Ù`ncfᆁfԛ\ޝgjf㘘cxŅO_elᅄ`w؅qNOㄆlkᛞẗ́vw[jj⇀om噛r񄇕Bqwmhih𛇞wRuQezhn{@Rfs놅bxjɟ_`zꚚfgٙ]fcm`燀fјZdhg`ᇇx՚Mߝy`㚅mㄛq܅MB Nkkㄆm횞uptYh쇁no昙vKqMl醃km囅~򅅕_udjꁀhyF_dsnd😝XVaqm儃fk͞Uћadha燃fӘ\ğglf뛟cᆆgӛZŝekdm⇅|ؚN^pkb섇nqÅrKXhjjm腞yDž\qNiRQoלhvbd}噟`fb섘OKgd_`C 懙bItk𘄜rsqei쁀h~vYdp끇o򅀙xFa}adkڟQcanf凃aכUƟgig뛟b燆zWYҝzhd욚l}ޅMFqjlⅇl㚞ODŽrwNh쇁inᘞuτtpGohm嘚r󅄕Bt}`k끃k{JWe~ieHUaqbfhʞUSadc燃cƙZٟam`ꚜcㆁ`ܚGǜejd웘bↄeÅKԝ}`텄i턙rpB@kih횞s}IZi쇀hcᘘ}񄇕IwOlh醃ko~_B~ek遁ke嘙WSFgqj끄ogk󞛜WSTf|`䇃akϙF ޛzfl`憀`ٛCϟeid蛞cᆇdٚI؝|jf훚oㄛrÅvPJjn턇nq􄃒BPnkl}wCDlj膀hl|EOvej聀kyQLRevhgP_]dqmfh˞YЛgdnc懃cۘYÞ{cfmᆆaؚG؝yhe雘o㇅xŅ}jžyhi☝ÇjafQ `ԙp遛Cnᅘa^xfᘚ|s[iꆙO`ϟ倀gxy鄁hm囅g 燅g؅zzphꆚfSjpmcᛛe˘pTAdh끀kdWFD{whdjVR[gtb凃ai^ݛgdha懃cۘDžemf뛜cᆆaߚO͜}kd웛m㇅ẍ́t՝Jic셄i텞rȄBRiin⛞pʄrt]m뇀j`瘚|񄄕AJJfjndXD[~s焁fV_@gtn懀`i𞛜Sךf}jbbkΙCd`cmↀb؛Gœzo{뛙o톄gÅuݜqighx|PBilh욟yeDYocxqLDbj膀b暄d䄚M^U}eꁁj兆`盙\SFeti䄀ciF҅^gpmchʙGŚedo`ㆀlϚIxnelↆc΅JϜrndo퇚e˄}ќBobh셟rxGWlil☞~AVb膀j`瘚ew\THejꁀhd囙[RC~q䄁a_хCeul懃co󞚟DĚVe~ibᆃm͛ucglㆁc…tœqme雙nↅeυwߜJoejNȅjDrbjdCavnPfҒhwidꚘc񚄔WBdstMrߘkꇁim瘅g憄}Rugk⅟QׅoFen뀃n煇a囙P^H|sk䄁fj噞@ՅFgtl燃aiCązzib懃b˛Kycflaޚusoeo쇅zqۜKn`셄iyx_Ulkkn욟~|MՓb뇀b昛|tDUGfl䛄g䅛RZEpr兆g䘞RQCzOi焀`n[VephlbhBed`bↀmJȟzmxꛟn톇fυJڝqldix|^Elok腟z򄀓zFWmj뇁`훞z|G\cb盅g儅OVSwzj兆a暞FSF~tj愀bkGօDzqn㇃mn񙅞Bڛ{elmↃoʚw~c쁁eטpn雓|dd瘝ncwچទS脞lwvʇZz]ꂀf腅k⚞pc٘Tlml昙M΅cbEyJoFM`c웞apuXf聃m䛅d[JTw~h慆a䛙]PCzujᄀakDVDdvo懃bnZޛegmmↃoȚN˞lel쁆cυwrhehe~U@n`j脟x񄃝z[Tmk臆mdxFQb놀aᘛdw_VBfko煇a慘FՅN|v焁cj昙DޅIywl燃bn򙚜MۅQx}ibljw𛛗|`gm큁c̚r񞘒rl{뛙nↄg|NoahxdTRon釆ki{d]Вa臁cᘘzqXV_fc暄f煛BWBws煆a瘞XWw}Oi儀{jȜs놛LafКmh]k㇅lhEj}`ꅐ~K^RÇhA[O|g|ˇc蚟{јjdY|`Dㆄ{񅁒oCdi|G𚄔 aYcghꁅb񅀙vНNl`h鄞ezVTbn臆jn{eEѝc臁j`d䇇}]WYfm的a煛tЅCwv儁f䘙DӅHxBkᄀ`iG؅D~wjo⇃mhu􅅔}e`o톁mt𙘑tbyi솇a΅r˟Hmz蚚k釘e􄃙}ןRmm鄇j腟xe^֜cꇁ`옞g准y[Ւf`ᛅ`焚JPSu}k兇aᚙAULsI`k噙C҅CzHi㇃mn󙅟IυQ|}ln솀ot}fyh遆mr񟘝vnj놚fyܜCmf腄ꄟdeXןmoꇆb隟e{RВaa⛛a䇄p]\YdbbㅘuЅLqwm昞LڅuOn㇀olv˅Yyqio솃nhq𚚔rgdin|uWck聄c򄃙˟Fmd隅jfdОљcm脇n녜d净a\Saa웞a䇇zT\Tdc曅`ᄛtԅBMsk愆b㚞u߅wp@㇀bn䙙uτu}Kki㇃oow񅅔~`l톀nsHVahmyC`y뛘ꆘ`󄃞zjڟ՛cf녟dgWVai`雜a准zXWݝda㘛`ᇅsT^A}o慇`K݅uqB㄁mk昙IƅJrEkj퇀nlq˅Y|pmhhh򛇞p𘛗tdxk聆n󅁘p󞙓Jcs끅a󅀞zFczgdҙTܞcbmꅜf䆀f՛]œahg옙`懄~UEQzaⅅl턘}ޅOCtjkㄆlwƅvs_jil噘qNpHinho~t{fh끀kxIRfr끄o{𞘝QDbxꚚ`fkǞWИ`cꄇif凃fЛYϞab`웞~bo넛dwaw⅝UkkԝjׄꄐDh뇙Ncۜqcz冄lzsqiᙒȟll솁jv焟Cm e[F`뇁il{ KPRt{ꁀjd䛙]SO}uk䄁fjPVZztl燃`iYқe{obᇃmțCcdn솆bÚuϜpl{雛n퇅esTOnf酄j酟~xAYok釆lxy@Wc놀f㘛eJFLdo的g䅘GRD|愁`䙞[QGeKi愀bnGߚQzhlㆃljȘNʛx`go큀mɅvsnxꛞi솄fʅrÜvid隅j釙z󄂞zT[nojh障edSTm臁a웙erZ_`c曅g焚HԅDv|兆aᛞF߅t{Hj愁ciAمAxulmn򘅜w υszml톀l˚q𙘑rbzn솆c˅rtoz雛ke񄃙~j۟Goc酇j넟xeVПmh뇆b웟dxRWT``ᘛgtY^G~i䅇f皙[RMsH焁bj瘞M߅N~Lkiᇀbi𞚟EؚQ~rll톀l˛upgdnↁm􅁘wsl|kg}ۜBcf酅넞e񄂟xWWco넆oedXג`a⛙g凇sZ]dcᚄ`慛IW@vrjᄆb曞A܅ty@jlo噘ĪByvhi솃ii󘄞tțsdgni􅆙s󞘑vby聇b򅀙x̜Olx蚛뇘d{ܟ]m`ꄄhw̅~ˇڟCmafh녒 兟mLOěKjiluod[ؙ톚He[uw|ojᄆ{򞞔t솄n蚝懘D{noF끁jn⛟NVC~Xk㇀oo噘IڅYetnn솃ohuefnnv𞙐p`|h遄ms̜Mb{Ꚛꇘg{ן\b`넇h녜de_Н`kaf䇆z]TUaa⚅cpҚ[InlㅞN؅urOon昞v̈́H@jhnlwS}|mmh󅆞rpfzhn񟘒Hmꛘj膚azjR`f년넟zfיRڞ`h脆c蚜f凁gVSٝaf⛘a燄مX_~mbuۅuwIᄆmᛞH„w}Dk퇀lov˄Mpton솃kh𛄟}WKzdk遁ny򞙑@Wfr`yɟX`z뚅脙deܞՙ`boꅜg净gԘQ؝fkgg䇇xК_Wea⚅cwхB@thㄆb㚞uمu}[퇀lo䙙ūOAwrcwޙ灇edccׅh煅@~`e阞qhF`s⇘Lhb]ΞCovme񞘝^Ąi~ꛞȞ䇚ZaYch͝tf{蚚iegОԞ`mꄇo녟efRVڝdka☙d{ԚZTecᛅ`ᄛNTMBJkkᅆ`曞Cۅtp^j㄀oo䘙uۅD|LokilpUpyfii񚆞pQf|jꁇm񅀙Bax뚛ꇘfeܟPaaꄄif凃aӘR۟`oa蛞`燆e՛WՓgf⛚mrمZ@rjol텞vޅtwB⇁oh昞tτvpFh솃ims^spci遃kj𚇟wdj끆h{Nbsjmgk̟_md녅f凃`ڙPޞclm蚜f熁fم^ŝfkgc懄x߅OPxbb턘pÄpBKjjnj㛞t˄svDjj㇀lo噘sIKJlh솃ioyPN{dk끀hzF^ap끄mej𞛝U[U`뇙gah]ߘgaoa净fܘZΞeofc燇eЛAٝjf횅lㄚvКNZKknⅇo텞trNZj퇁noᘞs̈́KwGnjklsXIvfi遀jk|@[grieARfrb焃ghß՛gdka燃cӘQdba뚜bᆁgכDڝehd웘m{DžuPrkb⅄n섙qpOEij쇁ni⛟s˄pqYo醀jm䘛~Ovumj끃oxRJ{xjꁁkgUOPavmfkPUf~`燂ařQĘa`mcbƚM͟ehe蛞lfŅHҝ|`㚅l쇘|υ|_Kkiㄇny􄃒}N\ikbᘙyqNAlj끀m䚄pʛXjτ|~ez䚝bLbOㅒhnѝ݄@nvgŜhXcaIecgi{V@fK Ip`mhbŘFqcxhcȅuœvoz隚hyʄҟEoc脄j酟ydZԜbhb혟dyXՒa`dN^^uxi慇a盙AԅMyJ愁cjFӅEdti㇀ooK˅TemoↃow}azhl􅁘qvoꛙkajǜuog腄넞edSTmo脇b뚟d净dRԒm놀a☘f凄rQQRdm暄cuԅBsv焆lᛞGЅuOi㇀lo嘛J…Y~rklↃhn𘄞tʛgao솁n˅q򙘐uc~i`|ϜImz뚚j臘egߞQmm넄i腟{f՛ٝcj`훞d准e]_גdc曅f焚qمAK}h慇c᚞AۅtCmhLƄHrLknↃlotš_p|boㆀorwfyi솆msOb{뚛k膛g󄃞yjş_mfꅄ脟zdՙӟ`obed_ܝfa㘛f燄r\WBxmcᅙtӅHvBㄆb昞NŅwyFkj솃oouȄZ~ploki򛛔rdzh遁i򅁙|tW`q끄bzjȟLme녅ꇞggОTܙbmꇆlꅜf燀a՛Tڜakg`ᇇxTRVz`⚅lㄛpњHNqhㄆowƅwsC⇀nl癙qɄLruhn⇃ios󅅔Tq~anjxKWfkbd^b~놘`ekžUTbakꅜg䇃cјWş`iaf准gКRܒef㛛`ᄅ؅H[rocᅙ@څswAjoiv̄vq[hi퇀nlw􅄕Fwsmh솀hj𛇟HWdxk끆ny󞘓G\`s놅czj͟T՚aef凃fЙ֞gbmꚜg熁fU]Ɲdhg옙`懄yمCU~j`⚄l⅙pۅtIBk턆n횟vąwv]hhl䙘sMqLbk膃l󚚔Tqzdk聁kxULQarndj񟘜Sc`儃gjĞPљcala燀`ݛ^ğfnd蛟`ᆆdܚFҝdjg훚l㇚|ۅwXvnℇi텞sτ}HRhhl㛞p񄁗qqFnh醀b嘚򅅕Fwqan遀jkdWMQe}j聆ndUEQ`rc䇃fk͞Qњ`gja燃bǘ[͙dm`뛜a凁aŅAΜ{kg웘m⇅{DžKםpb⅄l⅙qɄ}@Chk턆oh⛟r􄀑}u^i釀km噛r򄇕tBLbk醀i~GGRy~jꁁk{XFgJꆅodhPхUf~`凃bjÙEgabc懀cߚFΟxoe뛟oㆇzݚMۜshgo턘Džp_Gjmi욟p΄}IRo釁jbtw[l놃m囅~EIs{끀d䛙]_Yzvk儀gPY^dwm燃`h˞V֛fdnbcǛZ͞dmyax͛Lqeek煘dG`u䇙Un⅙lќhRsgVhgGyg웚mᄘv؅rYCjnn⛟q̈́sKSihlᘙwuXmj놃l嘅y[Hvek끀hdI_eqngj[arm䄃fhϞ\ߛfgob懀`ܛZŸemd뛟mfښLŝzidn퇚yÅu_uhm텇i}˄}L^hkl⛞rrJEo膃b瘚{OLwajꁀig嚘]A^~|j儁gP_Zgpl燃an𞚟Gךg~jc懃bjɛMÙecam`ƚuʟ}ie雙l톄gυ|ڜqjfnX[ih섆nk횟yyF_okcᘘywI@`놀l囄e儚FD_ryjg䘞[WD{vh䄀aiEޅ\e|b懃bhΙM͚efmc憀cߛM|leꛟmㆇgۚLqngn΄rU@imk|yEԝljb☞yvA\`놀c瘅zBIuekd䚙_YE|qk儁g\PDztl懃ci񞅞ZܛayobmGϙycgo톁cK˜oe蚘h솅dʅsk pjȜK䛒V 큅oȚU~̅Ȅd\{腅gO囟drcO ꇁ`瘚g燄zʄA}g㇙`酒qn|o嚅`\uM~k끀h䅇a䛙_VBNk儁fjSV@yuo懃ci[ښxznbᇀb˜Bɞycdlㆆ`ƅNϜqnx蛘k쇅eȅvМLnf酄jxyDVoh釁o웟|󇁗{IPb`ᛛzuFOdo的d䅘G\@p愁`䙙]WC{ti愀cnD՚eshmㆃlkNɘyaaoↀlυwplxꛞifrƜHid隅k뇙d򄂞{S[nm脇h酜zzEѝl釁a웙g~SZ`ꆀ`ᛅg䄚N_Ywyk煆a曞AхO~uk焀ci噘BÄBxwoln𘄞Hɚ~zml톀l}w`zic}woz蚛idyܟZocyeV՜mj臁be{RVђc`f䇄wUX@{i嚇f慙AԚKqIj焁`噞^ԅMyBnbi񙚜IÅQ}olmkKʘ}gen솁m󅁙e{]nwƞg{ahk回ꁙg@}|ZL ΘhL`dhRkz燀eF ֞fi鄆m뚟`bKEj星䇛_f{퀀a활pˇ~]Xݓb`昚e儅qWGGzi䅇f暙NׅL}t愀`j䙞M܅HxIn懃bo󙚜DÅ]{~icmjJsfdl톆m̅vtbꛙn쇅g˅}؜Cmf酄k脞e󄃟~XUcoꇆoexEߝc`d凄|B^dl的g慘MSEwq愆`盞ZхNyO㇀bo噘IŅYxphn솃liJϛrefoop񞙐qb}h遄m|ΟHl{뚚뇘d򄃞~ן^lb넇k腟de^ޜckꇆ`d准}XQaa㚅cᄅwU\H}ncCԅK~Kll⛙y ݅fևIc 턁yՒkzRkᇅe솆aAl]煝SmꇞMa{ꛟi뀇id۝rv愅遚Qe뛖~fbfꚞeمpOie腚釘z񄃙|WQml臆h腟{eDѝma웞grXT_fc曅a䄚OSXvxh慆bᚙATNuᄁmi噙A߅Fxwki⇃oo򘅞JVebo솃op𙘖}bxh遆mulx蛘k놛a󄃙zjşZl`酄넟dgQ֜cj釆b웟d䇁dUVӒaꆁa`燄qPRFen䅄`NӅJqIᄁmjJ؅HyCillIÅXsrnoↃohq𛛗qddl톁owWb}h`yjȟBcg隅j넞z򄃜{Ԟ֞blꄇo녜ed]Tٝaa혘g䇇~P^Vgb暅aᄛJ܅NNwkᅆc曞LۅIvAk`iHH~unhꁂijޞR›xꇚhalAk隐P耄SdAdhu۟zwg雓\koۙ„ C|a{mf뚞k醄fej򞘝Goe뚛dȅtkΞcevc܄ig욅og凃ajܞPcnizdPНaf☙asRQ_eb暄f煛tӅMJwjᄆ`瘙[܅w}FhbiGDžCsqhnↃni񘄙upefo솀nw񙘑ub|h遇`˅wΜ@mxꅚ뇘gzUQccꄇhꅜeg_ݜahag准z]Rfa㛅`愚sUYBi煇bB҅KyC⇁mh瘙HمMxOhn㇃oovȅ}mokj򅇙}򘘗vayhn񅁙|🙒Ob}azǟZca腄eaUҞcom隟g熁fWVݝad`燄|Ԛ\Zeb㚄bᅘtمJtKㄆoj㛞t̄ws@jjnm䙛vFs}niii򛇞}Qwdei遁n󅁙~uTarj聄mzFmd蚚dfٙݘcbꄇn녜d䇀fT^Ĝfka옞dyך[В{`aᄛqڅwAqhmtƅst[퇁on䙙K̄uqBih퇀ln𙅜v󅅕Xtfii񚆞A^fs膇m}@T`|ꆘcej۟TagjgfUQޟdna蛟a䇆gVܒejf훛bs֚EXqmㅇb텙w܅wtE쇁hhv̈́qrDijhmrLqp`j遃jhUtd|聁ixMR`vmdjΟSc{f凂aݙؙambf憀aИ_Ŝdhd雞lㆇeߚCՒzf횅o턘|DžvCtki℆n횞p􄀓stRkhm昙rNvHniko~XO{dk遀heVE]apꁄoej_Uc|뇘ffh͞Pܛ`gif燀cěDƟdng뛟`gڅHڝxjg웚b㇚|uXthlm텞sO\k섆oo㘞s}L]lj쇀ilrAIqfk끀k~TBXxph儁zKلlXRB{gȆl⚜d_k_䆅f蛒PinśƅJ{s`xqcvUj쇅 恄iIOԙ[cヂqiᄅ|̄zkŸuig腄鄞x{\\mh臆oex[Փma㘘g䇄wAT@fo䚄g煘G\E|q焁c昙GЅI{uhᇀcnMƅ[xhoↃoht|ffl솁nͅs򞙐soxꛞh솄`􅃘}Üulgk臙{xמ^noh{eFՒc`혞g准yYS\aꆀcᛅg愚M[DJk䅇a曞A҅t|Ik焁biBڅAvnᇃmn𙅜tUxmlↀlΛqsb{h솆cvwmx蛘k釛ds՜[mbk腟{󄃒e[לbhꇆb웞ey^WҒaaf儅uYG{o慇f皙FԚKsu愁a䙞GօBxBnmnBDžTzrolↃlkv񛛗gdio􅁙r򞙓sck醅fƜLoeꅅfe՞מmo뇆o녟ge^ޝbja⛘a燄|VU\db暅bK֚@qvjᄆcᛞOօKCj퇀mn噘wąM|vhn톃in򘄟vpean솀nyp`j醄lMbz뚚ꇘfdjǞ]m`ꄇk녜g凃dTݜckꇁa웞d{U]גaaᛚaᇅsӅAG~i慇bㅞwۅtqFbi晞v̄K|Kkh㇀moq˅Rq}bn톀oʛquVgzho}򞙒uV`|ꛘj膚a{kϟ]cg년d熂m@ZӅj؄~zdy䛝燅cubO횓wnc_Ɇޜgi醀TgmdE ԇdӛTGdj`ᛅaᇅpԛBLrnᅇm텞HƅqsM㄁lo晙uK}Nji⇀olp􅄕_p~co솀ij󚇟Kfxj遆o򅁞{@m|ꆚadkΞ]ba腄ꄟedݙQę`i뇆mdzR]۝gf훘cᇄ|њGSlᚄ`ᅘL܅uNLj℁l瘞LÄpq[i⇀nluZston솀inv𚚔HV{ehnF_fr놄mzϟO`yfeӞҙabog净f՘Vޝgjfa懇d՛_Wxa⚅mㄛsڅuCujnℇo㚞JDžrs^h퇀no昙wȄJrunjkmqYqghk򅆞yJWa}jꁇn{󟘝Bb|c䇃akžUcgkf䇃`ܘPfoa뛜b熁fŚGŝdjg훘m㇅|؅NX}jmㅄo텞w„stC턁nn☟gNeӒwi~~fG ́ikȜӅipfikS놄{]zfi߇jepzs`si逆kᇁojV\քjZ k暛hmšHRmceޟWlgkꅟf凃fיޜcna雟f䇆dTSߒag훚`ᇅs՚FA|lmuDžpqC㇁niᘞp˄JrIhk퇀ilq񄄕[srbi솀kh}VJUdyk遆nx򞘓Mc|놅`djŸ\beꅄꄟfaܘUڙ`lb蚜a燁aߚ[Ɯfkg웙c燄eٚDםybbㄘvDžvFNjm昞ODŽsvXj쇀nl噘vusuon쇀iop󅚕Sw~eh遀i|BEarj끄m򅀙˟Xcyꇙagj۞V؛`fi녟g䇀`՛XŸdnff憆zӚEՒxjacᄚvօKDtjo℆l㚞wƅqvZhin癞ūJqAojkm}Ysrfk끀jjyJVg}끆nz򞙒Xbqc䇃dkVW`ejf䇃`ޘSŞamea|͚lqb}kӇo웒k`hřf䘞YH~amgeu皞lo煇`텞~~OAiꆀcjC凇SmuWjkↀhm㙞wޚZyFoh㇃ilss}aii󚇞|vg끇lIT``dk^agja䇃fUVߟaoa뚟a熁e՚^ޒfd웘m㇅КM^lmㅙwۅwuOj퇁ohv̈́p}@iimv􅄕@psbhhixJezk聆i{ERcrlej\b{ꅅ`燂aٙYę`ml뚜f熀aћ^Ĝdjg옙`zҚBם{`⚅m℘rŅJCJkㄆn⚞qȄrq^j퇀nl噙rKtuiiio}YL|fnk~NYaqꁄoe𞘝Yc}ꇙ`gjڞP ӛg`i`䇃fޛXǟdnf蛟`䇆{Q^؝xkf⛛b}КIQwjoⅇo텞p}O\h쇁nn㘞pτtwYokmvEKwaj끀jk{O\{rh{D]fwbghU^a{k`燃`ř^؞gm`ꚜ`ᆁaӛAÜgiem{ۅ@W}hc⚅oℙsυsK@ik턆hh욞|􄀐}tYnib昘򄇕wJtbj끃neYFxyd嘙WG]gqo儀gk𞛜WVVg|b燃`k̙X٘ffmcᆀcݛ@ɟene뛟lㆇfڅN؝~g욅b쇛{ͅr^Ijnℇn셞}񄃒x@Rh퇁hm}qH^ljb䘚x@FUsgk끀e䚘_[A{piajPTYdrbghEٚddhc䇃`ŘOemgꚜbㆁaǚNΜidn톅yDžwќvh`셄n⅙vτy[Rokkn훟|􄀖}CՒm놀jb癛xKOLgꁀndVM]pf噙TSXgJn䄃fk𞛟Q]djc懃bƙ[{f`cbƚFΟnz뛞if̅tۜrng욅k~􅃙}SFnl臆kj񄀐zCToꆀjc㘞evKAbꁀb盅d党AFPsej兆g䛙VXAeuh懀`k^х_gplbiBƚddomↃlțIemzl큆`ȅqϜ|n{際nd􄃙WMick鄟y󇃝xDPik臁kl⛞z~ZPm膀`ᘛdw[UHg놀hd煘ZQNrpk䄁`瘞@ׅGzJo燀bo򞛜LÅVxyhmᆃbjϘJaacᆁcȅpslx뛙i솄d΅rĜKofi鄙~yPԞln鄆i隟yFҝ`ꆀ`☙dsMRal䛅g兛^YEws焆f䘞]UO|KhᄀchZ҅Zypkn㇃liI›ye`lↀl˚v}`xi`ppmek뇘e~՟Gmc넇腟ze\՝bk뇁c웞e|[Pc`ᛚf儅tX]Oxi慇c暙@UMyH愁mk噙@҅p|ꘞovndYmL@n텝CeCGGcwb󅀙~kSƄFme雘|jteRin{Oh]lB䁅`Jl`P φ`v֝uP`f욅i쇘z񄃞yQEmm鄇kx񄀓{@֜b뇁c혞d|[Eacᛅg儅HSWwh䅇a盙AԅA~ujᄁbk噙EŅCeJknᇀmn񞅟Myxlo톃n˛u|bzn톆m􅀘r񟘝rl~ꛘj醅gyݜMof酄ꄞzgVSoh釆mez^Ӓcꆀ`f䇄}VSAel慄`ᅘNԚ@rw愆bᘞ@߅Nyuh㇀lo@Å_y}kbㆃlhv|ggo쁁mr𞘐vc}ia󄀙xΟLlg隅k鄙zdҞTmm脆i酟xg^Uޝ`ꆁ`㘙eyךP\fb曅f焛LךFwsj煇`曞CޅwrBjbiGׅC|Iknmnu}xcoㆀnʚww`zic􅁘qJl{뚛k膛f񄃞{jҟ@ma년넟zg^ٟaiꇁcd凁zYVff⛚a儅rV\A|oᅇ`慙MׅwpM⇁mk昞K؅JyMki퇃olqȅQysmn솃hk󚇞v󛛗sg{k遁i~󟙓vl|ꁅ`򄃙y̟[bg녅ꇞg凃fמTmmo障g䆀gSWݝajgc懇{T]]d`ms߅HNpkbHńtpAll䙘w˄Bruin톃ho|Vqefn쁀h~Ka|hb򄀙~𞘜Am~臘dgkŞUbcꄇk녜da՘؜fkag䇆dК[Вda㛚a焅JӅIAsi慇c㚞t؅qvE㄁mh癞ItpBjk㇀noq񅄕^vrbnkj󚇞p򘘗H]g~j聆n|񟙓GW`|j膚`ekZaed凃fԞٞalc蛜g凁gҚYڝdkd웘cᇅ~КD\|b⅄l턙qҚIKAjj퇁njwÅvpXnjm噘pɄErumhknPv{eh聁kyHQfsꁄb{jT\b~a䇂aޞWݙa`o녜d熀aИ]ٜfig雞cdӚDגejf⚅l⇛߅KDuo턇i셞v΄|tEk쇁kmqʄJrFii솀kl|EusanijzTCTf}j끇oe񞘒XPfrh℘f텝燅hԝjdžulqfj|azr熄meelGj䙜톛wzdJWW [YdmcVh e|_ Aab텇h脟ezLԜmj釁jo㛞~AWcc昚eKFMdn䅇g䚙__@rw焁`噞YW@xNiᇃci󞚜Mޅ~}nmㆃmjʛKʘeagnbq}bx뛙ifsޜtlf酅jꇞeeWRno뇆o蚟d򄀖{ZVcꆀ`㘘gs\Dgm的aᄛOTGqs愆`曞FUMxLjᇀbiM߅^zpkoↃnhtΛxe`o솀irsb{ibʅ}ɟKoehg򄃞eޟXnbh{g]ҝokc웞dz\QВ`놀c瘚d䄅vWZ@yk兇`IۅJ|w焁ak噙B܅L|unᇃbo򙅜wSyomↃnjs򘘗qa{ibȅtwm~ꛘhg񅃙yjۜDmf酄j脟e򄃝{\Пci넆m蚟e{^VĜaf⛛a䇄pS^^zl暄aCVuHt愁b昞AЅC~CjjᇀboODžY|qno퇃oh񛇙trddi솁nʚq𞙐wc끄c񅀙Ɯ@be녅ꇙgd֟Vb`iꅜfgQޜ`ha웙a䇇SQPg`cᄚtUGM}hㄆb㚞B݅u}Bj퇀oo瘙IDžLNhhoov\ycoh򅆞y򙘖r`{iox😒Jm膛aek\mc脄넟d凃aИQҟch`雜a凁gWSܒaafᇅrхC[{l慄b⅙pƅuwHokᘞw΄ppFk퇀ooqZpvno솃hiswdehn񅁞~L]a|k膅`xjȟPce녅g򄃜eОٙfml뚜ad֛XƜgkf`䇇\_Нyjbmt݅uDthluڄvqXk퇀lo噙t…OsBlkiot\w~gk醀hIQg}l{E`|aejǞT`ahf凃fԘ_؜gof雟c䇆eԚ^؝zkg웚ls߅BZqkoⅇn텞t…tqGk쇁ho㘞v΄H|@hkkm嘚}񅄕Xp|`i遃kzwdxk끆kgCPc}m䇃gkȟZ`g년`䇃`ژ]ܞal`ꚜ`ᆁ`ћDǝekdbㆄeڅOגyc⅄b턙}DžpLMh턆nj㛞pʄstYh쇀ib癘r򇇕KILohknyZCUej聁ixWXGgsmgh򞛝VPay`dk™^ڛfcoa䇀aߘC͟eng雞cᆇeߚBޝjf훅bㄛrDžt[Ihoⅇo㚞t˄|H_i쇁hlᙞvvt\l釀jm嘅EIvfj膀kj{WB_erieE^fpc儃ghȞ_֛dzi`懃cƘXÞdcgbᇆ`ЛXĜ{ie隘n⇅{ܚNSvc셄k섞r˅rFXijkn훟x񄀑puVn醀jb昛zHJt`끃neP@S{yjfZYgwo儀fi򞛟SPgxbᆂbk͙Gřg`bꚝbㆀcǚBÜghe蛞lↇgÅuڜ}hf욅o섘{˄POkn섇i욟򇃐{OQo쇁imᘙ~sG[c醀l囅gGApekg䛙\^F{qnfk]V\fpb䇃aiZĚ{gocᆀbٛC|ldꛟcᆆ`u͜}ne雛o⇚{ȅqМKoch~GWoho☞}}OSb釀jb瘚eI[Bf膀id䅘\\A}vj䄁a\UEytl愀fh_Ѕe|ibᇃ`DϘe`fmㆁbuȟmy뛙i醄gwޝwnak臙x}YXln釆ix򄀑{CVl놀`㘘ztO@am䛄g兛CEYq}䄆a瘞_\Aeuk焀ci]ׅWgplㆃmiNzfbm큀l˚q񞘐xlzn쁇b􅀛q̜pndid񄃞{џCnmj녟xzF՝mkc웞e|E]bc瘚f儅L\RJei䅇a皙ATu|uj䄁ak䙞@҅Bzum懀co󙅟I…yyiblΘw󛛖}agoↁbšvqoy뛘kgsşLo`k脞z󄃜{QUmi脆leeYܝaꆀ`㘛dpAS\el嚄d煘DRAqt䄁g噞^хOxOhbnBX~pilↃlhuxdfn쁀mʚvtb~hf}œvle蚚뇘exџEbm脇h腟{eYѝ`j`웞d凇y^Rf``焚w]Pv}h慇m᚞LЅuIli䘙KۅAyJji솃no򙅟tΚT|dmoij𚇙r󘛖qcxkbstbz蛘j놚f󄃙{j۟Xl`脄ge]ܟmhꇆc雟eeWSВ`aa䇄qTXY{l慄bㅙuЅtvNᄆbjᘞuۅupNibot΅X|soo톃nks󚚗qfgno|򙘓vUck聄`xj˟Fmd蚅臞d{ܞמbm넆i障edST؝gk`☙d䇇yPSSecᛅ`愛wњLHskᄆcK҅JrGjjmo瘘NƅOsOhn⇀noKɚ}{ghn񚆙r󙘑wSf}k醇m~Fby놘gej؞^``脇kg凃g^ܜfia蛟a䇆dUSUef훚bsU@@|lㅇmㅞJمvqH℁nitwrMhk퇀nlq_p|bikk򛇞spf~끆n󅁙|󞙓Obr놅`gk˞^cg녅faݘPǙclcꚜ`憀gК_ŝahg옙bㆄ~КBTzcᚄb℘qمtKOjm⚞tspGj퇀om䙘sAqJnikl|Vw{fi遁h{GPf|k끄bzj🛜RTaz蛚ggj؞UӘfcig䇀aӘYžgifa憆zUAܝxa⛚mp؅uFvnㅇlN܅qtXh℁onᘙu„tuFnk솃hm|񅅕Duqfh遀kjyI]esbØN晝фh퇛T dx뛟n뀇i톃`ܝ|t愅d雑sa`z쇄t^|aꛑ냁h`tmjUcg훛i聅bvѝKm`k脞e񄃟~R^mn鄆oxMTbꆀ`epFNgl䛄e兛CY^sr焆a瘙^QLeBhᇀbnDӅQz|kl⇃mhIxd`l쁀oțurcxicȅqϜvoe蚚k臘exQ@llj腟{dZUljꇁc☞gEPb膀`ᛅg䄅vW^w{n慇c暙EׅO|Kᄁbh瘙Bń@zulᇀlo󙅟BȅT~znm톃nq񘛖sael톆b}tlx뛘igyjǟFoa腄j󄃝eUҟbn뇆le{WUՒaꆀ`ᘛzsVZZdo䚄g慘L܅Ksw䄁`瘞BۅNxAhmo@ƅY|qio⇃nhuwfgno˚qIVmrh`|ƜAbd뚚鄙dxWԙbmꇆh障ze^֝`ja혞d~SRdcᛅa愛uPFuph慆cᛞ[ՅupB⇁mn噘CBytki솃on𙅟vȚV}y`i쁀n񚆙vqc~j遇l󅀘|ȜNl~ꚛjꆛfxҟYoc鄄ꄟdfSޟcn`雟feSWђgf⛛b懅rԚ[@~lcᅙu؅uwt℁okᘞḦ́w|Cjk⇀im嘚vGp|nlↃih𛇞r󛛗teznoyIUm|k聅adjȟFbg녅鄞dfޘUܙco뇆o障d冀aכWޒaja혙a燄zҚGSb曄`ᅘK܅tNuh℆mᛞIƄrpD⇁ll噘HuvJii솃in󘄟v󅚕\qxgnhrGS`}k醇m򄀙yZm~뇘fdПטa`hggԘQҜgnaa{՛Zߝeje腅l 儅Z՛fIHvD݅ f脁aihmc|zz䘒熅mNiY膛^okQjꅐUogda䇆oᘞY܄qCZjnl噘q˄Bswni솃on񘄟wQuxgh遁n~B]a|膄b~\`xꚚ뇙ggjŞQ֘acꄇiꅜddUVǜfhf雟f䇆zԚS֝zf⛚bㄛrӅOZwnㅇo㚞KŅws_k℁on昙t̄HvBnknlr􅅕]qv`h遀i𚇞ue~jꁆn򄀙y🙒OQas`dkϟ\ldkf凃aٟ֙flaꚜ`懁gS^؝ghg웘c懄|ޚES|m⅄oℙwۅqONkkih⛞qɄvqGnhm噛r@vvonizWwU{zkꁁk{BPaqmgh𞛟USaz`凃aƙ\ژfbꄇm`ᆀ`ܛF͟ehd雞cㆇg҅Nڜya횅lㄘqDIkhㄇn횞w̄rK[h퇀im|wJCokhmyAIU}gkkx囙I[dsj聇oe򞘒US\fr`fkžSҚdfhc凃`ߘF˙emf蛜c憆gݛM̜xjdo㇅ӚISukm⅄op…qK_i턁ni㘞p˄sv^o釀km嘚|AKJ`j膀izUHx}hzYZgvlekVQfxa䇃`ޙ^ře``c憁`ۚM͜ene雞lↄdąJٝia욅o섙rrFAjnkky􄀓sL]okbᘘ~utGbjoeEC|ejꁁf囙\Dgqi䄀fh_Q\grmᇃ`hOۛgalcmǛMʞ{odꛟmfątœ~kdo쇛eυvVOio섇h~xZRnm㘟xqCܝnojJuwlO偅YdkhklZ醀hm噘uŅXpXka㇁Ϝng兜Wↆ؄Hpgmh⇀cʛt wcdn톁bstmx뛙ig˅sڜMmfj鄞ezWTbo脆nzzSВaa☙ds^Q_xb曄d兘JWBvq煆`瘞EԅHr@iᇀbnEۅZyqko⇃ni𘄞u|dfn쁀lpv`yk`rNbz뚚臛e󄃞xџScm脇k녟{d^םck`g准xXS`a`焅tSAu~h慇cㅙK܅K}Njᄁbh噙F؅Htkn퇀ilvυQymn톀nj򚇞r󘘖pazhmyvm뛙j놚a򄃙zjŜZla酄hꄟgfUӟmoꇆm隟g凁eVVҒaa㘘a燄rԚ\[zl慄buЅJtK愆mjᘞLمtrMjhom噛ūArwil톃nhs򚚔wddn솁o񅆞y򙘐Kc|k醄`xɟDbx뇙geО֙`b넇i障z净gUQۜfja옞g䇇{VZݝe`㚅`vӅLAqhᅆb᚞H؅wvA㄁mo癙NHrOii퇀nor Rwraii𚆞}JPg|j醇oyN`|ꇛa{jڟYbfkggטQǟfna蛜c䇆eQWՒgjg⛛b懅|߅@C|mㅄbCޅvwK℁nhᘞKƅwpMi쇀nmp˅X|pch遃kh}JdehꁁixIUcrꁅbdkʟ[cd녅faҙٞ`mꇇbcᆀaӚYƜdkdczٚ@Txa횅n℘sƅuLHᄆl텞vɄ}JGk퇁nm昙pʄHpInihl}_K~gih򅆟xXEfsk遄oe𞘜XVa|ꇙ`gk͞Y Лdfif燃aݘ[Ÿgif雟a燆dКCޝ{f⛚mᄚsąKRqoㅇl셞t΄}L_k퇁nnᘞsvJ[iknls񅄕ZJwfh醀h򚇟uQerꁆiz𞙓ESfqbdkß\azja燃aܘSĞebcc䇁fޚ\۝dkemᇄ~ܚCP}ibㅄoℙsȄsAFhk쇆ik⛞q̈́rq_okb䘘|@pMbj膃jo{PNxyjgB_aqi儀gk𞛜WSTaxꅚb懃ckəXۘecmcᆀcٛFŸeig雟oↇgÅuН|jg웚n퇛|…w^Hkoⅇi텞r􄃒~I^ihly󄆔|LQioᄁht놅@rg}b욜fShך၅WdꛓZnoǛ…耛Jys`{Bn{䚒Q톇 pzfۄ֘j҄a􁂜kbNƚssbb톀i𚇞pvWfzom􅁙sIbx뛛h醛fykڟ_ba腄酟edSݟciꇆb웟zyRTӒfaf䄅pR^D|la暙OTKpNbj昞H؅Bx@kj퇃nnw΅R|voo솃ikq򛘔~dzins򞙓vc|k膅a򅀙~ßAmd腅ꇞfdߙמcoꇇl蚜a䇀eRTӒfkf웙a懄~VXSea⚄cㄘsܚJIthㄆlKڅur@j퇀oo噘v̄F|Hii쇀hnq񅚕szaih{u`}jlxHlxꚚj뇘fdkƞTTmb鄇hꅜda՘^ڟfif雟a䇆g՚[ݝef훚a懅rЅB[piᅇb⅞vąqtDkᄁmi癞JτupCji퇀oop󄄕Gvsbik񚇟~IWdyj聆o򅁞{󟙓Mas醚f򄃞ekŸS`dꄟggЙVٞfbb雜d凁d՛Rڝejg혘cᇄQ\]|jb⅄mㅙv݅tJMjjㄆljw΄u_hnl噘w􄇕OqMohhnr󚚔Ww~ekꁁk򅆞zMQ`plejBc~`凃fjՙaanaᆀ`՘QƜfig雞cᆇeߚGߝxf횅m⇚r߅HFwjn℆o㚞v̈́sv[h쇁hlᘙp􄆗tqOoijl~󅅕Rt~ah醀jjeCVa~끇neYRcs`fh˞S՘`gjf憃cۛAÞfla蛜cᆁgۅFǝdjf⛛`ᇅx؅Kםpjmㅄm⅞}΄rCAjj쇁ni㘟r|uYohb䘛|Ituch솀iiz^CPyꁆh򅁟zQ][gtꆅldhQUWgy`䇃gܞRǘd`mc憀aݛEʟehdb㇄dӚEݝ}ka횅n℘rąqYGii턇h횞w΄}H\n膀kbᘙ}񄆔uwGlj끃m䛅x򅚕\NqzjgZZdti儀e󞘝WXVasb䇃`hș[ܛggncᆃ`ؘZ̞zmdꚟcㆆaښ@۝yneo퇅{̅t]tjcirυ|KXikl훟y}q[m醀jm嘚zN@tfj끀ieW[Yepꁆj儀a噙]]\dql儃ciYКge`ᇃbj͘KȘdc`ꚜcↁbƚKɟxieo톄gȅwߜpkc텄n섙yrXXhk℆ih~򇀑yBTl醀hc昙xpCG`j놀leC]X}ye嘙]UMyti儀fhDօPdrm懃`kF͚{fm`懀cƚK𙘑~lzlft̜rodi쇛{ͅpSAolkxxA֝l釁jb웞y󄆕rIՒbb䘅{CCtekg皙SXZxvkg]VZgto懃biXۅ{xnbㆃmØCΙ~ado톁c̅O͜~ly뛘kg˅u֜vn`k鄞{yXRln臆ox{CTlagtBGal煄g煘FZE}|䄆a曞FׅG{uh㇀ci򞛝AޅPeskmㆃnhuʛ{fcm톁mÚv񞘐snz뛞h`􅃘s͟tofhd󄂞xTRoojj{g^Нm臁kczy^VQ`c曅e儚vW_w~f暙C܅JHh䄁chIŅDxwmᇃmn𙅟uÚ~xmmↃmšt񙘖}b{ncȅvuo{蛘jdrלXl`酄j脟xe]Ԝciꇆmd~Z؝c`ᘛg億v^TCeo暄cᅙNPOpH愁a瘞X߅Ne@jibi𞚟FƅY}nn⇀ojʘvsfdi쁁mt𞘓vc|h醅`v؜Mod녅ꇞd򄃟xTPbo脆o蚟ez\Ւma혙a燇|YT^fbᚄf愛KUFwskbB҅K|Kbn噘JCxphi톃nn򘄟pUre`oh|vcyimyJme際h釘gejşRbc酄腟z凃fRޜbkꇁc옟f䆆dWRՒfaasTZC|n慇cㅙM݅wwL愁bh癞KHrNjk㇀ooq񄄕[}|mnↀnvqezhlBVc~뛙j놅f񄃙xj̟TXbf腄ꄟddQWܞ`lꄇl隟g净eQPŝgf혘a䇄UQVzbᚄfᅘuمutJjᄆc㛞Kڅv}Ghj㇀not΄Apunioht𚚔Wr{dk聀i}tQasj끄b񅀙xKmxꚚaejڞW`ai녜ffTWƜfif`燆{V^֒gj`b㇚p߅CJsnㄇl텞wŅqvDknoᘞs˄u|Jkk솃hlr^tci遀kjxtgyjꁆnz򞙒LU`y蛛jꆚc凃gh͟Rmf년a凃aיT؞fnc雜a憁gUE͜dg⛘axޅu]}jmm⅙rÄqKBjㄆmjᘞs􄀐vvEhj퇀nm䙛|􅇕Itulh솀ii򛄟yVueek聁i󅁞O\asꆅm򄀞ekWQa{f凃aў_Řgfk⛜}懆ߜjՄ념^jra˞oxbej垜~nGޜaj愛kiAm҅ᇘkaᘛf ᆅx̅HYyo暄m⅙KąwtK℆lhuɄpqNkh⇀om噛sZ|vmnkhwdykozES`r膅`gk^`eꇞgeߙSٙglꄇm뚜g净fܛ_Ŝgkfbᆇ{ܚGT`㛅bqۅwCNkh℆bt̄}tYh턁ol䙘qKJumhinr򅅕^ugk醁h|MPap끇mz_Pc|`gkјfaif䇀aUQehg蛟`懆zV_Ғzkg욚b㇚rݚMZpjm텇o⅞p…|wZi쇁io⛞q΄vvGlilp@w|`h끀kxTBSdiz򞙓GSarcfhPaej`䇃cؙ^Ǟfl`b憁cޚDƜghem㇄eI՝cㅄn턙swNNjh턆hk횞r}w_ij퇀hb昘y󄇕uJIchl嚄x_Nxzk끁hd嘙VPAfqꆄlfh󞛜UQTayc凃`hY ٘dalf熀aۛF͟zoga憇gJ؝|jg훚m퇛yÅrVLkoℇo텞s􄃒|CRnhlᘞq񄆔qtEbjhm|GMWpdkꁀkdSXE{vieSRZaqbghϞVћdeh`燀`ؘYΙzbfbㆆ`F|iei⇅{DžuUtnc텄n텞||L[ikji⛟|񄁖~uZl醀`ᘛyHNJfj聀l䚄eR@]xrj儁gPREgso懃ah𞛜^UfcᇃmkΙZڙdc`bㆀcٚM˟{ie蘞l톇gKܝpkghx􄃙}\Dkoj~IWnkc㘙e|XGc膀b䛅e儅IYWpeꁁk䅆`⅙^@e넝Xh[q񘇙EޝL遄P`iaMkm r`䇁omꄙUK{똔zq[ulej聇mqNoz蚛hg~ݟZm`酄k酟{d]ߟmh臁mee^Ғaaᘛd億rTX@zn的f煘Yԅusu焁`j瘞M߅JCimoBąY|sno㇀oj˛upfdnottm}jarǜGle녅넞e򄃟xWWcmꄇn蚟{dXܝ`ja혙g凇}RT]dc`w՚Cupkㄆc曞MׅNpAj⇁mn噙uąG}uon솃ho򙅟qs{fniq󙘑pck遇m|˟Mlyꚛꆘgxܟ_maꄄkg冃dSݜaha蛟g䇆eR\Ugf⛚c}њEN~nᅇm⅙uڅwsOlhu΄v}Nn㇀nlq􅄕Ersllkk򚇟ypf{n쁁l󅀙|򞘓Hb}k醅`gkΟXmf腅ꄞg凃fޙTٙ`lm障dg֚Sǜff☘a懄֚DR{ccᅘJ؅tuJbᛞK̄}vDj쇀no噘wLqKnn퇀hi󘄟v^txdh遁i񅆙r𞘑CRapj醄l򅀙yj_b{ꅚꇙfdݞ֘a`ndgVQŜgnfa燇ySDНef⛅cㄚs֚IGwl턇l⅞tDžpwZk퇁on癙uτJpMikhlpEpsak醀j󚇞|MUdrꁆiy򞙒CS`pꆚcdkɞPcfꅄj`燃aәٟao`ꚜcᆁfқ_۝fkd웛mㆄ{DžB_~b⅄o섙sͅvNMj섆oh㛞qȄp}Yhk퇀hm嘛r󄇕Bqvln醀o嚄{Pwzyk끁kdTE\`sꁅcgkT]aeꅅ`凃`řRژfcla燀`ŚGϟzhgcᇇdۅuݝ~a⚅csDžpYMo섆m㚟p|J^k쇁no瘘tqtEnh膃kl|@Irdk끀kxTA[es끇oz򞘝_RfqcdhȞSݛggi`燀aؘ[Ÿxlg뛜bf؅Cŝ~jd웛my؅u\wjm텇n텞p˄sJ_hjnnp}w\l膃km噛~󄄕MOwfjꁃheNP{rjeE\apl䄀fhVWg{cᇃbęS۞gcabㆀbۚ@͜en{蛙nↄeؚD֝rgi~΅qFFhohj횟}tSi釀bxvJLcjm䚄{ZOyeꁁf嘙RRZdwn儀`k[Ѕ^f}b燃bi@Ǜdgoa憀b͚Ixmg蛟bↇ`ͅuĝ|hdm㇛z˄rRCkm셇n셞}~MRnkl㘞|󇁔}LVl놀b䘚xBEOgjꁀjkg䚙X\Dyqkf]ԅLfKo燃`iZޚe{h`ᇃcF˙{cfbcۚL˜sieoↅe˄vҜKiahx~^Tnh釆knr􄀑KWbꇀc昘uMNal䛄gGZX}s愁a]SNeJhᇀciYօWgskmmjϙB͛ggcm큀mLʟ~mxo솇`υJ؜vod隅j釘z}\Anm鄇jy󄃓~BQl臁c훞e|M^b놀`ᛅg䄅tRVveh䅆c暙[UCyth焀bk噙O߅Feto㇃biCDže{ncↃoJx`dl톆mȅwȜsnz雛i쇚d􅃘|ܜ@l`ke\Пljkmz{ZԒb뇁`dqTUAdo煄a煘@ԚBrv䄁a䘙E݅N{IicnNDžXyshmoj˘tsgfm큁m˅v˟vb{뛞i톄f˅qĜHmdk鄙~􅃞UPll뇆i蚜ze]Вc`☙z}\Xacᛅf䄛I_^Isk慇`ᛞEVOxMchG߅[eJko㇃li񘄞N˅x{`ooʚq󙘑pcxn遇b񅁙}Üplx뚛j釛g󄃙yМZl`脇ꄟdgX֜bhꇆ`雟gzY֒cf㛛a懅sW_F{o慇`ᅙ@ЅIrN㇁lk瘙OO{Mn퇃lo򙚝u΅Syol솃nk񛇞qsgen쁆n}󞘒tb{蛙ha򄃘{jƟGbf酅넞efVߙclhkᙜ~솇冇oegiQh昝聚J{cu‡l☒qwh]f蘐YkcTƚus]leݒg~mg~b̞҇HpyEcᄀml䘛񄇕MwLahihx\Kyxj聁ieOYgvldk_fxa凃fj\љfcma熀`ԛ^ǜeodcᇇd߅[֝~f욅n쇛}t[thn℆h횟qʄ}N^n醁hlᘙ}􄆔ptFo놃km{Yt|gk끀jeCXg|idEPasb䇂`h˞RܛaficᆃcٛF͞glf雜mㆁfƚBƝdhem퇅x̅qQpkb셄o셞}˄yK_hho⛟}񇀖suZi醀ib嘚xO@t`聃jne[F^z聆i򅁟eTRBdpb儀ai󞛜E֚gy`䇃bj˜Aɛeccc憀aؚNȜ~ngc懄eÅvٜphf욅n섘p…r\Zii섇nj욟p|Oԝojc􄇔KHXaꆃm䛅zGHTv{jdE@zti儀di䙘K GcjKj솄〄i煆djƟVtsbl…\f蚒CihUdgtTndꚛf􅀙p֜[cbꄟdeE֜`kꇁbd~EՒg`g焅v[SLyoᅇbᅙOՅI|K㇁mj䙞OޅtyHhk㇃loKʅ]y~mi톃ih򛇞v񛛔razn遁o񅁙}um|醅a󄃘~ĜClf酅넞edUWcl뇆l뚜f冀g\ݝcf혙a䇇yV\]fb暄cw߅MtwjᄆbHu|Mj⇀ol噘tG}shn㇃ons񚅕Vqdfo솀i񅆙ptbn솇aClyꚚ臘gdkŞSbc넇hꅟegԘS؟akad円{ԛ]Ւdj`ᘚf焅r҅OFrnᅇ`u؅pJZjᄁbh噙BۅKrLhh쇃iouɅR}scihk򚇞p󘘗tUg~hl`񞘜xOhGoKk曙eIhHΞ 耚aa癙|Aքk聅Orj|o훞bi脁cb遁lCGτ`wdx󄆕|WCےccᚅg焚tP[N|h煇a皞DЅt}Cᄁch噙LÄL~No㇃notW|bo톀nq󘘗vaykcɅs񞘝Nbk醚gxjğ]ogꄄ넟z򇃝eVӟcibdxZҒ`a㘛g億s\_^el暄`ᅙHЅBvNb昞LӅI|Ek⇀loMŅR~qlnnh񛄞wrgdh遁o|򞙐vcp聄cyœBm{뇙dzӞ՞lmꇇog净d]Uۜaga燇SWWd`aᄛv݅CuqiㄆluۅwsMh㇀no䘙q̄B}wii톃iosPs{`oh򘘑vUc~h聇o{Ob~ꚛk臘agjĞQbfj녜g凃f֘Vٟ`i`d准dӚ[ŝgja㛛aᄅҚ@En{嘟akueaxÆo⛝eOT冄fꛐYhc֚ښ쀅[xq`j΅}qeO o텙K{b끇jՇk뛖L 兛CGf wꁇm񅀙zWPXgrm凃ahʟ]՛gzic懃`ژYÞfbfcaћ[Ü~ieo퇅zĚJԝrhc셄i섙}˄rADnkhi훟񄀑N[lkb昘{INJa끃l嚄d兛E@Vxf瘙QZ@dvn儀ah𞛜^՚Ufyc懃bhAƘeabcㆀbΚJϟxne뛟lↇfÅw۝shgneɄ|՟Ghoh~~CPnjmzpCEb醀jc䛅e儅OGSpdk兇f盙GQMevk䄀fkGQ[dtm䄃`iʞFƚxeic懀`ژF~bfl톆c…uΟrleo⇅yƅpלOocks˄x^Пo쇁ko웞񄁖sIRb臀c昛zOAVDfꁀie䚘ZRBsq䄁a噙RSYeuo懃`h^ߚSehmᇃbjϙMɘzafmㆁm˅Jɜ|bx뛞i솄fʅsڜwogk釙x􄃞WEbo鄆ky󇀐zGVlꆀ`☙g򄇕qEDab䛄d䅛MX]qj焆`盞p_`CT솄o{gi[iᛜꀅu}otb옒{Jƅ~@Ae݅c` ۅ]genlᇃaŘC˘{cfl`Nix뛙n톄gŚHۜtifh{}^Ymi鄆iy󇀑yATb놀cᙙyqLAaꁃm䚄d兛G^P}}焆g䘞RSOeJhᇀ`hG܅]eqjmㆃlhʙCۘdgcl큀o͛HΟyoeꚟn`ʅvrneh釛e񄃙yTOibj腟zeETok뇁c옞d}L\c醀`ᛅg䄅uXteo慇a皙DׅBxt愁cj䘙G܅Cevo焀bo@ͅedimㆃo˛v}cdl톆bɅruoz蛘og􅃙|jǟOna酄k섞zQџli脆n훟~d^גcꆀ`xs\PAdꆀm䚄g䅘Mׅ@ss䄆a䘙[҅NxAkbiA݅R~wkmbkΙu|gal솁l̚w񞘐vTl|h`r͜Jle蚅ke񄃞~՟\lm脇k酟xdEݝ`ꇁ`☞e|]Pfcᛅf焚w][Hph愆`ᚙYQLyM㄁bh垙XӅD{vn솃lo󙅜t͚Wy{bo솃i󅆙ps`xil󄀙}vlꛘjꆚf򄃙xӜGo`腄넟ed\Ԝmnꇆc雟ee^Ւaa⛛`燄sWRMemᅄbᅘKњtC |hꆄߟQjK|DQbs^}duE凇k횟bfwnㆁo`䙞TuPawj끅mgkU_`zd凃fؙXglꄇma䇀`ܛXŸdigcᇇeƅOߝ|`㚅mㄛ}ÅrXOji℆mwɄNPh쇁nl昙r󇆔wwLok醀jopGO}gh遀jj{R@Pesꁇoe󟙒P\Sfpb䇃fkUߛfgi`净fߘ_̞elgꛜm憆gߚ@ŝ}hebxޅH^wkmⅇn셞r̄}N]hnn㘞p􄁖sJ\n釀jb䘚|BuJfj끃i{@]eshdZ_fvo儀fk˟]g{b憃cÙ]e``mㆁ`ƚFzhe雙o톄dŅMѝ}ha텅h|υqELjihk횟yuRi놁jbᘙy򄇕uHCmjꁃm䛄e党[DQ}{d䛙R_Fgsh焀ak[ՅRg}b懃bhəFdeiz톆癟Pj{k lo燚j뀅wwgyhᅙaPlEXbVcWh΅큛hg㛛adϚI]xkc⚄l턙p̈́wtNhh섆kk훞sȄwqFihm瘘|󄇕Nwubk醃oy\HyekꁁjdM_grl儀gk𞛜Xa{Ꚛc凃ahș[ۘf`lcㆀcӘGŸdod蛟mㆇfŅKޝxjf횚l턛~څq^Hnℇi}|M\i퇁im򇁔qH^ojkmyOCpgj聀h򅇟{囙]^A{rnzYWRfpcfhYۅgdka䇃`ڛLʙelfꚜ`ᆁfښIǜ~idl⇅y؅tԝqkc텄nrτrGShjji⛟pstTlkc昛JNua놀ndR@YpkdT^^dtl䄀`h󞛜^WUd|jb燃aØ_˜ff`bcӛZɟ~nz뛞n⇄dŚw؜qifh쇘q_Anoh욟ʄruWn膀jc㘙x䆆{stVGiSTqfžbtmfu灇f}alZjD}a|i䛞aBp郃oRVt⇅mvdhdlm憂on~򚅔~{alㆀo񅆙}󙘑KU`{nb򅀞zʟIl{뚛臘gejĞWmc넇j腟zgT؟ahc혟g䆆dU]גgaᛚaᄅqݚOFri煇aᚙF܅uqB㄁mh䙞M؅HrGkh⇀noH\srmnnju𘘗uVg{h遆l􅁘p񞘒CUm|j膅a|ޜEcg년gdՙџalm蛜g凁fPUݝdf혘a懄|VYZ`⅄ctӅHwOjㄆm昞Ku|Zkk퇀noJɄG}qon솃hnq𚚔v{dhh񅆞ub|聄mxjH`{녅agߞUbbꄇnꅜf凃gPPߝaifc憆{U^ӝea⚅mr߅NMvo턇l㚞uĄpqEooᘙvv}Bhi쇀hlp񅅕^q~ah醀h򚇞NQdk聇oz😒FSaꛘjꆛcfh̞ԛ`gꅄjf凃`ژRžgicg凁g֚[ޝekf훘`懅}ӅNQsc⅄bㅙwpNA℆nkᘞvɄsu]ij퇀oos񄇕Nwubhhh𛇞pHVzz끁i򅁞xBYfsꆅmekʟ؅Xbfegdxe憅]ndwhΆUuꆀ\|ixKn߅ ӇbIuMosdn{雞m焄pօpk񞚞ehjMᚒ_ 冄eśXJ qnn煇`⅙|ʄvu@kmkᘞ}􄁑ttGhhm}Bpvbhhh󚇟}QKSeyko󅁞zD_fs놅cdkPԚazꅅgajڙSǙfbmꚜa䇀gЛ[Ĝdig옙`懄xޅA֒~ja⚅n턘}څvGAhk℆o⚞uτ|wZi섁il噘tȄNvBmjkor򅚕SKe끀k{M^dqie񟘝[TfraahəQјaao`燀`ۘ[fog뛟lㆆgӛG۝vc䙛mjda넘njcsʜokmszsl`W՞d聇IrS}dFf|燙m臘Vbɞvfls̅MwǜkaᇁTdbdљ ZpBo臁nh񘄞t󅚕Ruxdk聁i󅆞y@]gr끄lej񞛟X`yfgj۞Tјfcig燃gԘP؜fnd蛟`燆xV^גdf⛚msхHEvjnℇn텞vڅqp@h℁on昙uɄvqOoj膀hlp˅Yw|ch遀kk~KVg끆neLT`rbgh̟Vcf년j`䇃cߘRĞala뚜`憁gܚEĝdjg훘m㇄yڅLRsbㅄo}̅sLFkj℆nh㛞s􄀐}u[ij퇀kb昘|Lwwbiiie RFSeyksɜԅisphagtcBrۛ`~ꁅ[{mHainօo~蘟cぇ`yÝ}ndo쇛x􄃞yRXimh욟}d_ԝo釁jb☙{GY`膀c盅d儅@[_u~jd暙EUO~Jj䄁fkEЅB~toᇃbi񙅟M~zobl͛H}ceo톆`ȅu̜poy뛘nd֜Cla脄j酞{{]Tbiꇁl웟e󄁗|CT``ᘛeuDHfl的f䅘D\[svᄁb䘙\QLzKh㇀lnBۅPdrin㇃ljΘG~cgooȅuso|j遄aqŜwne蚅j뇙e󄂞zW^ln섇ji腟{e_Tm`훙d|_^ac暅`愚t֚Avk慆c㚞LӅJLh愀bn䙘H…ByulↃno򘅟u˚|ebmos򙘖tb{n솇brȜwle蛛k醛dyٟ_mc酄j酟zdTşchꇁjb혟gz\TԒa`ᘛf焅v՚@O|n慇`ᅙMЅuqNᄁcj䙙@مu~Milo򞚜L΅^rooↃok񚇙w󛛔wgeno􅁙r𞘓MQbk醅f|ڜAbdꅅ脞{󄃜eVS ÛhfXc셜jk͘Ç~eedvfrᅝlYkPPwfi]e冃JdcxhL n采ij䘙Lz[Yk놀jm噛sMtImhꁃoeSJTzjd噙TFYfqofh\Qf~b燃`k̙X٘fabcbۚLŸeie뛞bㆇdޚu؜|g욅l⇛ͅq_Nknℇn횞r񇃒yBQh퇁hmᘙ|󇆔}LEl醀hl~CFVvdꁀjje䚙SE[dphej\W\grb燃ahϞAܚedia懃cŘLΙzmdmↆaٚ@̜~hel㇅~ƅu՝uhc셄h텞pʄGPnk釁in㘞}ruPl醀c昚zKOMaꁀizY[Y|rjdS]@euo焀fh񞚞Vњf}kc燃cǙ^eaamcߛG̜xie뛙i톄gɅN؜wiak~􅃙}EFhnky|LQl釁c{tC@mjꆀb䛅g䄚FCQpe兆f䘙R^Fevk焀`h^Ѕ[esmᇃciCdfmlↀl͚t~mdꛜo톇c̅qɟsidne񄂙UInl텇n~򄃒z]Vljm훞e|CPb놀b䘚d凅KZVIe놀i兇aᅙCSFywj䄁`j䘙]UMxuo䇀`n񞚜Cښ{|ic懃mɛtx`dmㆁb̚w}mz雘o솅e΅vޜKnfk脞y񄃟~_Slhjiy{FӒlꇁc{v\T^fh𙄜pUӄc훝WXco뀃`섇o 񘛖rwm曙䆇aColׇ|wG冀koGHanov񞘑tPa|j聇m~ȜHb{뚚ꆘfzjڟQcb넇j녜fgW֝ahag准{_WՒda㘚a愚s՚YLrnl⅞KمuqLjni昞K…JpMhjnoqDrrmh聃ij󛇟paxh遆oy󟙒KTbx뛘jcejEbg년ꄟg凂fәUޞcnc뚜f熀gW]ٝajf㘙cᇄܚDRdbㅄbㄘwąqKukㄆmjẅ́r}[kj퇀nm䙘qGsviini𛄟WJedkn򅆞xLS`}j醄`~j[`z뚚ꇙdfkƞRט`cnꅜfaјY̟gkf`䇇xКGݒx`㛅a焚qۅtDwnㅇl㚞OąsuXk℁lo晙u΄uqEnk쇃hlpʅTqsgk聀k~wTe|k끇n򅁙{񟘝BPar`ekƟQffꅅjf䇃aTQ۞dnfꚟb憁gЛXٝehdbyޚH_}miᅇgo鄒eKdH끀iㄇXLUL~fl`eAh̙M``kNc^瀇zskᄆcN\fto焀`i󞛟QTfxb燃`jǙ]řg`cc憀bAΜehe蛞o솇g…Kޝ|h`⛚i~r^uhnh|xM_nkc~vtZbj膀m囅dACseꁀjf䛙SSFevn焀`h_U\gqb凃`hʙ^ڛzdl`憀b̛Kxmdꛜlㆆ`…tȟshe雛n⇚yυsלOnbo텟|{ZQokko㘞~|EPb臀kb䘚BCHgꁀn䅇d]ZZ|tj䄁aWTFeJo愀`i񟚟PҚT{ykbbƙDΘ~cfmㆁcDž@l{뛙ogͅwߝpnfhxxY[ln釆i~xMPc臀a☙{qC@fm盅gC_Rr}j񅆞|gh~waqfBfƛۄad̛bmgfrd၄euSzh`憂ioszgec䇁d򚄔؄wb녜zccomؘ[soe雙l솅e…uќti`텄i섞|˄rD^ihkh훟q􄀑AWm뇀cᘘ}򄇕tNBaꁃoeDCRr}d嘙^S[dHi焀`h[ޅfqbᇃck̙@ǘea`l톀oBxm{ꛞl톇a͚uڜvndid}֟Dnmje򄃒yDSo뇁c⛞z|B_c놀`e䄅tZQveh煇a皙EQLywj儀`jGޅZdvlᇀli񙅞G{xnoiՙPɞv@oIfn@dl녜v̄oxTd\cM⇟Hl臛j˙cjc셄c皞fIf^na\Tjc넄hq֛BUaykzaT⅞jm⚇c⅞eNDmhmᘙ~sL@ojꁀb盅e儅GAqejjf䛙_]EdsiakZQEdpm懃coL؛egobbMʞemg뛟m쁆mvÜ~hdn쇚e΅vUIic셄ny~ERn섆ho훟yyN\oꆀc昛evDUufꁀn兇d煘AEE~pkd^ՅMeul儀gi[مTejm憃bj̘Ozfambǚt񞘓|nz蛞n톄eƅvĜIi`ⅅi鄙~Ʌp[XlihkyNTb臁jbᘘyv@Y`ꆀb䛄d兛EAq兆g嘙RVM{Kh焀ahXօSdvm懃bi񙄙Fƛ{{blↀlϚwb{n솇`͚wΜ}le隚ieʄ}՜Okc脇j腟eyYVmj뇁b혞x~@Rbꆀ`ᛚa䄅KPRHen煇cᅙXRM{u焁`噞GׅLeHiↃbotVx~nmↃoțu~cgo쁁mυprmz雙ha񄃘}ĜKnaj脞eeWPln臆oexXԓmꆀ`e凇}Q]E`o囄d煛LՅvD{o·j뚑Ghtܞ憅\br~`񚆘MΟ[䄇j腝儘\`ci~lↀoa瘞u`qkczj󞘜[c{뚚ꇘg򄃟ejڞWИacꄇhꅜd净fҘXşgi`옟f憆eWYӒzf훚b愚vمJ^wnl㚞LхqKEj㄁inᘙuttZih퇀nls 񅄕Euq`h醀h󚆙sqTe}끆n񅀙y񟘓DQ`s`ek̟S`djagәڞfm`뚜`燁fҚYݒghem㇄~ؚH_rkcㅄl⅙vƅqJJkj턆hk⛞urqZn쇀im䘛rBqtbh醃jntzzjꁁkgAW`qlgkR`b凂`kϙ\ؘaclc憀`ܛEĜgid雞meۅMНxg횅l퇛DžqFun`酒Ƅn⅞PRToi䘞Ɇo~n臙~[f⇞ꁘrrzr 䇙hᅞWtj񛄜򛚕qTu }mᇁnmꀅmXchIB]fzh𚁙v𞙐FVc}bekʟYlzꅅf凃fߙ֞fblꅜg䇀f՘Pڝfhgc懇dҚDђya⚅lㄛsŅu@vi턆n⚟w̄rqEk℁imᘘvvvLnhhl|򅅕]t~fi遀h{NTf}j끇od󞘝Ec~`fhΙRܛaaif`؛]Þai`雟a燆dҚAŝza㛛`}ޅKYqjmⅇl텞vÅ}KXk℆onwτpqXnj쇀ilpMuw`h醀kk󚇟|MVekv^k噜いWfmvo홖NntijdVv넝΄ꆟpgscᅞgi퇇heaÚv˞fm~ir՘zaqmٞibjb⛙`ↆcś^ђzf훚c㇚|ŅHYwlㅇb⅞rʄ}L\j⇁nnᘞvpwGnhmrFwpch遀jhyQBVe|j끆idU_\`pꆚcgk]֚ggꅅg凃fޙRƙebb蛜f䇁fߚXŜdjdb{ۚNUr`횄lℙsͅvIGhj턆oj㛟r΄pJ^nim癘}ʄArNb膃jn~Vt}xj끁kzUAEdwldj񞛜W[a|b䇃`jۙ֙gambᆀc؛GŸeld蛞lↇfۚ@ޝ~hdn퇛~ƅv^vklh}􄃝}M^ihmᘙr񄆔wt[nj놃jb嘅xDIsfjeW[Ygpif]S]frm䄃fiYٚgghcmśMΙ{lgꛜbↆcٚN̜{idm⇅eÅwUqkb⅄l섞~ʄ}BEij쇆ii㛟r񄀖~IRn醃jc昘zwOK`j醀oy兘DE[}jꁆkd\ՅLewlfh]ךTg|c䇃bkϙDϘzfc`ᆁcޛA~odl톄dąt؜vha횅i섘}DžwEFoni욟||Mӝo釁kcyvB^cꆀm囅e[MWvzj兆d[Bxtk䄁ak\]\ewlᇃchȞDٛeembㆃbÚNemen솆`Åw͜ri{蚛n퇚e˅pUvobjyMRlk뇁jl☟~󄁔yL]b膀c昛g凄JDIfi兇a煘ZSGrq愁a噞YWOeui`n𞛜MڅdxhbljNʘ{`ab톁m̅tʟ~nx蛙o톅frۜuhaj鄞{󄂟x_Rnnjh훟zzYԒn臁`㘙zp^T[`f텄o 䅚wFnńj☓szٙ`wofC̙၄d~`oVIwarl㛝RqRkGhg⇀dcmamTmmR}gkꁁp𙘐OAf~ꁄb{ϟXayadޞܘg`ꄇnꅜa凃gU]ğehe뛞c燇{T\֒{ja횅bㄛsDžJAtjiℇo⚞pqtFi쇁hl晞vuqDnkmpZv}dh遀jJSgs聇n{򟙒DQcrb凃ghΞWaa녅ha燃aޙ_ݟflaꚜcaߚ[ܒdjdm⇅~҅BVsjb⅄o섙sȄ}KBh⇁hh⛞rrvYhjkm䙛|򄇕IKHmikn{PCQzyh聁kfE_fplfh󙚟PՅaxf凃`jSĘdclꚝaᆀcښ@̜zngbㆄetܝsk`⚅bㄘqƅpEMki섆n⚟vτ|NTnkm昙p񄆔wH[mj膀jlrDAPsdjꁀkxQ_EgqneT\]grb凃fkϞ]ӛddn`懀b؛ZÞylg뛟bㆆfߚBٝrkz雛l⇚yt]Iim셄i텞rrIPnknssuZl醀b瘚yCOufꁀie嚘_ARerkgDXdvo焃ahUךfzkc憂`ژFǞd`amㆁ`ښLʟ~hz蛙n톄g̅tѝvjf酅iʄ|E[hj턆hh|򄀑{ITn釁c~wOM`ꆀl囄e党BZ]px兆f嘙^PBxqh焀`hY݅_grm懃mi񘄙@̚{al`憀mIɞ~me뛟mㆇfw͜qhe隚o퇛{}՜@hlk~񄃒zY֜lkly~APb놀b囅~MEVtdhd䚙S\Mvj焁f_хBztl懃`i_ŅUz{hbㆃmƘ[ϙxcgmↆbHÜsoe雘o퇅d΅vҜMhak~~ETli臆joxyL_c`ᘘeuMGfl的dAZ^|qf䘞RTAzIi懀`i򞛜G؅Sdshl㇃lhOțegalↀmÚHnxhc񅀛q؝vne蚅kzQDom鄇k酟zeZԒl뇁`☞z|^TSccᛅf䄚uP_J{i慇b皙B߅N~tj愁bh噘AمFyJobi񙅞N˅Q{ellㆀlw`{nb}qle雛h醚dsԜFobkx󄃒ePҟmk臆l웟e{^Ғc`ᘚd凄p՚^A{o䚄f煙O܅usw愁aZ߅MxMibn󞚜[م_~shmㆃoju}fdo큁m˅tumꛞh`􅀘sڜOog腅j脙zxTQmm넇n隟~eZӝ``㘙d}ZSeb皅f焛tWXvpjᄆbᛞLۅNx@kciLۅEyqhi솃ii𘄞uʚUre`niv𞘑qbkm|umy蚛j臛a{jޟGb`脄j녟zdYӜciꇆa蛟d准e]S֒af㛚`懅qWGGynᅇcㅙt؅J}OlhᘙN̄K}Bh퇃nlvR|mn솀hk򚇙qpfzol􅁙|򞘒Jm|ꛙha򄃞ekŸZld년넞df֙Ҟ`oꇇm障d凁aכWܒ`jf☘d凄~P^Qzbᚄa煘H݅HKIjbᛞBw|Xk㇀mou˄Lpunn솃ni񘄞t˛Twxgio􅆞}HTa}kc󅀙|ȟ[ce뚚ꇙg򅃟eџT`bꄇh녜g净f\Ĝdifa燇dRVђd``ᄚqךBKqoⅇmuz|w~]ta⇞ۇ酞wTZkEKj⚞{䛙NDŽueHi䄀ai󞛜AÅS{}hi遂bәVϘdm~oc[̀zle冂ljwΞgcfccŚO~o{蛙n솅fυw֝vnai|΄^Zoiox򄀑~B\n놀jcᘘdvLC`jog煛FER䄆f䘙\Q@ewi懀`nZКRgbᇃmkəLϛefbcↀm…t|le뛟o솇aȅwvnf욅nerQEno섇h酟{󄃓{Xԝlc㘙yAVb놀c䛅d䄅Iv{j兆g皙[VM}tk䄁ajX߅G~vb䇀mnL{{obᇀlɛH񘘗yaeo톆cɅwȜqozne˅sќMoch{y]ןlk釆jo웟y~Zגcꆀ`ᘛeqXVEgl皇d煘F^E|t䄁g嘙XTFeNiᄀch󙚜CDž\xrho톃ljɘOΘzfgo솁mʅp|b|hgƅpƜvngj臙e~VXlbꄇh{{@גcja훙g|_U^ab暅`焚IS_p}k煆`暙AօL~Hjᇀbi噘A܅A~vjn솃nn𙅞uʅ{bo톀ns󙘑r`zk聇b|ɟtle隚ia򄂞zj؟@lcj腟de]Ӝmk뇁b옟de]TՒcꆀag䄅sT@D{l慄`ᅙLӅIqKᄁbj䙞ḮOMi㇃louɅYy|ooㆀojw󛛗sfdomʅr𞘓Jcyꛙh`񄃙yß[bf酅脞edWҞco넆oezYٝf`d凄rXUYeb暄aᄛBօMtw慆c曞FׅI}Gj㇀lnODžZ}win퇃li𘄞q~zfhoʚv󞘑pUa}h聇`񅀙ʜKbygxҞWm`h녜egXߜahaa䇆zSVԒgf㚚bsWYM}oㅇmㅙJ߅wqJ⇁onᘞw„K}Kkj퇃nlv􅄕Sr~ln遃kj󚇟ysTfxh끆o񅁞~񞙒Nm~Ꚙj놚aekßYmf腄ꄟgf٘Rٞ`n뇆c蚜f䆁gT\ٝgg훘aᇄ{UCTybbvۅuuKjmjᛞẅ́vpFj㇀lm噛qMsvnnhn|Rueehh󅁞~O_`skb󄀞{j˟Ya{뚅ꇙgzџҘacnꅜgfטPƜgia옞g燇xSY֒{j`㚅btךKDHk慆m⚞J߅IvXh㄁ln癙vτHq@nj쇀nor󅅔Qu}fh醀i𚆙|IUd}끇m󅀘|GT`}cdkQadha燃g֙T؟flf뚜`憆gњEޝfjd웘l㇅~ܚNVjbⅇl⅙vDžqKOk쇁nhs̈́wwGiim噛r񄄕@qqbh醃jieU@Veyh끆kg@\cvmdjT\`{`憂aĘDęfbbꚜa憀`ӚDdkgcㆇeޅLѝyk`㚅l턘̈́wEHjk℆i횞}|H_ikm癙yuNLniklZCW|gh遁k~UGFgqoe😒R]]f}`䇃fk^ܛgfna䇃aۛ@Ξeog蛟c憆eКBĜxkg훚m⇚ąw՜wioㅇo셞r̄CRi쇁nn㘞pqvSlhlsCHvfjꁀjk{TC^zskzY_gtm儃ahRRfxhb懃cØZǞdcacaߛMϜdnel톄{ؚtםri`텄n섙}΅r@Fikhi|􄀑xO]i膀j`zuIJcj끃ldXGQ~~f瘙R]Dgwn䄀fh򞛜]PTf}m懃`hȘEژgabcmۛOœeod뛟l톇`΅vŝ~jgmz΅}]Mko턇i셟񄃒{ETkkm~sF^m놀c䘚zMEWKdj끀ke䚙R_C~wh`jYՅDewb䇃aiFߚzdhc懃c›uymglↁ`̚tȟ}he雘i퇅eȅvҝwi`o텞rGSokhn혟񄁖Cגc뇀kb癛xuCCgo嚄g兘P@^|q儆a䘙SP@{un焀aiFWz}jlᇃcjΘCțzaambƚMʟ|l{뛞hfʅpqodk釘x|^Doo臆k酜y򄀐eOՒmjc㘞gpLDcb盅g儚N_Yqyj䅆`盞_PB{Jj懀ahDх[dqjoㆃmiLšeell톃lʚJxmeo솆c􅀘rϜ}h{際id{ӟFo`酄酟y򇂝d\לok釁jl훟d{_Wb놀`ᘛgq^POdꁀig慙DUJsqj儁aj瘞@҅IxJiᇃbnHÅRy}imㆃljw}ffbb􅁘r񞘓qmyꛞhg}Llg隅h脞xxWўmn鄆n隟{񄀑~Eߝaa☙dsXR^gb盅a愛FYFtpjᄆa䘞EׅurOkbiAޅGqhi⇃li񘄟uɚzan솀iJs`{jb񅀘vÜube蚚j뇘gҟ[mc脇j腟zdPҜbjcgyXUa`ᛚa焅wRRO|i慆cᅙMхO~Nᄁlh䙙Gم@zui⇀nltȅzyml톃oj񚆘v󘘗rfzio􅀘sʟwby뛘h놅aejMba酅ꄟedU՜bi釆ogd՛Pݒ`f㘘`燄}՛_ZdcᚄctӅJqw愆bᘞK܅w}Aiom噛wɄDswnnↃnn󘄟s򅚔v{fi솁n}NUcj醄a􅀙|˟Dce뚚뇙dd۞Wmm넇n녜geWW؜ak`훞g凇xԚ@Вe`f愚wӚOIqibB݅vv@㄁lo晙KIpBhi퇀iot􅅔}r`in}󙘖vf~kmyJ`ꛘ놛g󄃞ejğ]cfjdgWUޞfoc隟a䇁dPܒakg웘`愅|VYZ~b⅄lㅙtךKvL㇁okwt}Ehj솃hlrE}wlh遃hiwg{kh󅁙x򞙓HQb~ꛞjꁅcgkDcd腅`dޙЙalmꅜa憀aӚ_ڝfg웞c懇y݅AՒea⚅l턛pڅw@uhl⚟p̈́rwXj⇁nl癙s񄆔tqNni톃oor^Lghk񅆞~IVg聇bej󞘜_T`|ꇘafhș]Ԙ`fhꅟg凃aٛQğdia雟`䇆eћF۝xjg훛m}܅tVqm텇lㅞvۅvBGi턁nnᘞpvqDoj쇀ib䘚pDJv`khkuWz끆heZ\fqcdj̟UVgea䇃gЙRgm``燁fؚDehz雘beҚCU}k`⅄l턘q܅tBNkh턆hj횞q„sJ[ihm癘sJttlk醀jl囄zVNzxꁁkeUAYgqi儀fk𞛜U^axc凃`k̙_ؘ`amcᆀcĚA̟ehe蘟mↆgDžJŝxjg횚l퇛{΅w_uknㅇo셟|xM^hnlᘞx򇁗vtZok솃kb䛅zCBqfh遀jkg䚘TF^dsifSEgpcfi^֛feh`燃`ÛH˘emf`ᆁfܚt˟~hel⇅y̅qםuic셄i텞s΅~]Eh턆hh⛟r􄀑sC_ohb昘~HMAaj놀nx_IYr}ꁆje_SDdtlai򞛜RЅd|cᇃakəE{abb懀aߛCʟzo{ꛞoㆇdtܝqhgi섘}ɅsDKhnkj}xMSm臁kb㘙~󄆔pOFcb盅eEAV}zj兆f䛙YZ]gtk䄀`k]ך^dwoᇃmi񙅟Bśgdobb›H˞~ldl톆cɅt͜|ido醚dɅvќukm셄k鄞z{AVnjjm{󄁗|BWo놀adKX\Mfj끀ig煘G՚G|pj允a瘙ZՅFeIo䄀anOޅT~~kbᇃlkBycfbbɅr}i{뛙o톄g…rڜunfh|yV]onjhy򇀐|YԒm臀kbᘙzrDXfꆀb䛅d兛D[Zv|f䘞XׅLxKhᇀ`nZׅP{plᇃbi񙄙G|eblㆀo˚Hl{i솇`qwmeke􄃙|ПElb鄇酟ye[Wbj釁c웞e~BVa`f儅t^VHxn慇b暙@\A{v焁ck䙙G؅Nztn㇀loNƅW|xol톃nu|ceim􅁘q}o~j醅d񅃘}jŜOnfk脞e򄂜eRTli臆oddXҒaꆁa혘a䇇rPQ[gl䚄cCUKqq愆b瘞NޅuNiᇀml䙘Iڅ[yskl㇃mn󘄟tʛ}galↁlr򙘑wb~i솄a…}@le隅h釘d򄃟xўPbok酟{򇃐eQޜmk`혞ex]VTfcᛅa䄅I^ALrh煇b暙GޅqsMbh噙@х[NhnooI΅Qpyboↀo}򘘗v`hlrJc놚`򄃙|ݜ^ba腄edPߟaic蚜fz^Waf⛛a懄r֚_[{mㅄbᅘCUHsN㄁l昞Iޅu|@k⇀iouυRyqli솃kh򛄞s𛛔|fdin񅁙rwbjꁄcyj˟Fbd녅afҞԞbl脇lg净gW؜aꇁf웞fᆇxԛ]Pecᚅbㄛv߅Luqk愇lMŅvpBj㄁ol瘙vτIrHho⇃mo}񅅕\qycnh񚆞NVak醇b󅀞x񟘝Cmy뛛놛fdjǞ Wc`ꄄjꅜefИ^şaia蛟g准eҚ\ߒgf㛚`懅v՚L_qlㅇbuۅsw@liwτvpDhk쇀nmwZtsbh膀hk񛇟q򛛔IWd~醆n󅁞A^gs놅cxj͟Saeꅅfa֙ߞ`l`f凁dTVƜdjg`ᇄeܚCS`텄lㄘq؅HOIh℆o㛟tڅtsEihl䙘pɅBpIlhjn}SKze끀keISapm{_cxꚚa凃ajĞVӘ`b넇n`䇃`ӛWڜfng뛟c熆d߅Gݝeg훚l⇚|DžJXwh慇o셞vruEj쇁noᘞppwLih솃hb嘅[qp`ijkeULPgr遆od_]fp`fhȞPԛ`dfaŘD͙zlaꛝc憁fޚZǜxhg옘mDžJUpkbㅄlℙpÅpC^kj턆mjᘟrruYnhm噘}KMu`h膀jn]LP~yjꁁjeVGYfumgkWԚUdyc懃cj˜SĘd`ma懀`ߛ@̟~ie蛞bㆇdޚ@֒~kfo턘}څvEOhn턇i횟qȄ~w_okb㘙~vuAc醀jl|CN~dk끀jeRE^gsi焀fj\]frc燃ch˞]ЛgdncᆃbĘFϞdlgꛜlㆆcDžLzieo퇅{̅vWvkm⅄ir􄂟|BYkko훞󇁖|I\o釀`昛{tCtfk聀o䅄d兘^E^xsꁆig䘙RՅBgvl儀ahY؅Wgy`懃mDϘ{f`cᆁcƚKsodb톄g…wߜqha욅n섙}ɄxU_kih⚟ryAQo膀bᘙx򄇕vFFc놀b䛄{CE^p~ꁁf䛙^QLyui䄀fh^ׅ[{pm懃`həYܛzdmbbśF̟ymzlㆇa΅NqndkeɅpV@ob셇h셟{NUlh뇁b혟y򄁔|JYb놀`ᘚeHGten煇f嚘_YExtj焁a噙YׅGdsobn񞚟FߚdyimlțNșycgl큁mÅu}ix뛙hgs؜Hhfk~񄂟zR]nn脆nxzETl놀`㘙dsSBaꆀb暄f䅛C_Zp}焁a盙D߅I{Li䄀cnAEesllhK˛~dcl톀mswb{iar̜tnd隚he{ԟ^nm~eRԝm臁`웙z~RVV``曅f䄅KTZtyh䅇a䛙ZQKrBh焁`k\ԚF{Hoᇃln򙅟J̚~xblㆃl̛Mʙ}axoluΜubx뛘i퇅g񄃘|ќLoa腄j鄞x󄃝e[U`h臆l{~E֒aag億r_TBdl慄a慘@RGqtᄁc昞G҅IxKh㇃mnJ…^xson톃nh񘄞w񚚗sdginpwlrk醄c|Ood酅ddQTlm脇i腟edRҝcꇁa훙f䇆y]V_f`ᛅ`ᄛsӅCu~i慆bLمu|Lᄁlo瘘L„J|ukn⇃olw􅅔Tr{co솀n񅆙r󘘖wcnm񅁙xMmx뚛膛fejQl`넄ꄟdfјٟckꇁce{TRߝfaf儅wQGZn慇aHЅuvCᄁcj䘙AڅurGk㇀loKʅG}rml톃ikwvgzn솆lp񟘓L_`|k醅c󅀞zZceꅅꄞdgЙ՟aml蚜deQPŜfjf웙a䇄TR]e`㚅m慘JօBJtkㄆlᛞKƄw~Gk쇀no䙘tɅJ~Koi솃inpWsddk遀ks򙘑tUasj聇m򄀙xLmyꚛadjڟVbcꄇif憃`טQ؜`if雞a燆d֛\ܝgf훚l}NYsol⅙uƄvqAj㄁nnᘞtȄwrCki쇀im}Es}`i醀kk{ud~j끆oe򞙓CTa~ꛙ놚`dkɟQԛ`f년efߘ]Ǟfob障a燁gК[Ŝeg혘`燄܅ITrb`qpFLj턆l昞B̄|w_jj퇀il嘘qutuli솃kn}]IUxzhh򅁟{D[apj聄c򄀙xj\a~ffٞWܙgalg净a՘\Ɯeng雞`ᆇdӛ]T{kf욅lℛ|ÅOBIknℇo⚞vτss\hko昙vtpFokkm|򅅕\u}fk끀x囙WBRdrꁇhz󟘒Mfsc䇃gk̞RԘfgia憃bؘ[ždlfꛜcᆁfܛZ۝ejdl㇅xDžI]qb텄iqʄqNEkkhn웞}񇀖rtRn쇁jc昛|Ouqbh遀jne兛Y@Weyjꁁid]X[dvmak]ԅQfxa䇃cǙX͘ecbaᆀbۚuΟznd`ᇄdKН}ja횅l턘|rFDki섆h⚞}~LQihbᙙ|pMGlkkoxECQrxj끁jzP[Ceuꆄodj򞘒VVYdrb燃akĞVޛeeo`cޘEΞ{ldꛟba[ߝ}heo⇚z…tSLhm섇irʄ|ORnj臁jo㘞x򄁗rJXmꆀb嘛yGuugjꁀie䚘]A[ypj愁fR]Zdwl燃ah\Ӛd{kcbǘG™eaflcٛM͜n{뛙hfɅw֝phfhx􄂞rYDiikix~A_njczvAF`ꆀm的d䅛FV_|䄁f䘙ZׅMeth愀`hD܅_zrc懃bkȘM Λefm`ㆀoȚuxoel솇`ȅprigixsSDon턇i{G՝o釁jm㘞y|ZP`膀b䘅eK_YHzh兇e囙^PO|Kj䄁fX߅Fdvlᇀbhɞ\{{ncmțL˙~`dlↆ`…uɜsox뛘igs֜Mn`酄j鄞y}Y՜lhꇆoe~FTaazq@Mgo䚄f慛L\Grv焁f䙞XUIxLnᇀciE݅RephlㆃlhOΛyafl쁀lšt|myh`􅀘rŜpodj臘d󄃞xԟ^mm鄇jk酟ee\՝m놁`훙g准E\`c盅a焚I]Stxk煆`曞O҅HxHk㇁bhN؅AztoↃoo򘅟Jʅ|zml톀nt󘘖sbdꛜom}tmx蚛ig󄃞{ߟXl`酄k腟{dԘџmhꇆl⛟x{SWߒ``ᘛg䇅rQ]@zl慇g煘LӅHsK焁`瘞NÄt~IiᇃmnJ΅PysnoↃojKpgdhbΚp񞘐Klj膅f􅀙Gld녅脞zxVUbl뇆n蚟deSҝ``㘙g|PR\dbᚅa愛NԅBKvjᄆb曞Aԅu}FbnCޅExtih쇃nn򘄞Oɚ}eaon񚆞}𙙑w`~kb~NoxꚚa{џQm`넇kdd\ߜmkꇁcf熆ePדag㛚`ᄅqTZM}nmㅙJ݅usBㄆlk䙙t„Jruk쇀ilv^prlo솀hk}Jfeio򅀙z򞘒Ob|ꛙhaekΟ]bgꅅꄟd凃gԙОcll雟e冁fW\؝ff⛘aᇄzߚE]zmᅄcqЅHKMjb曞HqrFkj쇀olwIvtnh쇀now񚚕RK{dni􅆞}򞘑IP`|j聄m񅀙~ɜXcxꚚ뇙fejޞי``nꅜgaV^Ɯgkfa䇆xԚXVxja㛅b愚wхFMwjnㅇm曞IۅuvDj퇁no癙ẗ́HqCnkklp\w~ai끀k򚆞rtd끆n򅀙~󞘒KmrbdkǟPbdjg凃f֘WĞ`laꚜ`ᆁgԛ\۝fjd웛`㇅yޚLYxb⅄o⅙pÄpNCjj턆ih㛞p􄀑svXhj쇀hm瘛MvtlnknxRI{zj遁idG]crj膅mghT_`z녅`憃`ۙSݙfmlꅜa憀aћDϟdhg`ᇇeښAߝyja⚅mㄛ}ʄp@Ikiㅇl㛞t~vQk퇀hm昙s􄆔KwZok醀il|BN}gh聀kxFYgsne򞘒Q\\frcfk̙ߛfgig䇀`ěDßdmf蛟`fݚL؝{ig훛l~څtRwjb텇lㅞw…}t_hinᘞsqv^o醀km򄄕Zqq`kh~TuSxs끆kd[Rgwl儃gkS՚ayc憃c\ߞfc`bㆁcۛBϜdo{蛘l톄d̅KԒ|kf셄h}˅sFAjh섆kk욟~񄀐uSnc|񄇕wNLok끀m䚄e_@QyeꀁeVEFdpighXօQg}c燃ch̙AǛegm`ㆀlšCȞeoe蛟b`ɅKŝhg욅o쇛zͅ|VLhl텇n셟yNRihmrru\m臀mxHtdjꁀhdZRG~qꁇi儁ajSWZevl燃an񞅟Yٚeei`ᇃbN}Umcc_dꚝ醙|Yh`X 嚚nf_em鄓ur懁`[۟u鄁ol晞hcb@d{懞k⇛jhߜh܄zoꇙP`cmㅇb⅞y冃c[upoL~e儘Uj`Chڄʛ|ɄYaTg`eajșāc采b󞙑UC~aaucw㇛l^n_E⇞^dLÅKzHonbi𘅟w񅅕Yq`n톀npKPf~h遇o񅀘p˜IT`~臛fyjޟWca넄ꄟddQ՜aocd䇁e]Tܒgf㛛a燅s݅AXmmㅞu݅uqB⇁oh㘞uمHrZhkilvɅYrvbn遃jh𛇟r𛛗peyk遁i򅁞~򞙐tc}끅b{ßDbxꅅagҞОbmmf憀fWPڜakf훘fᇇx֛XRd`㚅mℛs܅JKwkㄆo㚞qĄvq_j쇀hl昘vupKnnjlrWsfoheKVf}k遇mej񟘝Gb~f凃dj؞Иc`ꄄhꅜg䇀`ݛ]fiafd߅[ڝea㛚crޅO_qomt„st@k℁li晞q􄁗pvAhkilq@Iv`h醀jj󚇞}QNPdyk끆nx񞙒E^av놚bekϟUԚ`egcؘSĞflc뛜`燁fTR۝eig웘bᇄ~՛GUrjc텄l⅙pۅqBEioj㛟wÄqw_ihb癘s񄇔CpNlh聃n|󚚕Sw{聁eUZ]gqnek񟛜Zf}c凃akǞՙaalcᆀ`ܛ_Ɯgid蛞mↆdߚBٝ{kdn퇚|ɄwDtjmi횞q̄pKYjnlᘞ|vuZnijmyCHsfk遀jx囙_F]grꁇh儁gV\]fra凃`i˞ZӚfgh`䇃cۘ@Ιdoa뚜`ᆁ`څMƜ{kd웛bᇅxątWskb텄l⅙r~@^hhni㛟}}I\nkb䘚ruCB`k膀o嚄x^@R|jꁆhe][Xduogh񞛜SךWg}c儃fkϙZ˜d`bcᆁ`ۚG˜}oe雞lㆇduٝqkf욅o턘~ÅsZFhni욟|}HWn釁kbystZclzFFWsxjg囙WZ^eqh儀fjTVRgsb懃`hɞ^ǚgeocl͛LɞzbemㆆfؚI͜yneidʅqUwkbi{񄃝yCSnk釆ko⛞x|I]l놀`昚eKAKfj醀n䅇g煘X^Exrk䄁aYՅDdtm懃ci񞚟AݚexjbmϛN˘x`abↁmΚtoe雙laqޝwia셅n턙r􄃟{\Piihh욟~xCWm臁cᘘxqG_`m䛅dFSYtja盞ZUM{Ki䄀ahXۅBzpm懃`h˙C̛{gbl톀m̚H|bzoↇ`Åu̜tndiz񄂘|Ԝ[omkyeDМlj놁c옞y|M\`c昅{IGw{i䅇g皙EUOt`XW^gtnbn󙚜Hƅd~llㆀmĘI񘛖xceob̅t|lkg􅃘pӜIlg腅脞z{SUli釆od{[Vc놀ad凄sXFgm暄fᅘ@RCwsb昞A݅I~MhmnH_zpko솃oiu~g`b톁n􅁘p򞘐|b{ꛟicrÜJnd隅kd񄃞eן]om鄇jk腟{gRV؜c臁a옞dy]TWa`ᛅa䄚v҅ZH}h慆c暞B܅tOj愁ci噙CĄLyJo㇃mn񙅜t˅S|~ml톀ip󘘖tazibrNmx蛘fܜXba腄酟{򄃝eX֟cnbe~R֒aag儅w[QGxo慄c慙MՅLwJ`瘞NӅLx@k⇀mnOÅRyplo솃okv񛛔}deh遁oq𞘓umsk膄`ڜMbd녅뇞gdUԞmmꇆo腟dd\T۝`jf옙f燇yWXՒg`⚅bwׅFushm㚞LۅtsOj솀no䙙qȄGxthi솀nn򘅜qVsz`on|t`yk遇mx󞘝Bb{蚛놘adjٟPc`脄kd凃`WPfha雟f䇆d՚SӒff㛚`懅}҅FD|n慇cㅙuqqO⇁lhᘞtɄpsLkh퇀ilv񅄕Aprbo톀ijrHWexnos񟘒MR`r놅`󄃞ek͟_ce넞egQޞamm蚜f凁eR_ǜeja㘘`ᇄRWP~bᚄc℘vЅNKAjㄆluÄwq^h쇀no噛vʄLpIoihnw𚚕WJ{dh聁h򅆞|uQfqoy@cagjŞWיc`o`熃a֘_̟ang雞`憆dךEӝgjf횅m㇚݅L[qjoℇl⅞w…pwDk퇁ioᘙp˄wsBnkkm{Zt~fh遀jjyIPg}聇i儀zPZ]arcfk͞WT`fꅄjf熃`ݘ^fm`蛜`憁aޅZejg웘mz…JT}jb⅄oㅙ|ɄpGA⇁ohv􄀑}JYjj쇀nlqNJHmk聃jn[NT{xh醆h{TGXgwmehRQPayagܙ\Řfcma憀`ݛGʟdogcdܚIߝ|ka⚅bℛsvCChiㄆl㚞u}JSnhl晙rutAm놀m}_Iseꁀe囙HPdvhd\ZUgqc䇃fhΞ]ӛ`di``ܘAždbf뛜baؚ@ڝzhdozƅsTvjc셄iυrCDijhn㘞rI[o膀m䘚{IBtak놀ie嚘]CPx}j儁dPYYgql燃`hEWfyjcᇃl͘M̘ecacↁmŚtɟhdl㇄g̅qۜsja횅n턘s}REii섆hk훟ryBםnb昘wOXcj聃lg䅚AERp~ꁁje嘙RYFytngk󞘒FԅSerm懃ci@ÚeglcᆀbǛDxld蛟bgusngo퇛{ÅsVFobn셞}ʄ~@՝m臁kl⛞x󄁗qu]cꆀb瘚dBCHdhd䚙Z@]w儁g_ՅGgwo焀`i_ܚexilㆃbɛIzago큁b̚u͜~o{뚘idrםtng腄h鄞e|ZYni釆jny󇀖xGVmꆀcᘘdt@Ffꆀl的d䅘[[R}}愁c瘞ZUFeHhᇀcnD֚\d|jbmiuțea`mㆀlυqrmyn톄c˅sœwne隅ieן^nokj酟z񄃓zZѝl釁b㘙{|XT]bꆀc䛅g焅tR_Jxj䅇aᚙAЅO|Hh焁akM҅DxNb燃mn󙅜B̅x{lmㆃmΛuradl톆`΅wuo{雘h醚dυpӜEm`腄j腟{񄃝z_ןmh뇆l웟eMђ`a㘛dwY]Ydl暄f䅘GQBvv愁c䘞AՅCxLh㄀loD߅]{qhnↃoh񛄙Oʘ}dgnnϚwrm~haŸNld腅j뇙d񄃞xWWmm뇆ieeZӝ`j`훙g凇^Zfcᚅ`愚LW_v}hᅆmBхLyIjmn瘘OŅMzJko㇃onv˚Vzbli|򙘑r`{hb|vlei釛f󄃞{jǞ_mc鄇j腟ggTМmhcf凁eSQԒgaa懅sVGF~o慇bㅙJޅuwO愁bh癞uu|FhlluʅDs}on톃lj˛w󛛗wgehl􅁙}um~ꛞk膅`}j͟Dbd腅脞edәVٙ`oꇆl隟edVRܝff혙f燄}R_Pdc㚅c煘IхNLujl昞@څwr[j⇀mouŅGunn톃ins񚅕Us{fh遀nsJWa|k聄m󅀙ȟO`~feܞWmangf]ߜ`if雟`燆zYTԒdf㛅csКA@pnl⅞KƅvrC퇁onᘙv„IrOnk퇀hlsPs}bi遀kk~wg{k끆h򅀙~󟙒HT`ꆚcdjΞ_ca년fgݘSڞci뇆c뚜`憁fԛ[ڜgf☘c{݅MVbb⅙q̄pINᄆbjᘞwȄstZk⇀nl嘛}􄇕@qtlhnh𛄟}Heeii򅁞{UMR`p膄bekZa{ad؞Qܘgcoa净aԛEɞghg蛞c燇eUYٝzka㛅cㄛvޅN@uiㄆl⅞tŅtq_h㄁lo昙vɄJsAnjkls򅅕RIrfk끀kMTerꁇn񟘒^Sa}cdhȞW՛agif凃`љRǞdla蚟`ᆆdVR؝dkd웛o⇅ҚOQrkb텇o텞vąrHM퇆in훟}vwFn釀hb|Lww`k끃ieWIPzxjꁆhdXRcsl儃gh񞚟PWfdꅅc憂cEfbc`ᆀbښF͜ehg옙bㆄgƅwߝja텄m턘yʄq@Mjjㄆo횟}񇃐~H\k퇁hm昙x򄆔uJLmh醃jmz_CVrej끀kzSG@gvndk[ՅTf}`儃fkFdfo`憃cۛE̞{lg蛟mᆆgٚKɜykf훚o⇚JTthmⅇo셟rÄ}MQnho㘞ssqSb釀km|I@tg놀jhd嚘PYYxsh儁eQ\Ddwl儃dkʞRݚf{hc懃`ƘA™zbamaښMǝdi{雙o솄e̅p֝sian}ʄ}DEni釆jh|I_o釀kcᘘzvKJ`l嚄g䅛X[S|儁a盙XSYgwn䄀fh[ԅ\dmᇃmh@ƛeamcↀlĚBznd蛟o쁇`΅vڜshdn釛{ȅsSFkok}{ZTnkb㘞xsDYb膀b䛅d焅KDTw{끁jd暙A_@}vh儁`k噙_݅Fepb燃`n𙅜Jǚzenbᆃmǘu~cglↁaÅwʟsn{雘n솅eʅuޜNn`o~z[Vlkhn웟~|MԒm膀`昛ztYCgne䅘AX[sqa瘙_PO{In䄀cn\ԚdrklbhLϘ~dalㆁmšurmxꛞhf΅pĜqlgj臙ey\Xll脆h腜z򄀑eE֝cja훙f}BGcb盅f焚OWZvxk慆cᛞGTI}tjbiZхZxrn톃on𙅞Mυeebo톀o͛umeo솆b}Ȝpo{蚚h醛g󄃙{֟Dlcj녟ddR՜lh臆jm훟g凁yYVT`ꆀaa儅sQ]Fen䅇`ㅙMWI}v焁aj瘞BօN~Hnᇀbou΅S|rnlㆃmu𛛗sffl솁op񞘓tUbz蛞hfrjCng腅h脞{򄃜dTԙlo뇆ne{Fߝaa㘙fpT^Sdbᚄa煛LY^uq煆b昞GЅJpMkᄀbntG|win⇀oi𙅟u}{fnitvV`j聇c񅀙rΜOcx뚚g򄃞~ןXmc넇j녟dfTѝchf雞f准xQ]Wga㛚a焅wUEM~nᅇb᚞N݅N}Lᄁli癙NŅOytji퇃oou􅄔Slnij󚇙s򘘗vTf{k遆n~Lmy뛘kꆅcejDlf腅ꄟegՙUcnꇆmgd՛Vݒ`f⛘`䇄s҅E\eb暄cw߅ttH愁`ᘞtDŽprAh⇀olwȅCqwnn톀ni𛄟r򚚔qdgn쁁n󅁞NUc聄`񅀞xj[ce뚚gfjǙU֙cbꄇn녜deXQƟgjff凇y֛D֒e``㇚p߅ICvnㅇbH؄qwA쇁on䙙Ö́uqBnk쇀ilw\wsajh񚆙sIQd|끇o򅁞{BTcazkPffkggЙQݟflfꚜ`䇆d՛Vݒdg웛bᇅ|T[Z|bⅇoㅙw߅ttCj퇁ikt΄qwDiil嘛Epvbj醀hi򛇟}򛛔WHdzj遁kzB^a|mdk˟Ec{ꅅffڙPҙ`mb`憀aݛ^Ɯdka☙cㆇ{ŅAՒ{a⚅bℛsqAvko횟q΄ps^k퇁imᘙ|JvOlh퇃ilxYN|gj遀heB]asj끇l򄀞{򞘝V]]g~ꛛaghȞPӘffh`憃a٘C͞gof蛟c熆eњFŝjg웚cᄚrŅwPwkm⅄l⅞q΄rAZn섆niᘞv􄁗stYohb䘚sGKqa遃kk򛇟xQG^x}ꁆhdYXfpb儃gkɟWњddja䇃fҙP۞dca`ᆁfӛ[Ɯeh{蛘meąuWsi`텄nrp@@nh턆nj㛞w􄀐uDnjcᘘ|tHJmj膀l䚄e]LWzꁁjgUGXgvn儀fh󞛝VVVa~b燃bk͙Yؘfflc懀bƛC̟dnd蛟lㆇgŅFٝ~kf⛚l퇛yv[Khoⅇi~yL]o쇁km☞|󄁔pKElj醃kmeLqgjꁀjd囘SSAepifWQGdwb䇃aiDؚV{ekaᇀbBϙzlfbaƚu}ie際o솅e̅wݜwic텄i셞}Ȅ|XYnkki훟rrOVm釀cᘘzuGAf놀ne䅛ZEEsr儁d]DgKo儀gi󞛜R՚Qd}jb燃chʘXxa`lↀbƚMʟ|me蛞lㆇg΅tݝqid隅hy˅}ZLnoj􄀓yCTm釁`☞{򄆕qLZab盅eMZQpdk煆a䘙[^Eeth䄁`h^UXeplᇃmiFeglmㆃlΛH~meo솆cwϜrh{蛛jdrќLil텇n{󄃝eRSlk釆b{~@Wm놀`ᘚewSWIdig慘AׅN~v焆a䘙ZօByto焀cowDž\x~hcmkȘJ~agl톁bυqplx뛞i톄g􅃘sunfk臙x{UWoo鄆jiz{\Ub`㘙eqD]gꆀl䛄g兛DZYvs䄆`曞@хNNh焀`h\ׅYxthl㇃oiF|{cbᆀlʚub~n솇`pwbe際k釛e}ԜXbc脇酟zdXUbjꇁceAUaaf䄅u\]Hen慇a暙LЅIJbk䙙CمNyKji㇃ooIW|xmo톃owrcdkl񅁙|tl~뛙醅f񄃘ŜLlf脞ddVUmo뇆ldfWӒmf☘f䇄rQSZdm暄cㄘLЅuwwᄆcᘞO܄u|Lhmo噛JE|qil㇀ni𘄟p󅚔qdfi쁀n񅆞|Jb~h聄c񅀞yMld隅臘e󄃟{ܟטbl鄇k腟z򄀐z^ڟaj`웞e准y\SՒdcᛅf䄚JTCBphᅇcᚙ@مqrCjlh噙C߅C}Njn㇀moKΚRp|cl솀i}𘘖tUf|hb񄀘}t`ꛘj膛f~j۟^bf년ꄟddU֟`ic隟g凁d՛Ғgf⛘c燄~Қ[F~mㅄmLӚwpB℁mjᘞIt|Ikj쇀im噛J…F|smi솃ih𛇞r󛛔pgei遁i򅁙|tTc}jꁄbdjʟEmeꅚffܞәcbl`冀fޚRŜakf`憇x֚YVe`mㄛvمJIviㄆl⚞wDžssCk퇁nl昙rurNih솃il󅅕Yv`ih󚆞y@Vf~k醇b񅀙y𞘝[T`y놘adkƞכa`脄kꅜdfјYƞdi`雟g准dݚGǝdf훛`焅w݅u^qmⅇlㅙHŅrCFj⇁oiJ˄vt[ij⇀ilr_upcinj񚇟|TKVdj聆n򅁞y򞙓ARfqcek͟\azf凃aݙӞfbc`燁aٛP؝zhdbᇄ{ܚ@^|c⚄nㄘvwHLkh℆o⛟v̈́qv[hhl䙘r˄LqIlk醃ly\q|ej끀k{UMSgplak😝W\ac凂akǞTЙa`o`熃`ߛ^eig蛟mㆆdŅEܒzg웚o쇚~„w[Jkoㅇi셞q|JEj쇁il}rtMnk퇀ilxCLsak膀kheUDXerngSEgsc儃`hGКfejg凃cěX™dla`ᆁaÚLƜ~kdl㇅et֜vjb텄o섙sƅ}[Yk⇁ok㛟s􄀑}HSohb瘛rKIOajkn~\@R}~ꁁjeEEeuo儀akԅSd~`燃cjVܙe`c`懀b؛EŸnd蛞mㆇdڅNݝrkdi턛{ȅp[Hilk횟s􄀒stVojb|򄆔vuZb膃c盅eCMpejdVZXzqi䄀fjQR[fvl燃bhΞ^қeeommCebeoㆆbH͜{ken쇅d􅃘vWvkm텇n󇂜~G_ijhl웞~EYl釀c昛zwXHaj끀l䚄g䅘DRDrrh儁f\҅Beqm䄀bn󞚟X؅Sd{kcmjȘN˛xc`bㆁ`͚t˟|nd雙m톄gυpڜwhf욅i~|WRli섆hk횟|񄀑{D֒m膁c|q@^aꆀm䛅z党@S]px䅆fTTNxui䄀ahX՚Advm懃ciʙFƛ{dbbↀlʚHrbzn톇`ǚNqne蚛kdυsUCmb鄄酟|{@Vmk臁m훞zyCScꆀc昚eKXJen煇d䚙Y]Byuᄁ`噙_ׅF{vnbiBߚeynlↃoj˘Jʘeago쁁l˅qpmy똞hf񄃘yۜJlaj鄙zdQRnn臆i웟zeXՒm놀`d凇\@fꆀbᚄ`慛MVZps愆c曙@҅IOi愀mnFƅZ||l㇃liug`mↀl˅s󙘑wUm{ꛟo솄`􅀙}ʟuoe蚚kxxjܞWlb脇j{g\Нmj뇁`옞z~]UVf`瘅g䄅wЅ@Kyk兆a暙B܅OBᄁckEޅLNjh㇀bnHυRr{mol˛v𙘖w`yh솆b􅁘vʟwmy뛘k膚f򄃙j؟@lf腄鄞zeVџch臆me{_ݒaa㘘f億pXRDxl慇a慘AQCstb瘙EօNxIk쇀lotڅZ}qioihprfdi遁i񅁙stm}h聄cǜOod酅뇙ggОWmm脇o녜dg]ҝajfa䇇xQ_Ud`c愛vӅBL|imIDŽvs@j㄁lo瘘ūIsukn⇀nlrTpx`lↀn񅆞K`~im~Jm~ꛘ釛ddjڟSbc脄넟d凃`Әޜcicg䇆gRVݝdf⛛f燅pКGAo暄aKąqwCᄁbh昞JqvAkh㇀oouɅXpplikk𛇟r󛛗ugzin񅁞y򞘓CPc}膅`󄃞zj͟_`dꅅgdЙԟfbm蚜fdVٝghg옙`WPPz`㚄mt܅NBuh℆m㛟tڅppAk쇀il䙘tυO}Lokhov󅚕Rqedh聀k|IU`p끇bxGma凂gj۞Ԙb`ꄄng熃`ј]ۜ`if蛟c憆gҚDܒdg훚l㇚|ąuZpoㅇo셞qÄswZ㇁nosqqEhk솀jmr^vsankk~JQg~j끆idMQa|c儃dj̞Vך`dg凃aۙS™flc뚜a熁aąBڜdhg혙c懄uRrc⚄bℙwąvB@jj턆ojH„}uYkj쇀im噘sLuHbkhn\BVx{j聁h󅆟{XDfpꆄbdk񞛜W]a|a䇃aję_ߘgfl`䇀`ӛD͟ehg雞c䇇zܚBג~jg욅lㄛ}ÅuAIho턇o⚞p΄qqZh釁klᘙpwsDmjjm~XKsdꁀj{TAPgq끇hdCaqb燃ah˞]қ`ei`ᆃbZglflㆆaښAxjdo퇅e̅tQqkb⅄hp̅|C[jkn웟|񄁖ru[i`昛󅄕Luuck놀i{兛[X_x|끆kg\^[dtm燃ci򙚟Sׅgxja䇃mkȘXØd`cbᆁ`ؚBʟyidbㆄguӝrka횅o턘rrGGin섇i⚟r{ATnkbᘙ~􄇕s@Xbjjm囅eEFWp{끁兆d䛙Q\Aeqn儀fkYօ\dr`儃aiSٛedo`ᆀmۛFʞ{lg뛟bㆆaߚFߝ|ne隚i쇛dͅuSBimh}􄃝~OQlj臁jl☞}t]b놀c瘚eGuIdi䅇d䚙^ED~w焁aW_^gtl懃ci񙅜@څgyimㆃm̛FΙebgoㆁ`̚JΜxix뛙hg΅vߜvig酄k􄂞|RZin釆kh욟xeBWo臁`{vAD`ꁃb暄a䅚F__w~ꁁ愆c䘞Z҅Beuhᄀ`iA܅Ydpmnh@ϚegbboϚNlzꛞm톇`􅀘r͜qngh~񄃞xTGookj酟{e[Нlj臁m☞yZ]b臀c盅d䄅H\]uyꁀi䅇f䛙^ׅNKj愀ajAӅDxtoᇀ`i_ۚyxnbↃl͘Ipcdo톆bʅtvlx뛘hgqМAna腄jꄟ{~\֟miꇆo웟zyZѓaf㘘dt@Ldm暄f慘OPE}pᄁc瘞@ޅLeOhcn@ąYdrnoↃlhJțggoↁlɚv}lyh遄c􅀘}ǜtld蚅臙g{֟Plb넇i녜eeXѝc놁fdxYSfc曅`愚uU_unㄆ`曞BЅOyIkmiMDž@xwo⇃nou|xbmov󙘖pm{hb|Jn{蚛hd򄃞xj؟Ama酄j腟dgQ֟bk뇆beePݒa`g懅}Ԛ[Gxn煇a䅙EхtqLᄁcj癞OJ~BinouɅ^qon⇀njv𛛔qgekmȚs򞙐KTb|k醅`񅃙~jϟYbeꅅ넞e򄃟xWԞclꇆo蚟f净d^ܝfkf혙f䇇xRWPecᛄ`ᄛu՚[ttkᅆb@݅Hr[j㇀ln噘HDŽ[xuni솃nnqrefi遀i񚆞|t`}聇m~񟘜Im|ꆘayޟRmaꄄhdf]؟`k`f熆ePV֒da`㇅sКEMolㅙt؅ww@㇁ni昞v̈́KsIkk⇀nlrXsrmo솀hk󚇞|qf{h聆o{󞘒Ic}k膚cgkɞU]beꅄꄟf䇃aݙWޞ`lm隟dfӚ^fkg훘a懄{ӚEPxc⅄mㄘvۅtONjjㄆmt̄psEh㄁mm噛pOvHoi쇀in|\LxehnxA]ar놄l򅀞yjDcꇙfdjٞSߙa`oꅜg净aQ\dnf`燇{UEגejf⛚b愚wЅMAtjnㅇluڅqt[h퇁noᘞq􄆗IsGok醃jlsYvpghh𚆟xug}ꁇnx򞘒FTcscekVadjf燃aИPڟamaꚜ`ᆁfҚZǝddm톅~ۅL]|jb⅄l텞sͅpwBj섆ih㛞qÄvwXikm䘛|FvJmi醃o{POTx{k끆jeBRfsꁅb儃fh񞚜_օ`xa燃`ڙ\Ęfbba懀bؚX͜ehgcᇇdŅC؜~k`㚅b퇘΄pEBhi℆n횟pywUi쇀im昙|vKFmj醀hoy^Hrdk醁je囙V^Ddvi儀djSQ_frcahș]ۛ`gif凃aݘ[͞zlg뛟c懆gܚMڝ~ig웛o⇚zڅuSOkbn텞p΅}NWi쇁io㘞qq\o놀kc癛y@uvajh{]A_erjdU^\gtl䄀fi\כaxjbᇃcXŞecamㆁcۚXÜziz雙oↄ{uНrja셄n섙}υsE[hijh욟񄀐~IՒn臁jcᘘy򄇕JKMck膀m䚄d䅛LFQ}ꁁg盞^_Zevh儀fhDЅSe|b懃bhuΚe`bbmǛLʞeleꛟmↇauÜrhdi쇛{rSMho섇i|{BWohm㘞r~C]m놀b䛅eHYWHdh兇g䛙GWDyqhdSSZzvm焀bhßOۚWdenbbŘ  4891 +0>;20;$%23:$:06204 +0=7 +16 +0::23$""! )*+.)***))**+//++.#-.."& -"&%' !:?:'%=3>:?752?160 44jwԕXDuVi痍ꂱ錱U똈tꆀf債샵Ȟox\wuc」`炋z镄us~鄘鍍ID[遍Ӝh@Xeۅda蔛cam󁂔Ffagedؗ`옑s胇mZsㄇ\AamAJbљmLfLtja`吐e凘~XI冇u~CPk}cܕꘕbxj_BtgΜˇwvaΙfbc~rkr針Ll|rj↚}_sTewwUfhIY]hojkTX☑瞔`⁚uJM~wNKtxpm^fd|j`joUod|RsS{z}wjriMDPlbXSH䞒bΟzʇ}OdfWbjfplvꆝ}crkn⇙a_eЅlgskњanx~unb᜕㛗_@a㆘}ISvs@WsFdBeUjm`vld널n燙ElrnHqM~`a}nthvyubinMz|PsÓeRBdaFe@xlvmbㅟmӔg΄lsmڛalgasbf@y@gz@\xSNsYeUvҖiPkilBds녑oHiqalsOqJii}`@iy`qfnhj{B{YqSˑ^{CO~`w^TahKz{⚝oǑfjpgh͘dT`bh|f~넑uapea^fٛ|Br܄eTl@_lnPuC蛔o쁘quyfBrA}{h՟igkxe`k焝Ufp凅JvHw}OtwcUDhl_It㘓hfUq|`zXdhz~kw}kz~hbf…a}s„zcqMMjahS^Rm遙{CBp噟dSrWpcНlimgriy⇜Ahdp燚sJqLg~tjFbIOZnjhV^jTg䆅ZwF~G|O~{ucBic噕yQtw|jaٚLc}jolglMIp za{䅖{f– |I~KlwGcziL]QOlxaQ䅑gjgnya}nm~wn{ah^_t@um|pAzʓ\vawbFa`Klfꄒk`䆚ha@cjY}BacbsoekꅕO{Kaꆜo_FoٟOPۄpUsϒgWad]{Ah놟wbAcmㅞgє{фibH`ޚaigNg`셓}D~↚wZSsL^OA~wܐokiaf|wja憚WoFelGvE}oowdMiNeFril擗mrZptWePQ{aIQlxo]r셞fÓ}̇iHoɛdbanv~{_dKqzP~WwZNքxȖnhnom\Sផf↛ZjGqgJ@AHjjwpnTi~nsvcjmfwKVHUru_\hwaؕVmajZu㛒myOHaʞzfortnwCorOkn醘d{مgpBkÄzmwBPo`hT☔f쁛s\]v嘙rYIEsJ`Ul`{uielVn{Ih凅NJ^Ke}CoGbD@alT㙐nQUIWs}]zyM`AefKlb釟mڕeodInÅxay~Abzj腗QAd聘zRAyПw݇qrǒmhoaAarl솞Ibubn愚p\JZcdL`Ybjp{Fgmj杗k䚐H}熄\N@@tWDwesVfcFgdoflJakea`HfudKdꁙfUaHt͇}GaTQ`cR}Ni聞snCeaᅙ{֖}Tnwgՙcecwefℒ{OᆚqNtLHWuMgE֔Ujnn_wvkfVkNybEsAsohreHrbpxhmletvȗdNWEgl]TodMp~曜aғy҄s|bcmcxxx턒Cb}s㇛yY]|uwRf•kZR_khjj]E옗䟔aᆚLKteJuOwplXje{pj`jbcxsV}Yx|qIksl^[Ql`\Fᙒmʟe˄sNe˟gQ`heqlvꆝujgrkiㄞf]zօ`ewiDžfnqsKnb⟕[f↘sKQI|Zw@eNeӒkjc`wcyn燙PcsojCwJsagwmOiHOcmQ睖nXrUM]eGgfOdAylt`fbٔgDŽimsmϚfbdasceSsEd솘xC{QGsTeIđninmOdp녗oIhqam兛quvIlmr`Zn}`pfm䐕hpAyXwUZpDL|cUKWjahH{~횒nɐajseld`bigrBape醞a^dݘvEpلe̗l^ZbnVB^ꛔmwu}d嘟{Z|_r~oݞndiyxaj愝Q`~燅NtJuq@uwcەQTVhljXCI☑kfppf[yEeh{iLwoy|n臜l`΅a~re`JCGhgh왕Um膞{AZw䙜gP|ф~wa؜lnbdsn~j⇜@idskjᇛrIqZgzpkYcOJDmnjUT㟗Wg䆚[vEsCsOpeIgPdfwlf脝ibiapnxPdxzwo~h뚗\t[`f[S䜓`VDŽr\rƓcUbhaNfJjucvmlz^ySl`qcқbhsetc`暐t\zᇛuu_qHPJOg[VcmKd|념coqchXrE{`br`tHeNekmRmʘu^}SfPGfb_rFkꆟ~hued⅟aіz؄hsgkŘcmgmrgz셐Ygv{⇛rO}YK^pXfPƗhTkniEqK蛖b憛^wyftpNrij|zk^j~n{emkmzv}W|PxtZK~l]id@Jq㘝bؓd}|cϞa`mxyjs뇒Lo{~h쇙f[xQxqqԅf͕nCA@kbkUPP枔b↛KuuxsIqExsbםhde}kfn䄞meCsFryrtkql_G\olZTZnes@{Qd_djevbKpapnlcgadvi͚alxepia훗ATasDX圜|WJS{Dyړihbcwb~iᇞEcplh兘ptvtb`sm[oH|@`hi杗kCQdVsCXM~fFxQemtadoٗfjlrckgfdfv`x腑_~Ld膙g@aęBV}؄zAȐmRlkmENi퇟wivfb䚘r@pFinaԙoj~`pfbj䅒Bx燅OqwqAKtc@ߗjchIpkckselU\eokxftH`r{h뇟cY`›~IrτdcEGfnPFWn膙rJpy昜fS|Q|{oٟbofkz{eℝa~x懛}tq@}uqY`ÕPPhiojYDG홗a凚Tqt{L}Oyhxn@kdybnbf~}xdqvtjyhmꆟdB[I枒aܒ{τ~ue̜cbld}n|Lkaphn턘yD~]`e}\lkLKBomj✕癗PdᆚOv[ptKvBftfԓefqlej̔oTkarn]|Deyzwowh^qC`jb[睑l]{Ʉ~]vɓg\gcKgMj놜plpb`텟a^e܄nlmě`n~dwcg㚐qAg톘}t_|AQv^g_wߑjjmoKes녑b燘_opal嚚OqNvcm}`Ahvgsain吔nsFy|^VePIxb_tSehuee⛝cіe΄hrdnϙacdmreYgsz쇘zEeԙp@sTgSƗnU^ikhYJD蘔b↘CvxfrHvMkk|xiWkyo{akidrxZ|M}uGurmRicBLH☐nǒfsrfgSflz~hKꄓKox~na]dٚg~|ŅglAFAhckbswLr{Fr]|waޝih`g}i{hᄟld|jBqttd{sjOlDI[mkoGWXhgV}Dp_yDydtcGb}n`鄜lfɅlarne`~zqoz월VK[a醞xM[園g՜Tr҄eByǓlio`u`qk퇞Fbsmo煘}OpAcasl]lwzuclk撕jL\d凅Xr^OrusaG}זdltfen–alsaie^fdaqaqꄑZeqffZ哑ařI]~ąeDɖc]coFrCiJhwda皞e[|Phi}ghߙljzb}da煒evzIuqtIRvIcYٔbh@sv원j`sy`XBxnjyejBwmeiꇜmm{w|zaFS@diV_nꆞyusy癜fRyӅ}cml`zx{턝_bx|ᄘ~N_~vqRbjY_Zkih\SY➔a懚[wI~M}Hvzpb_yjdk`imbd|Vx^erquh~iS[Qba@QF染`Ɯ{~L~ȜcQ`ifpbtH`rnl턙eFzTcdqnݛbiv}uomj曑MRa↛tvCrHtBdM{ӓacvcxl儙kcrlk\|@farlIhG|I`jbR䒖m[U{}@UfYe`Be@|oqaa⅟aReمhlp`j̛cm{apaz㚑QNg㇘sNxRAWs\dIǑhkloLxw뚗bᇘYkqgc䚘qqJqon}f[js`}gmnixKyU|[yATu~lQ@єkgkLr|⛒mڐdɄ}xmfVcai~e}넒Ab~edDe֘rOpЅa͔oRZmh_OAb㆘Huse}Hs@~|oWi{kexgk償`~~儚BrA}stvtbPRSnc[EKᙓoɝd}veUfXenxroJqkdjl`QfÅf{rƅgmtuOigj㘔Pc}tFvy_rR{ugĒnh`gsoxh]hf}ik焛wtwwgzph@lDJAmhiRQ朗k^dVsYvEzA}dLd^~cpmf鄜lܕai`sldUfydpl{VvEf臟gASaן^}لz^sǐoVbhbNdJk쇟Mlq`cᅘ~Hp_omrcטljsguab囓qCe燚HrVNq^tvaRv՗`nOxrkȑ`isao{_ecl|fw@gvdjꆟaG`pMydPȖc\F`l_wEh膞skK~d暟dYVjj~giߞbhel}ezㄒUgsx懛qJrIp@vDbSەTkjok[JMjc熚WpfFMri~xhApoxxmnmd}yfuMKynlꆟeHHv晝`۝xń~saŸmmmd|i턝Eoe|h℘yA|\e|sRch@LMhlQU]⟕`ᇚFtB}ptIIdvaVdgqldklnf|kRFzx|Jovhꛕ[uDl`[]眓bßx|[}Ȓa^`kfu`J놜t`plm℞fXe݅l`}nޚaiq~tm`H^a↛wuE~OvBdZؐkkccufrꅑm燘Umqcn兛I}Osa`qc@hJet`inT䒗iN]y|EUgAea^r_eivfg⅜`Ԕeτi}`jɛfcecpfxXeudzMdPt_pԅeDƖhTihoZpLꅗlMkvza囙pJuMhk~gjRirbrzbjhxH|G}ZI\JrcFԕka@tv훒nÓfscgRdljyzrꇓMczkgEfۚyt}مgoA^BckTZ^៕c솙swt}䙟{Cq\y}m՜nhge|kekᄜby}䄚Hwuux}qNm^YYilXRFhd}uy\zG{kzpmNpjg}hc臟bUa΅be}jÅgcqqKie옔YT`醙yLUC埝dW~ӄxLzĒlnmfvbrj⇟A`sonᄛsKqN`gsn^lH|uloj朗j[dYpVHMpIpfOd^zcvcd鄒iǔckmsmjeRfgfqbr녖X~Ka놟f[咐aߞE|ńxI̐bRbkbNeHh퇟Klqa`ᅞdAՅiorcԙmjyavff慓sLe燛uqtuEwLfLߗcnLyp腓jcThpec_yZyoi|gNjtcdil\b}Hx{aXFelQMRiꆞ|kN{ᛟf]xׅeoębnah~z{ㄒ_`|{~O^sIqRaj^Rjnh^FGa燚]tq{HrMq{~oRjykd{mimax|Wx\gvKNj|nlg@XOmŝe„}wg̜acod}op針OkghㄙeAyךferjޅbiIwIimT⟕晖]`톚KwXw|HtBeugגjfaqmzl儞ha|iE}N}depiwh[tFcb[]䜑lQx^pa[djfJaIsbqcaf_dąo`slĚ`ldqmdᛖJ\g솘ITy_VsRd_qǐkkmcKgpꅖlᇙZnrco䅚IvJwccs`Zhvfr`oi䓕hvZ{U|FAxQL|`\wUjxnu{~셒nڑd˄h}figT`fmax脐DfsgdMgԙv_qޅdS͗nU^lkoYt@뚔o솘Ckt~d盙MsZjydkUo~l~efh䅝grx儚NsArwGtvmSܕQjcjCtt㙐iɓgqpfPeDzoyyhuꄐHmxyo臞a^aer}DždmAY@jakmquOp䞜eY|Qxp`ۜohfgh{k\ody焛rwsN~stjEl[CAnio]Y㟗d凅rL}_y@ztaQ|f}ic鄝lc˅mg}hg]f}}JoyVOYc놞dC^䜒a֜|ńD~Ómbo`v`tk쇟Z`rllN^`fso՛lt~wmbj᝕N\g懚CpYtrIwgG|Uemwax腓kʗckbpbkW~_{g`}bqZ{taj`YcĞORxȄe@ɑ`Y`mA}[j膟wotee⅞d_}Ӆhor`ߙbny`sff盓wRy䄞dΔ[e^]h`vzSyfqcd酑]{q`醛ww\H~ØVogwdNbEbrɅd텕gaq|gqD@{lWDҕoeJwq☒mؒ{}yb͞fccjx~ks뇒Dm{yhe[gVess҅gnZ^EkcjSP阔矔b㇙ttLq䙞|IqGx}cѝkdd}idh償be}[y@|rwjwoV[_mcEPZoȜd}NeFgkdvcO}`|ic`WfÅbg}hڛabptod㘗ZTa|JCxD|WzA|œnic`varhᇞ^crlo煛vwqwafsoDouxtcniU杗hFTdW}OP}NraAxSxmq`g셒lܔfjo}cjfRa{apcy^~Hf醞dFf֞YsЅeȎl_mhmB@n퇞Mnvfc䚞~O}Yin`ՙns`rg`j䅒{te燚Opur@TKMcWLҗ`iJpiϑajsemgGzbhxgjOu`p{iꇟcY`͛rue˗`]Dfi_KYn膙suq}昜e_}ք~ylٟmkfje{z煒Va}pusM}uvGcST^hhmX[E홖a凚XpveFrMk{nGrkgxbꇝnUbayrdVfqvukhRVlzBRM矓cѝyKeϜcWolgrmq釜@j`yji{Hy]gerkUbkOvOnm㜔䙖Wg懚ZpYJtuvtdugTe`pmzj•onapljRxEedgrovkXsNc`EU䝑cϞRy˄|La^fj`HdB놞Mcpblᅟg^^beghmON]knfs`Gyc|ogꇟcF{ƅlMtOpohKfqzi뇝jSCqkݛ\emE_ΕynhrdEkrb~gcnU琕hC}V~U^{XLpbUF֔keiL}p웝mڑf|elfV`ang|脓Da}e쇞gGg֘sNp߅f˗l]UGchRD]陕m↙Owqy䙟BrG~yoџh{i{zfk焟fy焚IsMpvKwKmWWSh`EGO㙐nɝd}qdUeCdidyoBvhd~o釜cV`fys˅dbHuKhgj혔RUb膘rv@t䞜eY}Ԅ{tdڝoh`f}l~k]ifkj焛ttqNdephZoENGmhnR㜗Qe䇅Pr[vG}HgLeVxcplg酒n`nasoeSayevo|QuZ`놞gG睓fٟ\؅{^smmnbwfukBcvcb慙xu~Tncqmߘmk}gtc`jwXd燛OtVuwWJta]tі`otep腓ːbiranQ{[z`m|aJEdtgkꆟ`^吗cJY}{VcVFfmZqXh醟}jpedfZyӅhrdhٙmodogzㄝetxᇛ}usGtLs\`WǔWRkohCvN`䇚\pygL}MpnjxzhZsoxemnmep}zVgKCtyoodIKwaߓ{̄~raϟbbajzxj석Doeyk⇘eAdӅ{}YfVK{ZIw`f]z_wIyaW͗hPZ}}^Ddbd~AYᝑiFs]{Sdぞf_aPDojmXUG某mz}AyΝfEekgtaOꆝtarob섟a^gܚlasnÚalpywla⛑L_a솘ptXy[q\dG|ސhicmqarnᇙQmrco䅘twvu`crbGiMxtcnnW璔iu[z}F_{O{cB~_znvfd템mחgɄos`kΘfW`db|`~]{KdzA向fיI\rхdEÖnRbkoA}N뚔o톙Giveg暘rtpBhhgjTi|m~fcjhxKy䇚OrO}DPuwc_ݕk`jKqJ욓i̐ajs{ce[dljyxjIꄐKb{k釞f^f~wÅgbZ]FaiSXSm}ww}晜eX|S||bşnhfeyk~ᄜczy愚uvuH}pq[b\XEihn[YF㞖kfWsJx[~Cxje}mDra~h`뇝ocȅbg}jegsptiyj[Sb놞zLRA矒fѝ~Ą{J{momfpbpjA`rol℘~N|Agepi]bOsKllj嘑Zg䇚CpQIuqvtgFy֐dbvce脓kmkm}lx\dzgsmqjꅗ^sM`cG䒑cÞDx~I˓aG`mIeCk놟vosaad]dԅnl}`ژli~asadᚐ~Id↚tJvNStMgOܖUjblOw酐mTipglD|H|liyaMIfqenlS吔opMygSCdmPMUjxkK|~`RzĄ~dožcmfn~d{턓_arxh膚~wp\`erlchdmbpzgo훔hmkc|h̚dqyCK˘dzfd`cdrlabrT_oh~`vg`ℜsCzRwcꆐuᄒ⚗P}od杕ᅓsua⇙u_wvSv\gStޑkclug|腐m䇘Qls`lM|Msbl|cIjNdqfolW䐔ovGy~TfVFemYtQ|iwzy㛜cTek|gh͙cmdl}g{⅓Qeqe쇘xuz\uF}QgP—hWmhhDwA蛗bᇘGpyd䛙tqwHhj~eh\kyn{d`jids~_~D{KAK|m\igItt☓nēer|`fQald{hu脒Amz~n쇞dXd՘e}rƅaoM@@k`kUU枔b톘upKr䙟BvYercѝikgaxkdi感ldrj䄚MsKq{xsjFoSE[ljl^S㟑ndrAsU{ZekfpcH|`}iccUgƅcg}kƛacpvie훗Gf醙zH\坓gYЄy[ؓiom`w`rk㇙Zm|lo慛qwpLffslXnJ{wboi璔kMSdV}ME|JraG|Wzmvadial}bkg^geascq腑[{tf膞gZgӞAS~ńzEɑmYcjmC|An솞uhsdg᚞zMrTii~aUl|`rgfᅝyt{懚uqJvO]wMaXۗchIru隐k`}ec_yCymkxgNKcdobScϚ~wʄzcYUOgiSAWo놟xwr~瘜g_x݄~bǟcnfjzzxℝ^mxyqtyD}vp\cϕ_]Dknn[Z[왗a懚[pqdAruve|m\~fxcꄒnbbe|z^evuKki]TbdBR@枓cݝ{̄ytdϝ`clfsmvMkayknㄙeM{֚fdpkқchIvKobT昖[aBp^HqIJKeLe֓d`pb{ϕonasoj_@yggqlOkZptmc^睑mΞ_{zYwdZg`MzAwlsca⅟f]d҅nbsbě`o|f}bz⅐U|Ng⇘sJyADqQg]tőkUkblIdpꅑo懘^hsacuswtbo`LhpapfmnS吕iqEyQ~[z]K|m^Hחk{jt~⚝mږgȄ}do`bfn~f}Ea}e醙eBeRt@sхgΔiQFcjiYBD阔l↘Ow~g}OpLyehUnoyeah䅜a~~䇅DsB|tLtumRh`CIu㙐lȝgrsfdYgidyiH뇒tidym뇜b^gޚd|pfmuMFigj㙔TmvNGv垜zY}Qywg؝nh`f~iyhᄟYhf~kj愚vsrt{yqkEo[LGmhnYT㜗kgrDq\~CgugY|arlf鄝la˅ofpngc}xvl~QJX`膙eMQ睐fМU|߄{E}̒mWmobwfIh퇟Fmrll慙~Op[bb|lטlN~K`ck撕vZd憅Aw]HpWtwaG|Ufnpf~酓hˑcn|ch]{Yxgb|cw녖FxKdkaF哖cƘLXx„{QbDflB}Zi醟phpdddDeUhnsgkݙnodoxa{zuyuv}DO_pAfQƗRan@vKc䇚W}{aMxH|mhxdEsoxdlmmɛK}{gG\Hyn^Tn醜dBNwaؒ{Ӆyrgbl`e{ksYm{~j⇙xHxZ~qs\cȕkGA@hmh^\]힔埔fYvuxrvJHz|m]~jgkfjobz|^z_{}rqksnZwKidLDt埓f]dp|npcElncEEZ왑igrwx@fahyuzߑÄ́JjۇtO`eflɟLfhXteZsؐinmcuf|녖oYlsbo䅘wqvwaaqbXiJeq`liᒔkuYzQ|XY|H~`G}PylugzlӔfibkfTce`pf|酑Y{ug膙eMg՞LSs҅eEϑo^ojlZwYo↙Lkpd`䚙rL|Xni~a_i}brdajj兝{t{燅B}KsA]vvbEܔk`kHqt원hϓ`jrx`QdGemk~zjMꄐJmyeh臟cPaĚxp|˄eb[\AaiRYW㞕h솘uwq䛞Qd_k|lӜlhfjyxjyScyx懚uu}JstwDb\^YhoXP\홖jf凅puxD~@~herb_rjg|kc넝nc`e}jzUgr}pk~k_Tb膟dORC圓aݝ~ĄyLy͝mUlbgvbw@`}inxHZadriWmkutllj✕䙑EgᆚCqQHvutHgHeTdctax념ؕmkb}oVxDeegrmJE}BaaY䒑bğZ~yUBaYakcIeFj釜slqafㅞgPzׅnmrbИcnfp`d㚑|LdᇛqurCGsXaVIۖjboHyu뚑l懛QipgbC|H|clrfBjt`|folW䐔ovAxe^Oeo^HThykJyzᛝ`ReƄ|zoΙcUlgn~dx鄓[`|e쇘y@x^qIsԚ`ϔnQ^lkk[@^蘗bCpgwwwKk{zoVk|oyzckiay~]Z~vMKrnVQ]i`CG@㞐oeʄsfȟgYfodoHꇒHidi쇞fEdޚf{sągnMOMh`Wᙗa솘quZtyHsXzwfВhjffsnxi焞ogrk党JrusexvhMoZJFlhl_U杗hdV}^vWeExfwaFrcpmaba…l`slȚgc~dplz㘔Yw[f醙yHQg]]|хeGq͓nTolmudtn⇟@lpbl煘qJw@ccrbQnwgscohᒔktXe凅Xs]CruraEsVdnud~h`npanf^ffb}fqꅑDdvd釞dBfu[|Ņg]̖bW[`hmXpG뛕nwkvxe᚞{@~Xkk|dhןoh{l~gg煒dv{懚Kwtw@Sw@bSڔjchBwK원k˓`sf\xCxoxzjBwo{zoꇟbQbʚxv}efIGIeiPm膟xKKq昜gVx܄y|cßlnaeh|ℝ]meyᄛ|JsXxss[cDCCinh_S➔g䇛_qM}KsNugscQyg}hanllgjVz]ewn}i雔QB_bfA_染`؜xÄxNyɝc\`iapct釜HarooㄙzD{ךagsoИcku|Kmb瘑FWgKv@qupIgOxАabw`~널͔lmrmk_Nf`}mNhC~IajbR䒗oAP{BʐVa_ebM{Eꆜ|nqafㅟfWdхnl|cfi{c}ay㚑]xKe쇘~L{FFUsYgFÖkhoiH|O蛗lᇘYkpdct|uvoi}gj]kvftecS_JifgcTz쁟h]Aphh囐kꄕndg膐DIrhi曑``rXfEyGUFk_QXf~wdDAyAC䜝DttfLyړigm}m{ꅑokcplk党DKsedqlKhArKbjmP村oɞY{~\JdAe`B{[rls`f셟fPdDžimrb›clfpbg⚑Ws@g솘|uz^^vQeWJőhUiolOxKoᇙYnqg`嚘vpwtlo|aQhqc|alh吕nrAxZZ{WMrbPIUkehu~|⚒oؑfisemgc`ixgsGasedBeԘpN}ޅfW͔oVZmkn_B[蘕l솙uq}z䛞y@rAj~znџizixzgh煜g}yBrNqwIuOmhcGMH♐nϒf}sgeDgo{~nIvhg{l臟`RfgxsȅfcuHHhdjQc醙rwHp埝eSԅ{qdlnaayixj⇟_hf|kk愛sttIz~vhEo^KLonhXS᜔je凅T}@sC|tgKdQ~`slf鄝ocnarnea}yvo|蚗UJ^`ꆞeM^坓a֜ބxRqmRbnbwftk퇟NmrbbᅘZyXbclUljqewcc䛓t\zBrGJvwJf\v֖flwd}jʖlosao^z@xfmbvMdpgkꆜcY哖bɘKF{Å{R`TXglGsZj놞wnted曟dX{Vk|eoiicj{pfґ\̈́u_ƇsBfzflĒr凟gjO`vaecΒdcmymdoefc|ћB\~[gDqMvDQ`JnfG@dМzxYqcX`iauaqjBcslm⅙eFzRcaqlҘmhv{qmc嘑K^fNqDttJMfE|Бgbuf~腓j̗corcnZ~@egasmtZyw`hc\哗l͙GU|xDʑaDgbA|^kꆟwnpgd⅟fR{؅i|ajŘbozcsadxwd퇛styCIYpXgFŖknonBsH雖b燘]hpz`KrNqoigZqb|dmnnes{y]dGRHymEוkzIvsmА{|{m˙aQccj{er[cy{퇞zLzPyqpޅfϕnZ^Gkljk]XR柕m㆘Att噞rHwLeylTh{dykdn䅞bz|DrFy|ptjKnlcXR[㞐oȝdw{g^ghgrbKꇒuf}ic`Pgݚ`d|j…aouptif㘗\`톘ruPM圝eErS{Ieٓiha`qc|kᇞSj`ik兛tpwtggsoXnLtmhlP杗hZdsO[zM~fM{Rybv`gmݔahbrm˛fU`ydvmx酖R|Of{ufUX}݅zWIȐoSbnbHeJn㇞Mor`c皞HsElm}`Wisara`jj䅒{qd懅QrDCPovr@nA[]`톛st\qIsIdRuÐmbP]DZQG]ȚtowvÔU‡d_cmW@\nꆟxKpx盟z^x݅~mڟmoghzd{ℒ]c|~㇛pw~N|tqY`VQZjin[YSa凚Vppd@rKvj{o[}kgx`nbbdy{WgJutjxi阕U\PlꆟdN[MនcӒ~~ueΜ`WclgrmqChf~knℙzO{Tad}hӛcjLwLobU✕昖XWaLpZutJwIdufQg`smzjl儙iarnX~BydeqowkZvMcaX睖nʙ\e}^vf^djcudL뇜vlsca⅟fEeޅlbsm٘ao|frbf㚑qEg⇛qHZYsPgRwّiboIep녖lᇘPlqabJ}tpblra@hufsfln瓔oqEyT~\ePHxb_wRkejqe~⚝mЖd˄krgi͙fban~g}鄓]dt{xLdVwM܅gnWZmkhZuE蛔o㇞uw}e盞pLsNkjekRhxoyd`kdp_sF|HDKvlTǕThaHuN웓lÓfwvdPe@fmzzkq脓undxl臞gPaĚe|sDždbuNKkajUT៕b퇞rwNr}Eքera۝hkdd~h{k_ifj愚JvwNdd~MmgpkgOuzjebH`bcd`}b{脓s@gᇘrYk`{n}p\AajnbgyyMAfu@Mjr{goj~qJiarDtvtCtwbRĔSkakCwu웓h͓g}y`{Ggbjy{jvJleei`Yf{p|dcA[LjgkWUmvKLv瞜eE|ׄyp`Ŝohfd~kzㄜ]odyjᄛqqqOx}sBl]EEihoZQ_➖jg凅rKAIdq`\|f}ia넝lbʅmdshdW`}|wi{jA_bduQG䟒fܜyޅxC~ɒbbocqcqh퇟Ej`}ooㄘxOxY`fsn՘mttmbj嘐CPgᇛHsTBKqIKgM{Qzbway腓kbjbpbiT{[eg`rbvk녗E{tajcX咖mƙAT„{WLcYfjcD}Xj뇜woqfgㅙd[{Յilsajۙbnxcraf|Neqq}CAtYaSuޗkmnC}u蚑m䇘SisdbFOsbosfCtc~dhꇝoo}Kxe]e[WCzmTAוi|jIsr⛝bTzń}{məcl`h{e|섓Y`ye㇙~LP|wsԚa•hT_kokj\GYbFvw~噞qquMy~oSj{kexajia~WyZx}pvsnUla@ZClϝe~wegSaodroq뇒uayko섞g[dߚfe}kٚ`ousui`ᙔ^a솘wt_tyGpGdud۝hcasb{o焞Vhf|hk䄚Hrtpe{vnBhFwAchm\U睖iSzRtRdHe`KeQ|bpbfcӕf̅ib}lfmydvcyV~v`~JE}Оd~kbyw}f`dq琔ndw|{Jvqwr{lWZlksXCilUeojnwkihHqLmm曐Yg凚ZJo|金뛕SIpdiP왕晗RPbuEv{GrVzwg؝hhfg}nekᄞUnf|kk愚Lpvq{vhLiDuLohm]W᜖kUerZq^eOygKg\}cslfma˄nc~iʚga{vleJD`{L\gPSЄeXqϓlQlocufvi퇞Xm}mm慘}IsZmbrmSojvet`muGe燚F}^C}Tur`DqҖdlugxhǖ`nrfoe^dd`pfs腑XzwgjꆞaEcۘu[|e\˖bVE`lZqXivjvedᛞeF|Vkk~fhٙlkym|gdᅒevxᇚKqsttGvC`EޔTjjlOqKaq~f_~DrnegMwm|xmbTbd|{zfBDudh^B\⟕nꆟzIup枒cVz؅||cŜbcaeh|턝Tbz}j⇚wHXey|PbjZGAhhh]R]힔垗c燛@sKyKsNvdrb]j~f}ndklbdy~X{|}vk}k阕]LYbꆜa@QE矐mŸdτ~A`]cngqct釜u`slb턞dGxօagsiߚ`iqxwl`瘖AVfHqTF|NqMdOe֐a`v`o䇘jcpbiE|F}dfpmLi@~vbkm_咖l˙FPzMSdVvejaHfw}zs`hr兑fc}s\K]xCgIe\|`rmd넝i\e…kmped林kecnd{oaylᆘ@kwzf囘uppDhhgDh}c}eckk{tyY|G|C\wpbGҔkfjNpv훒lƐg|y`g]gbjyzpꄓBldeif[gߛyvrDžgmDRCckP_U柕btvw䙟~Cr\x|mҜihdjeyjej愜Vld{ᄚHsww|qwNmRDGikmZ]F㞗jgwxV{OzkdsbEpf|kbmT`cz}jacvpthdj옔WD\myIQF䟝dU}Ӆeuemmmaqcqh⇞Rk`|iiᄘ}trDfgrnTlFqKlokT᝔Zf䇅ZqVNLJqg@zUebqbe脒n`hb|ozRgefrlq隗[}I`ꆟgF咑bޞ[~τd\tΐ`[bicBxBk醞Nns`aㅙyGyYobrcӘlh|ap`f䛐vG{懛tvswYtBfPKݗco@|v隐bk|amR~@{coyftjOagil\b͘sC~eWfRBebTBSh놜yjIp|`Szۄ~doĞcnfnydx턒PazᄙyK|FqBqQcÕkV\jnij[N@왗c懛_vq{噙usIvhxei_h|iee`klg~{RdtKusilfLMJbےz̄pd`Vamz}nr鄒Miei턙eAzQgyqkܚ`iOtNic瞔Ta톚NwGqpOqFdvf֒kga}oem愞nfykF}C~zzpiJi[vCbjbXVl˞Td[}gAd`tfFv`vcafWaۅo`}mclgcpenܜYͅKkIAΆpɐMpnӟr{oCd]Ivl~ᄓdce`Hrplk~Ӟgх~vgڒOhmrztltj`ZEu瞓cۓf|vdfSalz~hq뇝MneyngXdߛd}pمamLNJj`Uផc↘wtFw垟~FpEzqaܝijgghgiᄞogk兛HrHpz~vkOo_HBokm_\៖iUd~BsTzOzgw`Gv`rncmWf…lf}nȚfmpwog훗KXa~OQ坒d[VsԅgC~Ɠoolbtfvh㇙]m|ml慘surOccrl]ntzwbnk擕HXdR}]^xVNg\qЗeluge셒oƖai~cifTggb`~酑Xzugf@fřuDygEˑbU[blGpFnukqdf暙|GsYoo}diٙoj~b}da䅒{v{燚HpptL^wubUGҕljOptjːapx`Qy[~lj~zkGub~enꇟcUa̛zpe`FXNgiS\Wo膟yuw}癝fXЅ|}`ğlnfjzi}ㄝQbz~ᇚwNpGxrp_lX[Zhki_QR잗`燚SstyJ}LszpcR}jd}h`ꇝicmgy~]dsqJi|jVDQb膟dAPD染bܒU{΄zKz͝cQbnasbw釜N`}nlℙzB|TadpnқckLpImc䘖[fᆚBqPHswqLdM{Ґfcqcjɗom}mhQ~EegsovkXrIckb[咖mž_y~WKf^gcMzGj膜vlvaf⅟aPg҅ho|bÛ`byfscd텓|Ld솘}u|AGUpZgMĖkhlnKes隖m燘QnsfbLquvoi|fXhwfpgno吔oL~\dEL{cGݔjdjO}}훝mёeɄjr{l˙fbchzr_fre퇙eFeј|u|ԅ`ϔiP^jmjk_BZ眕b㇘Op|drvqNjy~o՜hyiy~fkn`~~儅A}BsqHtpmUnc[YBiȝg|vegRdie|nuuhdjl釞a]gޅdpjÅfbJtKhfjQc솙|tYL瞜{Ys\ytgܒiib`}o~hᄟSig}hj䄚ustHd{qiFoFtAmhlS]杗kSdPs^v\xFyguaG{bslalܕfʄoaslg`zdqoxPp@`膙zCRgןSr݄d^vlTlocugqn쇞Lorcb慘~Ir[lbsc֛oqfq`b撕jqBe凅FpPOq^wq`XqזaoKd{i–`h|aoeRdacpfsꄑMgsgj놟`Y`ۘvF~ɄeQcRG`l^tYnvktzg曟d\|Ujk|ghܙlkdo|dgᅝgr{愛qJtOtEwI`]ĕjhojCvu협`q}gAx@}hy{hZ}n{zlꇜlbg||zfNDOgnV잕l{LNq晝aד~لsaŸmmce~k~턝Eoej㇘OxYzrqQcD@@hnkWP힔䞗aᇚFt@ruqIvewaS{a}ifꄒkbogj_xD{||tipk蘕PGRbaG\眓bßU{˄|D|f]`hft`J針qaslm턙zYeЅmaroޚ`nqytmf曑CWf㆛vtZy@vAeCzѐkkcbwa|l䇙VbqbiAFsacrbDkMxt`imR䒗oO]e~BUgAz`D~Ykipfd템c՗dąklr`kØacgm|`x텑Pxud솘xHzQISqЅd^ɖTinoA}H뚗l㆛\kqea䚘vwwtnh~gZi}m~dcjnyK~R~[~B\urmDԕkdJsp훒nÓgrxbfPabkxjq넓@c{hdCdݛ{vr҅gmD\@j`kPZ_៕b↙uvp{xMp^}m֝iekz~gk焟mey焚OvtswttmS__nmYRE㙑keqdRzGzjesmCsg}kb鄜cUfυ`esjȅfcvvNnd☔ESb醙~I]N圝eSrUyCxƒinmfvb}kᄟ[j`}nh煘ruqIfdqn^lAvHlnh᝔Yd凚EpPuDLrdF{SzmpmanڔfhcsmjdSaegvb}酗Y}Oa놞gX咐`ٙZۄ{UNȐbWmhcFy@jJoqa`慙xBsPio}cИlk}fvfa暐r@e懚usqt[N@aQuЗbnByq腒kcnqgm_xY{mnfJMgpdj뇝m^`sL~ea\XglPHSn}jKryfY~܄jszoǞmoahxez턝gs{ᇘrO}MrHv]`ƕkUVjknk[HI혖`憚^sseOwH|hyyo]|kd{bhlg|r{ʕ]dvHK~oTWoeMMtᙓbڒz̄qgΟ`bme}i}Bhdyhㄙ{@y՛g~qjКcnKwIhlT⟕垗a㆚OwZpsMpBewfVjdgplgjoUhakYpAy{xqiqhZuZbb[P眐m͟Q{|Z|ɝfGfjfJaLꆝq`pmc턟`Rdƅo`rlǚaorzubd⚑tEf톛}KP~ZUsDeSqĐikmbwarꅑo懘Tlrbn兛ustubcpbAhwewaoh䓔iJ^{U}\^{TN{`YsP{lJe{텝mܗzɄh|`kϘfS`dbrf脐[dtedFeՙqErׅdXƗl_lkn[vGꚔl⇙Jktyd皙}upCkkdkQi|mrz`hdw~燅ErO}HZwpcRܕh`OwIid}y`UdYdlx{kNꄓNl{{i釟a_a؛drr̅gʕmBEB`nVbsuHq晜dXr_~rbМokgdk{kᄜTldx焚uwvKxrvDm^Z_nklZRD㞑kg凅VsBsZxAjdpcE~a}i`뇟m`bgsk˅dayqhe[Wc醞eBF䜒gݟDŽyAϒlUmoaqbsjFcsmmㄘ~urD`asnPmtumbj杔Ed燚BqFHpItgAyՑemw`e酓i—mbpciPePdgasbpDxuaaYbƙC|{Mɐ`^acF|Ej醟unpfgㅞg\{Յkn|`٘mhx`r`cㅓTzKeuvrODuGaCޗkboFrt酑c凛WhpecD|K~li|gCqc|fillyvy~gDUAzlW@Wi~jIr~ᛝaבzĄsxl͙bb`hye~섒[c~x⇘xBx^uvVf•iSYjnk[AZ圕bᆛ[wqewtIuy|mPykz~`hn`yrY|GzvtJ}oWWl`F[Coĝx|wd˜`Sandsmu뇝Mhe|i℞g[{ћfzrjۅcouvOi`Sf솛qwRI埜~MqFyMdђjj``rln䄞Pka|hF|KwggriOnDqBbhmY]䝖nZeU}TKdDefKgDym|mabUg„ocpmΚabyfsmz⚖TvGg{uTxQY}UzWuiTilbIewi㇞Coqam䅘svKIll|bZnvfpamjiwX{[sVC_IuaQJחzlN{y셒ođfkranf_galya~腑OasgfEfݘwZpمeW˖l_ajo_tEꚔm솞wjv~d䛟{Ar^jjehԟhj{n{ga煝a|y燅Iqttt@wu`ƔVhj`hXLM옐hdpra_zXynyxkJvidxnlV`˅f~|…zcLALjgn♕m醞}N@w癜dSrӄ~paǜln`g~hxFig~jqpX{}vjEmEOGonhV힗d䇅_s@qA}I}zJf]e`}i`脝obogsiz\gxytizk뚔QC_cdG]䜓bڞryG}ɒaPbifufJ釜Ncrlo慞e@yAlb}nכmhtytbmᚐtXguvYsuLCgX}ѐamuf}ꄓ˖blsbi]}@cm|mvjAev`jm^哖m˙KS|zGȑaYgbZrGksnwddfSzׅknsa٘cnem}fdㅐQzIz↚pI}FNYr]f^khloGqK隖m[sdcJquqnkgArm|ebhn{w|\zB]L~l_ӕnejIpr㛝`Ǔg„rcʙaccj{e~Bl{z쇙dCdPywqхaΕiF^FkcjkSR\䟕`㆘KwtxvMpGx|mVkgd~kgn䄟mzrZsA~rvwjvoWXXocEPEo˜d}HzdZdhdrmuꇝtgsimcXg`drkۚglq}wng☗[a솘}KQHy^}\~Gxٓhh`apmiᇞ]kapln焛tqwtgdpoBnO}LcioQ璔jE{U}\vS{OygFx]xmv`dlݔ`ȅjmpbdUazasbe_}Of膙eIfݞ^sمeVtƐo]bibL{Mh⇞Lowab皙rHs@io}`Wnqgvfbk䅒|Ne䇅@vHrYuwaNחahJ~sh͑`jpdlz_ebn~dofcbocgM}H퓙RpJa@glJDk{yFla~ddlhlnjkjkjikilmohmmmbickahigoacafadckelneicxhaeeej~dnramrcasmzvlkshirlw~`tdgtazucisNmlttobu}hfF}kjzG{h}EdnvFabOFcjaGNljdZwnke^}inpPilt_dkc@Sgig\[`ieRLlix]wolqwmcCsmf\yleWdlySfbrEcmwIb`BwbgRqcxcecpQf`I^ffDC`dSOaxvas}at{fLUeg[]gdS@f{Mdqvft}gC|zRyyQeXeqMdtwdMsz_}x|VzpYxKNzBtx_sypv~pV|IYxMO~]H}qsqtpLLY}]EsurJuvHq@V}[[sUGqJquNwFpYvVDrCtuuqIvEwWSvEqNtNMqMJRuVtGtLIKMt[tWNVuOwNLJDuRwUUH\uKwHAKRtPu]tFJHNu[CJSvSL_AOBK[BIRw]MY[C^ORKIRuYCY_F]NVuUTt[tDLXV@Sp\u\u[NGAO_KRvS]sXuXBAFKAIPqUVt]MXGB[u]tPUv_uDICMIZt]qQSv@qOwwKpFr[SrP[qIpttvIsCTr^\p[vOwwuqBp[sP^q@pwpwKpC}X_|SMrIvqvrKsDTr_D|QI}uvqw}Ls[]|R[pHrwwpJr@pP\}WFp@uvupIrGVrQErTK|vqst~uU~AAx[JxRv|r}|wVxuExCMx^t~Vs~sv|tQyLXYO~QNrqqvCqGr\QqZvHqvtvCsF^xDF}UM}p}p|IVxOBe@uyTur}}ypU~OR~CHeDKwr}s|K}G\|YM~SNpJusw}@p_]}PNupuHvM}BVrSE}VK|vrpt|JQyBZy[I{Rvps|w~HT}XF~]O}q|rvsOrDVrPG|VLquvstrB}Z^|\M|Kpss|u|L\XC~XvxVs|r~tVyMY~^OySwss|v~K][]rVuxVwspwsKLPrRErUt|pprw|IPxC[^N~Wqssw~KX{CC]w{P||pyw\{K@{DOyRv~rr~q~HPACxXOrwspqywL[y[OySu}wpsyuT~AA{[KyWt|psyqVztEeLHzGqxQ}~yrUxqYzK@zFMQpyQrqxwZeHL{[J~Ws~s~wWyIF{@IySu}s}syu\yBMeBqe]q|}yvW{tEeOuzDp{S}y~sWzrDzJCeMqdEsyUyqyuGeHLxXuTq}|rxvR{IE{Mvg@v~}~yrWxv^{LFxYwe^p}|zr^ewAeLNzEpxQr}sTzr@dwM{Dux\r~}}~qVxw@dtI{[wxP}~|rzp\euBeBu{Xr{V}yrSepGeOM{DpeYpy|zr_etBeIJ{XvyT|rVepEzIOzAHxSr{V|rv]evAeIueFv{P}x}Uzp^euOdBu{_pxTyy~sVzqFeuudCv{Qq~y{p^dvOeIHy_v~||yrPepDeKOeFJyVt}||{sSxwBeIARwyTqrr{pYetF{FKyQt||~~sVxtDzHM{DtyTp}ypPztCeNu{Yq~Ts}ysyt_{OAxEtz]qssxsW~I\xAO{[vyws}sxwQyIZyENy]qyps~rVxt_yCCyXv{Pq|pv{p^eJDy@LPwV}}|pxvX{MDSO|Tv~}}~vWxJZ{@F|UN|s||syvSxOZ~_C|t|}|~qTyu[x@Lx^H|syrxqSxIExDOyRJs}sV{tS~B@{ZuxQppppQ{uY{FA~]txV}~sw~vQyBDxEuxQvU~y}vxuXxLCx[uyTs|rpyvT~MZ{Cu{^J|pr|pyw_{L@xXuyQvrvv~pWyKX{MKzDw~Uqrrq~tPyMDx[H{Yv~pspT{tGzIMxYu~Wp}p~wYzKX~DOyRu}s}}vuZeIMxXJUtrvUyuDzCBy]tqry|H_eKB{ZOx]qysr{}T~O_y@@xYt~q}}s~vS{JDyZ@|Wu|s}|qyu]~BEyZuyTq~yp_ewAzBM~^us}|pxw_xBGxGKySt}}}ysSzwXxMCxYuwr|}xvVyL]XBy]t|sr{|V{v^xMFy[ITq}spyv\evZyGB]wyW}~}ytRyOA{FM|UqyU|}q~IXxLB{^H}yy}uWxKFzCKyRur}~xs~ISxLOeDuxPprryqWyKX{BHxYts||v~t^yLY|\L~Pp~rpysQ{t_y@C~]H|W}yp~v\zuE~[B~]vs}~pxt^{LB{ZtxSq~}{vyHYyEOxXv~Try}ytP@D^L~Ps~U|rxsSxISE@y_t~Q|y}v|uPxOE_MVw~U|qu^xMAx[txPp|s|tSzt@{MNxXp{Q||~s}HSxJNeGux\ryT|r|wWxKXyALyYt|Ts||p|KS{HG{AuxYv~r|rwxv[xMLxZtxWq}rq~wS{JFzMI~St|r}ypxt[xMG^uyRp}}rxpPyJE{MO~^vx]|~rqxv]{KZ~_L~Pvs}}q~uZ{M@|Rt{Sr|p~tU|MM{CN~_v~Trr~p~K]~BOzGtyQq|rpyqQ~KXyGMyYv~Uvprq~w_{HE^KxYrxqv}qSzwXx@Bx[wyPq}sv~v_zuGyGNyXvyQ|}vywEeHO{XI~TqrsvTNE{CM~\tTs}}qytP~NGyGJ~Qt}ss}vVyJ]|EMxEvxQq}}sUxq\xKFxAHyXrz\rr|vyt[xLF~^uyRp|pv}tPxu[y@BStWp}sw}u^{JB{FK~Rp~pspPytZxLHx^u|p}rqxv_xI[~[O~Su}vvrvWxvExNMyZJyQvrqqqRxtDzCBRt~V}}qUyvRyNAxZNus}|~pT~KA{NOy[Kq}rq~wQyIGyFISt|qq}w~J_~@@yZtxRppqsuWytZxGB~Xr{R}||qrKS~LNz@O~PqyT}rstUKZ{NKzDuUq|}rrH}ACxCN~Rvwwrvu\~MMxDtySwrspqXzwEy@NyZwWs}sqTyv_xLFyEH~Pw~T}|}wT~uZy@FRH|Up}pvrKPyNE~GL|Pu|T}}q|H]~@@yZuyRr~U}s|vU~HDx@KxZv{S}~sw}uS~MZ~ELPw|}|~sW~JY~@A~^K|Qq|rqruQyIYFL~\Jrqrp|HY{IL{AJ~Qv|}}}tVxtE{LNy^u|Tp|p~v_xIFyFIy\wpppu}IS|DF|\u~Rp|rq|wTIY~DL~Rt~Vr|}pUxv]~BG~[KyRq~T~|~vVxtXxBNyXu|Tq}svw_yIAxGOSw|ps~qVJS}GG~Xu~QwprqwRxKZZM|]t~Wvp|sVyv^xHAx[N|Ut|r}~vPxuZyMAXJVqs}p~wX{JOzCI~Swrrr|v~u^~BCxEt~Qvr}s~vVHGx@N\u}qp}pytVA@{GHVw}}}t}N[yMIyZu|qry}|uWrMD{BJ~QKpr|q|H\~CByDwy]p}|r~qV~K[~FJyYwUwqptwR|A^r^H~_q|rp}wU~K[yB@\J~Ps}}p|JS~OGxANPt|U|qsNSICyDOsws}rwTOYGN~^urqr|rQxqS|@F|Zu{_vpqvRyu_|GA[w~Psssv~q[{JDXO_s~VspstuY~BG|^u~Sq~spruW~JGyALRu|rrvqBQBCyEuy]v}}r~vOY~Lu{@w~Qs|~r|tR~LDyDtz[q|qq}wWJ^yLMyEuSvrpv}u}CXDM_wqsrpU}J]MA~EtyPv}rsrtT~KZyMO~YtQqs|p~t\yIE~DLQv|qprvWH[~BC|_O}Tt}rs|tR~u[yGL~_ws||pJ^xNBx[u~Vw}ppxqVI[yBL~\J|Vpssw|uQ}FEZu~Qurvs|qQ|JRGGPJyPs|pw}v]yO[}[Hx[vV}rw}JXyLB~YH~SqUrvwRIZAO~Ew|Uqrs}OP}A@yGu{\wrqq}wTNS|ZLxDtUv}swrJ}EY|ZHy^qqs}vK_CA~Xwy]s|r~vP~O[~GL~^u|Upsq}NS~MCxEKPqTsr|w|NX{OHx[t~UqrrqtW@DyDt{Yq~ss|vW~J_~MOxEtyPp|rqtR~I[|XN~]vTss}vKS~MMxZI|Vw}r}|tUIXyFOyYw|qrrytP~M@xGIy]v~UrrqSxt^GBxZvySp}|syvRxHX^N~_vqp|q}H_xLDx[uxPp}r~qQyuZzCNy_wxPx|qwXzND~EJx\px|~qUyuY{I@~\ux]|xpyvReuExEBy^qxr}|q~uXeJNz[IWp~}rwxt[{BL{Xv{Vrr~uQxKJgHJ{Qvy{ryH^xLHeFv{Qr~|{pxNZ{Mte[s{qrx}Pep]xL@dCwzPp~ss{|RdvEeMIeZqeR|ys{v_euBdBJe\px|~s{t\zNLeFwzR{xxsWetGeCKe^seQxzep]dHAdDwdY}z}ypewXdMMeEsdRyexr{v\etBdLue]reTx{e|zwZdJKg@tx|ee{zsUdtCfHtgYqz|xexdpQeKOg@teTpx~~dRdvXeMIdDsdV}{{~esPdtLgCuePrdWx{e|Tgs_dN@dEqdVyeezzpWdvAgBIe\qeWxeeyd}_eHCd@wePre{{z}UdvZgHLeEsdRyexd}XfwDeDtdXdy{d~UdpXgHNgFvdSxgezerdwFfNud\seyeexepSdKOf@wdW}deed|dvDguwfA|gSyze{grSdHCfNraEd{zdyWgsYdIOdZqgQ~d{{f~SfqFgCJd]rd{deygZfwIgGtdVygeeg~WgpAftwfAsgV{gdzf_fwLaMvf_|dxee~gp]gIOgFa_~d{yg]fqDdCwf[}gxze~ds]gJCfDqa\xaeed]fs@autaD|aP{gdzg}RfvOaLqf^geedydpXfJua@raP~de{d|Qgw@aLvaDyaWeddzgs]guOaMsaY~gzzd|fsDaHua[|aS{de{g|_apI`IvfSfeddygqX`vwcLsfQxfgdg~VasC`tscD}gxggea}Y`qH`Nr`XyfedazQ`}D`tw`@raSxgezf~PapA`Nv`X~f{ddxfFcpJ`Bpa]xgzzf{P`}AaOJf^|aQefgeayDcsJ`Nvf]~fedg{W`|G`wuaErfV{fddg~R`sL`uq`Z}feffef|^`pucIpaPyfeedxTa}EaJu`A}aRzfdef\`sL`Iv`Zyazedx`yFcsucOr`RxfdddU`|ObvpcB|`Vzfgeay\`subus`XxaUeddyf|E`vt`B}`^eadedyQarCcJuaZrfxgdxf|X`pMaBwfPygeedfsG`ww`AsgT~ggdf{QfqB`KpcFx`WzdfdS`~Gaqu`KraSxfeefxTfsDaHJf[rgyedzg|RaqBfMtgSrdxed~frDauHfGqgygzzfz^arAaIwfZ}g{ddxg|E`qNfBpaYxgeegyParMaJufEsgU{ddxd}^fvMfMqf_gedgxWfsEfuJfDqgVxdezg|SgwAfOvfYseyzgyUg}ZfuKfDsf\ydzzgy\fsFfNwfDrdxedxgr^fuNaAsf_dzedyWfsEaIufYsd~edzTf~[aqIaOvfYygzzgxR`|C`ttaBrfWxdezg~YasIaKvfYg{ee|f|[atuaFvgUd{{dSasL`tvaXrd{dgeUay@c}u`Jr`YygddgyVfr@`tvaF}fU{gexf~_apH`IvaY|gzeg{gr\fKNaGsaWygz{g~QapM`tuf[}fzgd{f|_avLaHra^yfddgyUfsA`wv`@rfQxgdeay]asLaNqa^fxedyf|_fuI`BsfQygedgyVfpCaHvaX~aPzddz`xD`pJ`H}`[ygedgx\a}BaJKfYrfzdexg\aqCfMpfP}gzegyfs^fuIaFsaS{feegyPfpOaOvaZ~fzgfzdrXaqu`Cra_xfeedyVgqDfHufDpd{dexgrWguK`Hq`Dyf{ed~grEatKfFsfSydded]fpCaHvfX|fWeggzg|ZavHa@vgS|dz{gTgqM`vvaEsfWxddzf]fvI`IpaX}d~{eyfs[fJuaL|a\xg{xgyRapBfHwfYfWxeeygr^ftMf@wgR|dzee|frB`vtfDpg~d{xd}SfqI`upaXrgU{de|grEaqu`MpgPdzzdPfpGgLJfDrg|ze{g|\fwNaHvfPrdedd{Wf|Datta@sfSxgded|QfsJcuug_rfTedd{Tf}\gJCfFqfS~fgggy]`s@fLKf[}fTydgzfSfwLfMqfPreeeg{arZauua[pg~ededrgt@aLva^f{ddxV`xFauNfGra_zfezgyX`}CaItg\sgzddya|FcsOa@vfPd{xgyR`}C`wvaXrgee{fY`pucJsa_}dxefeRa}F`wt`[wd~ddeg^`rNcJwf]}g{dfza|ZawCgZvgSygdegyVfpZfCJf[fWzdd{d|YgqXg\t`}edgaeXgeMcpp`LpaDxfgdaxRavBfNHgXrd{eg{f}]fww`MqdPyfddf{WfqCauug[sgU~e{xf^apMfMudPpex{d~gp^gLBgZpgTd{{g}WgwFfIqg]rdxzdxgsPdJNfAtgS|dzed~fpCcwufZrfSxgdzdsQfvAgCtfY~fUeee|Tgr^gHJaC}`DzgedgyVgvAfOwaF~aTzdg{g}Z`pu`Lpa_~ffgg~fqEaHt`ArfU{gdeg|[`rLaMvaYf{ed{Pa|[aKIaDsfP|eeeax_apAfOug_a{dfe`yEatLaAsfQygeegyQarBctw`DrfUzgdxfYaqH`MwfSfdgg~frAaOLgFrfSzgdzaz[avZg@vaX|f{egxUa|^fHBfDpfW{feed~PfpL`uwf[|fTxeg{g}^fwHaMpfPyaTfag~UgvCaNIfD}fV{de{g|TgJ[gGva\xf{zgxgsYgMNfG|`Rye{{gSfvFfBwaX}fzdgzPf}[fvu`Nsf\~dzzd|VasO`uvg[rdVzgeyfrE`pHaLqfR|geee|Wa}ZftNfA}aQ~deeg|SfpMatwaExaQ~xeygsSdOHaH|aX~gezd|Qgq[fJufD|aPxdz~d}\avBaMpf_|fze{rdpGaqva@sgQygz{d|]frJ`wva@~fW~{d{gr_fwCf@qf\rz{zdyQgvXfJv`@qdyeeyg\awBfMtgPsdydxfrD`pw`Bra]xg{zg~Vfp@aBKg]veefe|fyDfu[dDqaY}dedgyRfrXgLNf[rgV~egdg}WgwZgFwaDxaUzdgeTfsYatKfEqgWygdze}PgqDgNvaZ}gzdz|dr[avu`Isf]yg{{d~VfsC`wwaGsg|{dzf~Z`s@fMwgRrd|zWa|^fIt`IsgQeezg~Y`|H`uqf[}g~ze{gp^fwNfMpa\~gded~V`|AaJufZ}fTedzax_avBaIpa_~fWedgygs[fHCgEpfQeezg~TdtAfIwaYvzzdgxg|Ec}u`Osa\{fddg{\`@`vp`AfSxdeefyFc}IfLvf^|d|~e~gs^fJOg\H{sz{xg~]fp@fIvaXrdzeef|^gtwcJpgW|dddg~arIcsqcOxcXg`Wfd}\~JwQmisecYQhogaRffTarxcv|bDdddzdrQ`tLgEtcZtd|~s}Zgt{CKxQJgvxdgdsfpDfMt`My`^dfadgpPctausc^ggVzxaxerzBCmwnu{EdaWQgtUluPgHEeptbDv}BzH~|LgUygWexSdbf^otYeZueedV`gbp[m`Fm~^aB|i@efdxagbf~otrarOgC`idvJq^gzvfOpmUfYzxg}LCbtulqpg|cUfeTdtW`vZgqqo_dfAd}ffng^awpm~EfSaed~dwEnqDbOrbKvezgx|{zZaxsbCMzSpf[dac~Tgp@`ptcD~{w|g`gwYevAcqrb\~eegge`r[fwIfqs`_~{gdSgdPcJ^`JrcAwg[ddddyUgpIcCsaRvd{f`~{vDcJB`YqedffzdrLgvZ{Z}cZxfxefz`t_ftOdAraGdad{d|VfJMfFpf\wf]y{aeTf{fvOfXpfS{aegdxQa|\atuc[pdeee`}[`sucvpc_fdgezayLaICdDwf]~xgxf~Tfpt`MKzUq{egexWf|\fIKcAwdSvey{`xPfsEftwfV|dgfe{WcyMcqOaKwaY~gyzfegrL`wHdYvfUxdg{g{YawNfXudPgxdd}TfpdKEfErfQydee`xRgw@fIuaY}fU~egear^duI`Itf[ge{{~QcyEgKvaGqgreezv]`pO`CpgUfUeed|gqY`pJfYsaS|d{zg}UfrCfHtcZfW~{degr^av@gFwaD}e~dya}@atKgZvgPxgzxd}^fwK`BwdUqdxedSf|ZatKfYpgQ|dezf}PgwXdEu`Ey`P{ee{fs]ftGdGqaXeaUedd}zNRfM@dRpgVefg{dreuBfGwd]}fedgyPduXaKLgZsfUydged}etB`utaF~fQ{de~dq\gJNaLqaY~e~}zsgsGgOtfGsgQ|zeyeqPdKFfLqaX|ey{gygpZfuNgEsgU|deed}PgtCgBMdYsgy{egEfuIfApf]|zezdQgqZdAOeYrd~ez~d}XfJFg@wg\|dzdg{Tfp^gHBgXwdW|eezdsSdvBfLIeQse{edeQg|GfuHg@weSsx|dQfsAgItf\vezzyf~Ac|HaNug\q~~ye}\f~@aqtaCt{rzx~drZapLg@ug_rdrxyevGapLg[KypzyxgxPasLfHIdEw{}{exWa~VgwOaIug\sex{gx^a\gwJg[sdQxyUa{RdwXdCwgZqds}x}dsXfwNeZteVszxyd|PetXgOMdYwdVzdy|dpWgwGfLraX}zx{rWfvEftKdArfX|z{xzpQgrNgCwf^qeT}yxUdpQeNOgFueW|dzeesepM`vJgZqesxeeTg|XgvOgAweWvz~~eQdsYdJNdGpdP|e~d~^etGdBOeYsz|xexQa~^gHOgFtdTrz|d~UgpH`tufGvdWrx~e}^gqJfNweUw{xezsevEgvNdBqeS~{d}VduNcqtd^qe|}y}gsRgwCdErfR|zsrzrUgsZgHuaOrgQ|e|xp\gpKaNtgSsdxez~Pgq^dICdYveS{gU{~eqdtEeZCxWqeT{gdzWgYduFeXNeVpxzez~Vf}\dA[xVKysyeePfx_gKYzZwgXvxzeeyev[guKdXsgY}zz{g~QdvAgItdYsdy~}es\dICgFwgRsy}zrd}FfJKf@pgW~z}eqWgwBaIvfAyd|~~sTgp[guwaLsfQ|{x}xvdtAfNud_rd{dezw_gwIfOtd^}gxxeyJRdMFeSqgW}e{{e}Rdt[eDtfZyfU}~{|TdpZdOLgGpeQ~ez~yqTdwFgIwgXsdQxg~{vztGgCvg]|d{zerdqGfIugEqg\{de{dsQeH@gLvf]pz}|x|PgrXgLLgCsdQsx~{}PdHReXufZrdv}~esTeK@dCrf_ygT{{ePdvAgHudD}f]{de{es\etMdDHdYyfPdgd~dpSeLDe^tdTeyy{wy@^eEHdP}dW}{z~xvUeOCdFvg_|gezzpeJYgJugG~f]{gged}_gwBfNra@rdTzed|drGfvugEvdWdyyxwdJEdCJg^wz|zxsyvSeLFdYvgP}x~fyWgvGgLtdEpz}~xyPfx_gqtcusaErdy{eVgrMaqvaApgS}zx~xpYaqAgCJgYre|xxev^dIZe[qdSs~qveVdqAftwd_ser{yyTdrZaqu`Jwg^eyxdPfrFavugZve~eydr]gpFdEud]v{yee}dp[duGzZJePpy|z|QfpFgNufEwz}{zygp]fuOfOweUq{xxg}RfrEgOwaApdWryzeWfxSdtFdDHzQv{y{{|Tg~[guMd@sgPsz{{er\fvGg@Nd_v{yz{|esRgtCgFvd_~d{e|dqXeBKfApdP|dez{qVewOaKsfE|dxx~rf|[fwJgBvg_xgWexzsVdJNatpa@pdQ{eyrywRgvIfGpf_}d|zrdtYdKOgDpdWs|||z|]gwBdLqgYt{}ye~Qg}FfpwgNpgP}zxxerPgructugYwz|yedp_gtBdGqgY|{~y{dw\{GDe^pdQszy{ep]dqZd@tg_}fUy{e~ev^eLLeEteS|eUd{xpgw@fuKgDsdQxey}teIFdBJd]peyyz~,* :")ْ** k;)21*!-*(//f!(# c5;4'0 ߉1s ->36>3nd< ؃I$b=7 +l4f섵ocݚD d:&"?/$&#//& H:5./K`"5.2>" + %=-'*<6*,*+&)*#-#<6ŵ,?e0/<'0d$87$)2 d n768==75&,0°삳p~ 6& 2:0蛇46%&m\j=~l`@Lu㔈Xmu|<6 33j qa{Yc鑚OxԄp 򐙈CΓ4$1.*#6 ja=%.*.=i#r3"4v">/k$%<$(,醰·C}e{alaj +a 574u07k =77?73>4 <95 9957;> 0:> =%? >%< 48$26%%3 0%%1=$:6 +?';749'947;'?41%$<43%$242$%34<$%17>$;678$976;$>70:$<43%%242%%04<$;17?$811>$>03>$?22>%=<=9%=929:<8298>;2898:389%;399$83>;'93>%'?0?$'<0>''<08&$=3%&%22$&%2<'!:3?'&839&&>3;&'=0;&%30:';61:'?56;%3 6;;7 68>69= 6>01?41=13i11m14f1 og 6 rb7_h 4 + + ~ + +  dCדd h   itudiHTdk|ڇGggCwobqρWeglZYhb}jچ恕}liuYgdWsolp†^faiOBh`xֆynjpφAaf_|in}ӇDeahHtkbeׇSyir†B`aXxkhӇOd`kItkbeWV{bnsφKca\ehn|ӇNd`jJʇthbzWSemisqaaXdhi~Ӈ_d`qʇqkm{׆Remnqt``P}ni݇Xgcvȇqkm{׆Rebhvχu``Vih|݇Yg`vqkm{҇]emhv̇wmaSnh|߇Dg`wvkm{߆_eckvɆvm`V|ih|ŇDf`vpkm{܆[dbkwvmaQyik}ڇAf`wpkl{نYdbkwˆMlaWyik}ڇGf`Jpkly҆[gbjwMlaPxhk}ۇCaau|koyކ[achtLoaUzijLJC``[~kox܆G`chuNneV{i}ƇB``[hiׇFecktujbeWQyi|B``[xhi|҇Ce`jKukmeWS{i|̆O`a^ehn|чOe`jJtjmeVWzmnsƇvaaYehnӇSd`uˇtkmeVSzmnsu`cRrii~݇]d`pˆvjmzֆRzmnpÇt``]rii߇^gcvqkm{ӆPemhv̇w`aRNsoky҆ebNG`jeֆpomt쁕e_CBAVZSY]__\_]^]^]^]_]_]_]_]\]\]]]]]]\]]]]]]]]]]]]]]R]]]]R]RRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSPSPPPPSPSPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQPQPPQQQPQPQQQPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQVQQQQQQQQQQVQQVQQQQQQQQVQQQQVVQVQVQVQQQQVQVQVQVQv ȋX Uj L雀l |㞁f f| lL jؗU XꚀi v왁c z柆z cv ȋX Uj L雀l |㞁f f| lL jؗU XꚀi v왁c z柆z cv ȋX Uj L雀l |㞁f f| lL jؗU XꚀi v왁c z柆z cv ȋX Uj L雀l |㞁f f| lL jؗU XꚀi v왁c z柆 \ No newline at end of file diff --git a/include/ifax/bitreverse.h b/include/ifax/bitreverse.h new file mode 100644 index 0000000..92e29e9 --- /dev/null +++ b/include/ifax/bitreverse.h @@ -0,0 +1,8 @@ +/* bitreverse.h + * + * Mirror the bits of an unsigned character so that b0 -> b7, b1 -> b6 etc. + * + * (C) 1998 Morten Rolland + */ + +unsigned char bitrev(unsigned char v); diff --git a/include/ifax/debug.h b/include/ifax/debug.h new file mode 100644 index 0000000..076fd67 --- /dev/null +++ b/include/ifax/debug.h @@ -0,0 +1,21 @@ +/* + * Debugging messages for ISDNfax. + * (c) 1998 Andreas Beck + */ + +enum debuglevel { + DEBUG_ALL, + DEBUG_JUNK, + DEBUG_DEBUG, + DEBUG_INFO, + DEBUG_NOTICE, + DEBUG_WARNING, + DEBUG_ERROR, + DEBUG_SEVERE, + DEBUG_FATAL, + DEBUG_LAST +}; + +int ifax_dprintf(enum debuglevel severity,char *format,...); + +void ifax_debugsetlevel(enum debuglevel); diff --git a/include/ifax/g711.h b/include/ifax/g711.h new file mode 100644 index 0000000..104cce5 --- /dev/null +++ b/include/ifax/g711.h @@ -0,0 +1,40 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * g711.h + * + * u-law, A-law and linear PCM conversions. + */ + +unsigned char linear2alaw(short pcm_val); +short alaw2linear(unsigned char a_val); + +unsigned char linear2ulaw(short pcm_val); +short ulaw2linear(unsigned char u_val); + +unsigned char alaw2ulaw(unsigned char aval); +unsigned char ulaw2alaw(unsigned char uval); diff --git a/include/ifax/ifax.h b/include/ifax/ifax.h new file mode 100644 index 0000000..956cd37 --- /dev/null +++ b/include/ifax/ifax.h @@ -0,0 +1,23 @@ +/* + * Main include file for ISDNfax. + * (c) 1998 Andreas Beck + */ + +/* + * ISDN sample rate. We include that in case someone want to use it for + * a different purpose like faxing with a soundcard. + */ + +#define SAMPLES_PER_SECOND 8000 + +/* + * Include all other files here + */ + +#include +#include +#include +#include +#include +#include +#include diff --git a/include/ifax/int2alaw.h b/include/ifax/int2alaw.h new file mode 100644 index 0000000..9721f1a --- /dev/null +++ b/include/ifax/int2alaw.h @@ -0,0 +1,7 @@ +/* $Id$ + * Integer to aLaw conversion + * (c) 1998 Morten Rolland + */ + +unsigned char int2alaw(int value); +int alaw2int(unsigned char value); diff --git a/include/ifax/isdn.h b/include/ifax/isdn.h new file mode 100644 index 0000000..41f9499 --- /dev/null +++ b/include/ifax/isdn.h @@ -0,0 +1,12 @@ +/* $Id$ + * Isdn abstraction layer + * (c) 1998 Morten Rolland + */ + +extern int IsdnCommand(int, char *,int,int); +extern void IsdnReadLine(int, char *, int); +extern int IsdnOpenDevice(char *); +extern void IsdnSendAudio(int, unsigned char *, int); +extern void IsdnReadAudio(int, unsigned char *, int); +extern char cmdresult[]; +extern char isdnerr[]; diff --git a/include/ifax/module.h b/include/ifax/module.h new file mode 100644 index 0000000..c6a1c3c --- /dev/null +++ b/include/ifax/module.h @@ -0,0 +1,88 @@ +/* $Id$ + * ISDNfax module layer + * (c) 1998 Andreas Beck + */ + +#include +#include + +/* + * The ideas here were stolen from the EvStack concept, that was developed + * mainly be me and Jason McMullan for the GGI project + * (http://www.ggi-project.org). + */ + +/* Every module instance creates such a control structure through which it + * is referenced. + */ +typedef struct ifax_module { + + /* This function destroys this instance and frees all private data. + */ + void (*destroy)(struct ifax_module *self); + + + /* This function gets called from the previous modules in the chain + * to handle the data generated. + */ + int (*handle_input)(struct ifax_module *self, void *data, size_t len); + + /* Use this to implement "commands" to modules like changing operating + * parameters "on-the-fly". + */ + int (*command)(struct ifax_module *self, int command, va_list args); + + + /* The usual place to store private data. + */ + void *private; + + /* The usual place to send resulting data to. + * Some modules (like replicate.c) have their own ideas about that. + */ + struct ifax_module *sendto; + +} ifax_module; + +/* A module instance is identified by that handle type. + */ +typedef ifax_module *ifax_modp; + +/* A module_id is used to reference a module class. It is used to create + * instances. + */ +typedef unsigned int ifax_module_id; + +/* Internal registry of modules. + */ +typedef struct ifax_module_registry { + + struct ifax_module_registry *next; /* linked list */ + + ifax_module_id id; + + int (*construct)(struct ifax_module *self,va_list args); + + char module_name[64]; + +} ifax_module_registry; + +/* This return code signifies failure for ifax_register_module_class. + */ +#define IFAX_MODULE_ID_INVALID 0 + +/* Register a module for the system. You need to know the constructor call. + */ +ifax_module_id ifax_register_module_class(char *name,int (*construct)(struct ifax_module *self,va_list args)); + +/* Instantiate a module from its class. + */ +ifax_modp ifax_create_module(ifax_module_id what_kind,...); + +/* Send input to a module. Note, that len is defined by the module. + */ +int ifax_handle_input(struct ifax_module *self,void *data,size_t len); + +/* Send a command to a module. Semantics are defined by the module. + */ +int ifax_command(struct ifax_module *self, int command, ...); diff --git a/include/ifax/modules/replicate.h b/include/ifax/modules/replicate.h new file mode 100644 index 0000000..3620d5e --- /dev/null +++ b/include/ifax/modules/replicate.h @@ -0,0 +1,11 @@ +/* $Id$ + * + * Replicator module. + * + * (C) 1998 Andreas Beck + */ + +#define CMD_REPLICATE_ADD 0x01000000 +#define CMD_REPLICATE_DEL 0x01000001 + +int replicate_construct(ifax_modp self,va_list args); diff --git a/include/ifax/modules/scrambler17.h b/include/ifax/modules/scrambler17.h new file mode 100644 index 0000000..fa40622 --- /dev/null +++ b/include/ifax/modules/scrambler17.h @@ -0,0 +1,12 @@ +/* scrambler17.h + * + * Scramble/descramble a bitstream using a polynomial of + * + * 1 + x-18 + x-23 + * + * As defined by the V.17 modulation standard. + * + * (C) 1998 Morten Rolland + */ + +extern void scramble17(unsigned char *, unsigned char *, unsigned int *, int); diff --git a/include/ifax/sincos.h b/include/ifax/sincos.h new file mode 100644 index 0000000..ffde186 --- /dev/null +++ b/include/ifax/sincos.h @@ -0,0 +1,10 @@ +/* sincos.c + * + * Simple sin/cos table-lookup functions to execute fast (not very + * accurate). + * + * (C) 1998 Morten Rolland + */ + +extern int intsin(int); +extern int intcos(int); diff --git a/lib/Makefile b/lib/Makefile new file mode 100644 index 0000000..68900d1 --- /dev/null +++ b/lib/Makefile @@ -0,0 +1,12 @@ +LDFLAGS=-lm +CFLAGS=-O2 -g -Wall -pedantic -I../include + +LIBOBJS = bitreverse.o debug.o int2alaw.o module.o sincos.o isdn.o g711.o + +all: isdnlib.a + +isdnlib.a: $(LIBOBJS) + $(AR) rcs $@ $^ + +clean: + rm -f $(LIBOBJS) *~ diff --git a/lib/bitreverse.c b/lib/bitreverse.c new file mode 100644 index 0000000..eb2fdb5 --- /dev/null +++ b/lib/bitreverse.c @@ -0,0 +1,46 @@ +/* bitreverse.c + * + * Mirror the bits of an unsigned character so that b0 -> b7, b1 -> b6 etc. + * + * (C) 1998 Morten Rolland + */ + +static unsigned char bitreverse[256] = { + 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0, + 0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0, + 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8, + 0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8, + 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4, + 0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4, + 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec, + 0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc, + 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2, + 0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2, + 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea, + 0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa, + 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6, + 0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6, + 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee, + 0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe, + 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1, + 0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1, + 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9, + 0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9, + 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5, + 0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5, + 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed, + 0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd, + 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3, + 0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3, + 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb, + 0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb, + 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7, + 0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7, + 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef, + 0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff +}; + +unsigned char bitrev(unsigned char v) +{ + return bitreverse[v]; +} diff --git a/lib/debug.c b/lib/debug.c new file mode 100644 index 0000000..d5dd38f --- /dev/null +++ b/lib/debug.c @@ -0,0 +1,59 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Debug functions. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include +#include + +#include + +/* All debugging info of a severity of that or higher are printed to stderr. + */ +static enum debuglevel debuglevel=DEBUG_ALL; + +/* Print debugging info. + */ +int ifax_dprintf(enum debuglevel severity,char *format,...) +{ + int rc=0; + va_list list; + + if (severity>debuglevel) + { + va_start(list,format); + rc=vprintf(format,list); + va_end(list); + } + return rc; +} + +/* Set the debugging level. + */ +void ifax_debugsetlevel(enum debuglevel severity) +{ + debuglevel=severity; +} diff --git a/lib/g711.c b/lib/g711.c new file mode 100644 index 0000000..bb42cd1 --- /dev/null +++ b/lib/g711.c @@ -0,0 +1,311 @@ +/* + * This source code is a product of Sun Microsystems, Inc. and is provided + * for unrestricted use. Users may copy or modify this source code without + * charge. + * + * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING + * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun source code is provided with no support and without any obligation on + * the part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * g711.c + * + * u-law, A-law and linear PCM conversions. + */ + +/* + * December 30, 1994: + * Functions linear2alaw, linear2ulaw have been updated to correctly + * convert unquantized 16 bit values. + * Tables for direct u- to A-law and A- to u-law conversions have been + * corrected. + * Borge Lindberg, Center for PersonKommunikation, Aalborg University. + * bli@cpk.auc.dk + * + */ + +#include + +#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ +#define QUANT_MASK (0xf) /* Quantization field mask. */ +#define NSEGS (8) /* Number of A-law segments. */ +#define SEG_SHIFT (4) /* Left shift for segment number. */ +#define SEG_MASK (0x70) /* Segment field mask. */ + +static short seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF, + 0x1FF, 0x3FF, 0x7FF, 0xFFF}; +static short seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF, + 0x3FF, 0x7FF, 0xFFF, 0x1FFF}; + +/* copy from CCITT G.711 specifications */ +unsigned char _u2a[128] = { /* u- to A-law conversions */ + 1, 1, 2, 2, 3, 3, 4, 4, + 5, 5, 6, 6, 7, 7, 8, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 27, 29, 31, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, + 46, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, +/* corrected: + 81, 82, 83, 84, 85, 86, 87, 88, + should be: */ + 80, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128}; + +unsigned char _a2u[128] = { /* A- to u-law conversions */ + 1, 3, 5, 7, 9, 11, 13, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 33, 34, 34, 35, 35, + 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 48, 49, 49, + 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 64, + 65, 66, 67, 68, 69, 70, 71, 72, +/* corrected: + 73, 74, 75, 76, 77, 78, 79, 79, + should be: */ + 73, 74, 75, 76, 77, 78, 79, 80, + + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127}; + +static short +search( + short val, + short *table, + short size) +{ + short i; + + for (i = 0; i < size; i++) { + if (val <= *table++) + return (i); + } + return (size); +} + +/* + * linear2alaw() - Convert a 16-bit linear PCM value to 8-bit A-law + * + * linear2alaw() accepts an 16-bit integer and encodes it as A-law data. + * + * Linear Input Code Compressed Code + * ------------------------ --------------- + * 0000000wxyza 000wxyz + * 0000001wxyza 001wxyz + * 000001wxyzab 010wxyz + * 00001wxyzabc 011wxyz + * 0001wxyzabcd 100wxyz + * 001wxyzabcde 101wxyz + * 01wxyzabcdef 110wxyz + * 1wxyzabcdefg 111wxyz + * + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ +unsigned char +linear2alaw( + short pcm_val) /* 2's complement (16-bit range) */ +{ + short mask; + short seg; + unsigned char aval; + + pcm_val = pcm_val >> 3; + + if (pcm_val >= 0) { + mask = 0xD5; /* sign (7th) bit = 1 */ + } else { + mask = 0x55; /* sign bit = 0 */ + pcm_val = -pcm_val - 1; + } + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_aend, 8); + + /* Combine the sign, segment, and quantization bits. */ + + if (seg >= 8) /* out of range, return maximum value. */ + return (unsigned char) (0x7F ^ mask); + else { + aval = (unsigned char) seg << SEG_SHIFT; + if (seg < 2) + aval |= (pcm_val >> 1) & QUANT_MASK; + else + aval |= (pcm_val >> seg) & QUANT_MASK; + return (aval ^ mask); + } +} + +/* + * alaw2linear() - Convert an A-law value to 16-bit linear PCM + * + */ +short +alaw2linear( + unsigned char a_val) +{ + short t; + short seg; + + a_val ^= 0x55; + + t = (a_val & QUANT_MASK) << 4; + seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT; + switch (seg) { + case 0: + t += 8; + break; + case 1: + t += 0x108; + break; + default: + t += 0x108; + t <<= seg - 1; + } + return ((a_val & SIGN_BIT) ? t : -t); +} + +#define BIAS (0x84) /* Bias for linear code. */ +#define CLIP 8159 + +/* + * linear2ulaw() - Convert a linear PCM value to u-law + * + * In order to simplify the encoding process, the original linear magnitude + * is biased by adding 33 which shifts the encoding range from (0 - 8158) to + * (33 - 8191). The result can be seen in the following encoding table: + * + * Biased Linear Input Code Compressed Code + * ------------------------ --------------- + * 00000001wxyza 000wxyz + * 0000001wxyzab 001wxyz + * 000001wxyzabc 010wxyz + * 00001wxyzabcd 011wxyz + * 0001wxyzabcde 100wxyz + * 001wxyzabcdef 101wxyz + * 01wxyzabcdefg 110wxyz + * 1wxyzabcdefgh 111wxyz + * + * Each biased linear code has a leading 1 which identifies the segment + * number. The value of the segment number is equal to 7 minus the number + * of leading 0's. The quantization interval is directly available as the + * four bits wxyz. * The trailing bits (a - h) are ignored. + * + * Ordinarily the complement of the resulting code word is used for + * transmission, and so the code word is complemented before it is returned. + * + * For further information see John C. Bellamy's Digital Telephony, 1982, + * John Wiley & Sons, pps 98-111 and 472-476. + */ +unsigned char +linear2ulaw( + short pcm_val) /* 2's complement (16-bit range) */ +{ + short mask; + short seg; + unsigned char uval; + + /* Get the sign and the magnitude of the value. */ + pcm_val = pcm_val >> 2; + if (pcm_val < 0) { + pcm_val = -pcm_val; + mask = 0x7F; + } else { + mask = 0xFF; + } + if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */ + pcm_val += (BIAS >> 2); + + /* Convert the scaled magnitude to segment number. */ + seg = search(pcm_val, seg_uend, 8); + + /* + * Combine the sign, segment, quantization bits; + * and complement the code word. + */ + if (seg >= 8) /* out of range, return maximum value. */ + return (unsigned char) (0x7F ^ mask); + else { + uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF); + return (uval ^ mask); + } + +} + +/* + * ulaw2linear() - Convert a u-law value to 16-bit linear PCM + * + * First, a biased linear code is derived from the code word. An unbiased + * output can then be obtained by subtracting 33 from the biased code. + * + * Note that this function expects to be passed the complement of the + * original code word. This is in keeping with ISDN conventions. + */ +short +ulaw2linear( + unsigned char u_val) +{ + short t; + + /* Complement to obtain normal u-law value. */ + u_val = ~u_val; + + /* + * Extract and bias the quantization bits. Then + * shift up by the segment number and subtract out the bias. + */ + t = ((u_val & QUANT_MASK) << 3) + BIAS; + t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT; + + return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS)); +} + +/* A-law to u-law conversion */ +unsigned char +alaw2ulaw( + unsigned char aval) +{ + aval &= 0xff; + return (unsigned char) ((aval & 0x80) ? (0xFF ^ _a2u[aval ^ 0xD5]) : + (0x7F ^ _a2u[aval ^ 0x55])); +} + +/* u-law to A-law conversion */ +unsigned char +ulaw2alaw( + unsigned char uval) +{ + uval &= 0xff; + return (unsigned char) ((uval & 0x80) ? (0xD5 ^ (_u2a[0xFF ^ uval] - 1)) : + (unsigned char) (0x55 ^ (_u2a[0x7F ^ uval] - 1))); +} diff --git a/lib/int2alaw.c b/lib/int2alaw.c new file mode 100644 index 0000000..5af236f --- /dev/null +++ b/lib/int2alaw.c @@ -0,0 +1,253 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Integer to aLaw conversion. + + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + + +/* int2alaw.c + * + * Convert an integer value to alaw-encoding as used in Europe for voice + * over ISDN. The input value is in the range: + * + * -2147483648 to 2147483647 + * + * This is equal to a full-blown 32 bit signed integer (two's complement). + * Most modern computer equipment should be able to handle this. + * The reason why the full range is used, is to make it possible to + * multiply/accumulate with integers in the application, and make the + * final (and maybe the only) scaling when converting to alaw. + * + * Documentation on this linear to a-law transformation: + * + * Figure out and remember the sign bit of the value to be converted, + * and take the absolute value such that the value -1 becomes 0 to + * index the tables correctly (and -2 becomes 1 etc.). + * If we didn't do this, The number -2147483648 would negate to itself + * and spoil the indexing. + * + * The resulting value is positive (or zero), and is split into two + * ranges, or segments; like this (32 bit binary): + * + * 00000000 00000000 00000000 00000000 (segment 0) + * to 00001111 11111111 11111111 11111111 + * + * 00010000 00000000 00000000 00000000 (segment 1) + * to 01111111 11111111 11111111 11111111 + * + * These two ranges index into each of four tables (two ranges, two signs). + * The index into the tables are found by using the proper bits from + * the (positive) value: + * + * 0000xxxx xxxx???? ???????? ???????? (segment 0) + * 0xxxxxxx ???????? ???????? ???????? (segment 1) + * + * The 'x' indicate the bits used to index, while '?' is don't care. + */ + + +static unsigned char pos0[256] = { + 0xd5,0xd4,0xd7,0xd6,0xd1,0xd0,0xd3,0xd2, + 0xdd,0xdc,0xdf,0xde,0xd9,0xd8,0xdb,0xda, + 0xc5,0xc4,0xc7,0xc6,0xc1,0xc0,0xc3,0xc2, + 0xcd,0xcc,0xcf,0xce,0xc9,0xc8,0xcb,0xca, + 0xf5,0xf5,0xf4,0xf4,0xf7,0xf7,0xf6,0xf6, + 0xf1,0xf1,0xf0,0xf0,0xf3,0xf3,0xf2,0xf2, + 0xfd,0xfd,0xfc,0xfc,0xff,0xff,0xfe,0xfe, + 0xf9,0xf9,0xf8,0xf8,0xfb,0xfb,0xfa,0xfa, + 0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,0xe4,0xe4, + 0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,0xe6,0xe6, + 0xe1,0xe1,0xe1,0xe1,0xe0,0xe0,0xe0,0xe0, + 0xe3,0xe3,0xe3,0xe3,0xe2,0xe2,0xe2,0xe2, + 0xed,0xed,0xed,0xed,0xec,0xec,0xec,0xec, + 0xef,0xef,0xef,0xef,0xee,0xee,0xee,0xee, + 0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,0xe8, + 0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea, + 0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95, + 0x94,0x94,0x94,0x94,0x94,0x94,0x94,0x94, + 0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97, + 0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96, + 0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91, + 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, + 0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, + 0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, + 0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d,0x9d, + 0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, + 0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, + 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98, + 0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b, + 0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a +}; + +static unsigned char pos1[128] = { + 0xd5,0xc5,0xf5,0xfd,0xe5,0xe1,0xed,0xe9, + 0x95,0x97,0x91,0x93,0x9d,0x9f,0x99,0x9b, + 0x85,0x84,0x87,0x86,0x81,0x80,0x83,0x82, + 0x8d,0x8c,0x8f,0x8e,0x89,0x88,0x8b,0x8a, + 0xb5,0xb5,0xb4,0xb4,0xb7,0xb7,0xb6,0xb6, + 0xb1,0xb1,0xb0,0xb0,0xb3,0xb3,0xb2,0xb2, + 0xbd,0xbd,0xbc,0xbc,0xbf,0xbf,0xbe,0xbe, + 0xb9,0xb9,0xb8,0xb8,0xbb,0xbb,0xba,0xba, + 0xa5,0xa5,0xa5,0xa5,0xa4,0xa4,0xa4,0xa4, + 0xa7,0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa6, + 0xa1,0xa1,0xa1,0xa1,0xa0,0xa0,0xa0,0xa0, + 0xa3,0xa3,0xa3,0xa3,0xa2,0xa2,0xa2,0xa2, + 0xad,0xad,0xad,0xad,0xac,0xac,0xac,0xac, + 0xaf,0xaf,0xaf,0xaf,0xae,0xae,0xae,0xae, + 0xa9,0xa9,0xa9,0xa9,0xa8,0xa8,0xa8,0xa8, + 0xab,0xab,0xab,0xab,0xaa,0xaa,0xaa,0xaa +}; + +static unsigned char neg0[256] = { + 0x55,0x54,0x57,0x56,0x51,0x50,0x53,0x52, + 0x5d,0x5c,0x5f,0x5e,0x59,0x58,0x5b,0x5a, + 0x45,0x44,0x47,0x46,0x41,0x40,0x43,0x42, + 0x4d,0x4c,0x4f,0x4e,0x49,0x48,0x4b,0x4a, + 0x75,0x75,0x74,0x74,0x77,0x77,0x76,0x76, + 0x71,0x71,0x70,0x70,0x73,0x73,0x72,0x72, + 0x7d,0x7d,0x7c,0x7c,0x7f,0x7f,0x7e,0x7e, + 0x79,0x79,0x78,0x78,0x7b,0x7b,0x7a,0x7a, + 0x65,0x65,0x65,0x65,0x64,0x64,0x64,0x64, + 0x67,0x67,0x67,0x67,0x66,0x66,0x66,0x66, + 0x61,0x61,0x61,0x61,0x60,0x60,0x60,0x60, + 0x63,0x63,0x63,0x63,0x62,0x62,0x62,0x62, + 0x6d,0x6d,0x6d,0x6d,0x6c,0x6c,0x6c,0x6c, + 0x6f,0x6f,0x6f,0x6f,0x6e,0x6e,0x6e,0x6e, + 0x69,0x69,0x69,0x69,0x68,0x68,0x68,0x68, + 0x6b,0x6b,0x6b,0x6b,0x6a,0x6a,0x6a,0x6a, + 0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, + 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14, + 0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, + 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, + 0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, + 0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a +}; + +static unsigned char neg1[128] = { + 0x55,0x45,0x75,0x7d,0x65,0x61,0x6d,0x69, + 0x15,0x17,0x11,0x13,0x1d,0x1f,0x19,0x1b, + 0x05,0x04,0x07,0x06,0x01,0x00,0x03,0x02, + 0x0d,0x0c,0x0f,0x0e,0x09,0x08,0x0b,0x0a, + 0x35,0x35,0x34,0x34,0x37,0x37,0x36,0x36, + 0x31,0x31,0x30,0x30,0x33,0x33,0x32,0x32, + 0x3d,0x3d,0x3c,0x3c,0x3f,0x3f,0x3e,0x3e, + 0x39,0x39,0x38,0x38,0x3b,0x3b,0x3a,0x3a, + 0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x24, + 0x27,0x27,0x27,0x27,0x26,0x26,0x26,0x26, + 0x21,0x21,0x21,0x21,0x20,0x20,0x20,0x20, + 0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22, + 0x2d,0x2d,0x2d,0x2d,0x2c,0x2c,0x2c,0x2c, + 0x2f,0x2f,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e, + 0x29,0x29,0x29,0x29,0x28,0x28,0x28,0x28, + 0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,0x2a +}; + + +unsigned char int2alaw(int value) +{ + unsigned int idx; + + if ( value >= 0 ) { + idx = value; + if ( idx < 0x10000000 ) { + idx >>= 20; + return pos0[idx]; + } else { + idx >>= 24; + return pos1[idx]; + } + } else { + idx = -(value+1); + if ( idx < 0x10000000 ) { + idx >>= 20; + return neg0[idx]; + } else { + idx >>= 24; + return neg1[idx]; + } + } +} + + +static unsigned short alaw2short[256] = { + 0xea80,0xeb80,0xe880,0xe980,0xee80,0xef80,0xec80,0xed80, + 0xe280,0xe380,0xe080,0xe180,0xe680,0xe780,0xe480,0xe580, + 0xf540,0xf5c0,0xf440,0xf4c0,0xf740,0xf7c0,0xf640,0xf6c0, + 0xf140,0xf1c0,0xf040,0xf0c0,0xf340,0xf3c0,0xf240,0xf2c0, + 0xaa00,0xae00,0xa200,0xa600,0xba00,0xbe00,0xb200,0xb600, + 0x8a00,0x8e00,0x8200,0x8600,0x9a00,0x9e00,0x9200,0x9600, + 0xd500,0xd700,0xd100,0xd300,0xdd00,0xdf00,0xd900,0xdb00, + 0xc500,0xc700,0xc100,0xc300,0xcd00,0xcf00,0xc900,0xcb00, + 0xfea8,0xfeb8,0xfe88,0xfe98,0xfee8,0xfef8,0xfec8,0xfed8, + 0xfe28,0xfe38,0xfe08,0xfe18,0xfe68,0xfe78,0xfe48,0xfe58, + 0xffa8,0xffb8,0xff88,0xff98,0xffe8,0xfff8,0xffc8,0xffd8, + 0xff28,0xff38,0xff08,0xff18,0xff68,0xff78,0xff48,0xff58, + 0xfaa0,0xfae0,0xfa20,0xfa60,0xfba0,0xfbe0,0xfb20,0xfb60, + 0xf8a0,0xf8e0,0xf820,0xf860,0xf9a0,0xf9e0,0xf920,0xf960, + 0xfd50,0xfd70,0xfd10,0xfd30,0xfdd0,0xfdf0,0xfd90,0xfdb0, + 0xfc50,0xfc70,0xfc10,0xfc30,0xfcd0,0xfcf0,0xfc90,0xfcb0, + 0x1580,0x1480,0x1780,0x1680,0x1180,0x1080,0x1380,0x1280, + 0x1d80,0x1c80,0x1f80,0x1e80,0x1980,0x1880,0x1b80,0x1a80, + 0x0ac0,0x0a40,0x0bc0,0x0b40,0x08c0,0x0840,0x09c0,0x0940, + 0x0ec0,0x0e40,0x0fc0,0x0f40,0x0cc0,0x0c40,0x0dc0,0x0d40, + 0x5600,0x5200,0x5e00,0x5a00,0x4600,0x4200,0x4e00,0x4a00, + 0x7600,0x7200,0x7e00,0x7a00,0x6600,0x6200,0x6e00,0x6a00, + 0x2b00,0x2900,0x2f00,0x2d00,0x2300,0x2100,0x2700,0x2500, + 0x3b00,0x3900,0x3f00,0x3d00,0x3300,0x3100,0x3700,0x3500, + 0x0158,0x0148,0x0178,0x0168,0x0118,0x0108,0x0138,0x0128, + 0x01d8,0x01c8,0x01f8,0x01e8,0x0198,0x0188,0x01b8,0x01a8, + 0x0058,0x0048,0x0078,0x0068,0x0018,0x0008,0x0038,0x0028, + 0x00d8,0x00c8,0x00f8,0x00e8,0x0098,0x0088,0x00b8,0x00a8, + 0x0560,0x0520,0x05e0,0x05a0,0x0460,0x0420,0x04e0,0x04a0, + 0x0760,0x0720,0x07e0,0x07a0,0x0660,0x0620,0x06e0,0x06a0, + 0x02b0,0x0290,0x02f0,0x02d0,0x0230,0x0210,0x0270,0x0250, + 0x03b0,0x0390,0x03f0,0x03d0,0x0330,0x0310,0x0370,0x0350 +}; + + +int alaw2int(unsigned char value) +{ + unsigned int u; + int p; + + u = alaw2short[value]; + u <<= 16; + p = u; + + return p; +} + diff --git a/lib/isdn.c b/lib/isdn.c new file mode 100644 index 0000000..972e1f0 --- /dev/null +++ b/lib/isdn.c @@ -0,0 +1,207 @@ +/* isdn.c + * + * Implement all functions needed to talk to the ISDN-card and send and + * receive audio. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CMDRESULTSIZE 128 +#define CMDMAXSIZE 128 + +char isdnerr[128]; + +static char cmdresult[CMDRESULTSIZE+2]; + +/* Open the Isdn-device and prepare for audio-transmission */ + +int IsdnOpenDevice(char *device) +{ + int isdnfd; + struct termios isdnsetting; + + if ( (isdnfd=open(device,O_RDWR)) < 0 ) { + sprintf(isdnerr,"Unable to open '%s'",device); + return -1; + } + +#if 0 + /* What is this? Is it needed? */ + if ( fcntl(isdnfd, F_SETFL, O_RDWR) < 0 ) { + sprintf(isdnerr,"..."); + close(isdnfd); + return -1; + } +#endif + + if ( tcgetattr(isdnfd,&isdnsetting) < 0 ) { + sprintf(isdnerr,"Unable to read terminal settings for '%s'",device); + close(isdnfd); + return -1; + } + + isdnsetting.c_iflag = 0; + isdnsetting.c_oflag = 0; + isdnsetting.c_lflag = 0; + + isdnsetting.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD | CLOCAL); + isdnsetting.c_cflag |= (CS8 | CREAD | HUPCL | CLOCAL | CRTSCTS); + + if ( tcsetattr(isdnfd, TCSANOW, &isdnsetting) < 0 ) { + sprintf(isdnerr,"Unable to set terminal settings for '%s'",device); + close(isdnfd); + return -1; + } + + return isdnfd; +} + +void IsdnPrintChar(char *what, char c) +{ + char tmp[32]; + + if ( c < 0x20 || c > 0x7e ) { + sprintf(tmp,"%02x",(int)c); + } else { + tmp[0] = c; + tmp[1] = 0; + } + + if ( c == '\r' ) strcpy(tmp,"'\\r'"); + if ( c == '\n' ) strcpy(tmp,"'\\n'"); + + fprintf(stderr,"<%s: %s>\n",what,tmp); +} + + +void IsdnReadLine(int isdnfd, char *buf,int size) +{ + int t, r, skip, skipcrlf; + + skipcrlf = 1; + + fprintf(stderr,"---------------------------------------------\n"); + + for ( t=0; t < size; t++ ) { + r = read(isdnfd,&buf[t],1); + if ( r != 1 ) { + fprintf(stderr,"Read audio-data errno: %d\n",errno); + sprintf(isdnerr,"Can't read device one byte at a time"); + buf[t] = 0; + return; + } + + /* IsdnPrintChar("Read",buf[t]); */ + + if ( (buf[t] == '\n' || buf[t] == '\r') && skipcrlf ) { + skip = 1; + skipcrlf = 0; + } + + if ( buf[t] != '\n' && buf[t] != '\r' ) { + skipcrlf = 0; + skip = 0; + } + + if ( skip ) { + t--; + } else if ( buf[t] == '\r' ) { + buf[t] = 0; + return; + } + } + buf[t+1] = 0; +} + +int IsdnCommand(int isdnfd, char *cmd, int checho, int result) +{ + char localcmd[CMDMAXSIZE+4]; + int cmdlen; + + strcpy(localcmd,cmd); + cmdlen = strlen(localcmd); + + if ( cmdlen > 0 && localcmd[cmdlen-1] != '\r' ) { + strcat(localcmd,"\r"); + cmdlen = strlen(localcmd); + } + + if ( cmdlen == 0 ) { + return 0; + } + + if ( write(isdnfd,localcmd,cmdlen) != cmdlen ) { + sprintf(isdnerr,"Unable to write command to device"); + return 0; + } + + if ( checho ) { + IsdnReadLine(isdnfd, cmdresult,CMDRESULTSIZE); + + localcmd[cmdlen-1] = 0; + if ( strcmp(cmdresult,localcmd) ) { + sprintf(isdnerr,"Command '%s' echoed back as '%s'",localcmd,cmdresult); + return 0; + } + } + + if ( result ) { + IsdnReadLine(isdnfd, cmdresult,CMDRESULTSIZE); + fprintf(stderr,"Command '%s' resulted in '%s'\n",localcmd,cmdresult); + } + + return 1; +} + +/* ISDN4Linux has the uncommon behaviour of expecting _bitreversed_ aLaw. + * We compensate for that. + */ +void IsdnSendAudio(int isdnfd, unsigned char *data, int size) +{ + int t; + unsigned char dathelp; + + for ( t=0; t < size; t++ ) + { + dathelp=bitrev(data[t]); + if ( dathelp == 0x10 ) + { + write(isdnfd,&dathelp,1); + } + write(isdnfd,&dathelp,1); + } +} + +/* ISDN4Linux has the uncommon behaviour of expecting _bitreversed_ aLaw. + * We compensate for that. + */ +void IsdnReadAudio(int isdnfd, unsigned char *data, int size) +{ + int t; + + for ( t=0; t < size; t++ ) + { + data[t] = '@'; + if ( read(isdnfd,&data[t],1) != 1 ) + { + fprintf(stderr,"Oops: %d\n",errno); + } + if ( data[t] == 0x10 ) + { + read(isdnfd,&data[t],1); + if ( data[t] != 0x10 ) + { + fprintf(stderr,"<%02x>\n",data[t]); + } + } + data[t]=bitrev(data[t]); + } +} diff --git a/lib/module.c b/lib/module.c new file mode 100644 index 0000000..9ff6023 --- /dev/null +++ b/lib/module.c @@ -0,0 +1,117 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Module functionality. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include +#include + +#include + +static ifax_module_registry *ifax_modreg_root=NULL; +static ifax_module_id ifax_module_lastid=1; + +/* Register a module class. Returns a module_id (handle) for the newly + * registered class on success. + */ +ifax_module_id ifax_register_module_class(char *name,int (*construct)(struct ifax_module *self,va_list args)) +{ + ifax_module_registry *newentry; + + if (NULL==(newentry=malloc(sizeof(ifax_module_registry)))) + return IFAX_MODULE_ID_INVALID; /* No memory any more. */ + + newentry->next=ifax_modreg_root; + newentry->id =ifax_module_lastid++; + newentry->construct=construct; + strcpy(newentry->module_name,name); + ifax_modreg_root=newentry; + return newentry->id; +} + +/* Instantiate a module of the class what_kind. Returns a modp (handle) for + * the newly created module on success. + */ +ifax_modp ifax_create_module(ifax_module_id what_kind,...) +{ + ifax_module_registry *current; + ifax_modp newmodule; + va_list list; + + current=ifax_modreg_root; + + while(current) + { + if (current->id==what_kind) { + + if (NULL==current->construct) { + ifax_dprintf(DEBUG_SEVERE,"No constructor for module %s", + current->module_name); + break; + } + + if (NULL==(newmodule=malloc(sizeof(ifax_module)))) + break; + memset(newmodule,0,sizeof(ifax_module)); + + newmodule->sendto=NULL; + + va_start(list,what_kind); + if (current->construct(newmodule,list)) { + va_end(list); + free(newmodule); + break; + } + va_end(list); + return newmodule; + } + current=current->next; + } + return NULL; +} + +/* Send input to a module. Note, that len is defined by the module. + */ +int ifax_handle_input(struct ifax_module *self,void *data,size_t len) +{ + return self->handle_input(self, data,len); +} + +/* Send a command to a module. Note, that commands and data are defined + * by the module. + */ +int ifax_command(struct ifax_module *self, int command, ...) +{ + va_list list; + int rc; + + va_start(list,command); + rc=self->command(self, command, list); + va_end(list); + + return rc; +} + diff --git a/lib/sincos.c b/lib/sincos.c new file mode 100644 index 0000000..448030d --- /dev/null +++ b/lib/sincos.c @@ -0,0 +1,543 @@ +/* sincos.c + * + * Compute sines/cosines by reading values right out of a table. This + * is not a very good solution, but it is speedy and sufficiently accurate + * for telephone quality signals. + * + * The phase is measured in units of (2*PI/65536), which means a full + * sinus period goes from 0 to 0xFFFF, starting all over at 0x10000. + */ + +static unsigned short sintbl[4096] = { + 0x0000,0x0032,0x0065,0x0097,0x00c9,0x00fb,0x012e,0x0160, + 0x0192,0x01c4,0x01f7,0x0229,0x025b,0x028d,0x02c0,0x02f2, + 0x0324,0x0356,0x0389,0x03bb,0x03ed,0x041f,0x0452,0x0484, + 0x04b6,0x04e8,0x051b,0x054d,0x057f,0x05b1,0x05e3,0x0616, + 0x0648,0x067a,0x06ac,0x06de,0x0711,0x0743,0x0775,0x07a7, + 0x07d9,0x080b,0x083e,0x0870,0x08a2,0x08d4,0x0906,0x0938, + 0x096a,0x099d,0x09cf,0x0a01,0x0a33,0x0a65,0x0a97,0x0ac9, + 0x0afb,0x0b2d,0x0b5f,0x0b92,0x0bc4,0x0bf6,0x0c28,0x0c5a, + 0x0c8c,0x0cbe,0x0cf0,0x0d22,0x0d54,0x0d86,0x0db8,0x0dea, + 0x0e1c,0x0e4e,0x0e80,0x0eb1,0x0ee3,0x0f15,0x0f47,0x0f79, + 0x0fab,0x0fdd,0x100f,0x1041,0x1072,0x10a4,0x10d6,0x1108, + 0x113a,0x116c,0x119d,0x11cf,0x1201,0x1233,0x1264,0x1296, + 0x12c8,0x12fa,0x132b,0x135d,0x138f,0x13c0,0x13f2,0x1424, + 0x1455,0x1487,0x14b9,0x14ea,0x151c,0x154d,0x157f,0x15b0, + 0x15e2,0x1613,0x1645,0x1676,0x16a8,0x16d9,0x170b,0x173c, + 0x176e,0x179f,0x17d0,0x1802,0x1833,0x1865,0x1896,0x18c7, + 0x18f9,0x192a,0x195b,0x198c,0x19be,0x19ef,0x1a20,0x1a51, + 0x1a82,0x1ab4,0x1ae5,0x1b16,0x1b47,0x1b78,0x1ba9,0x1bda, + 0x1c0b,0x1c3c,0x1c6d,0x1c9e,0x1ccf,0x1d00,0x1d31,0x1d62, + 0x1d93,0x1dc4,0x1df5,0x1e26,0x1e57,0x1e87,0x1eb8,0x1ee9, + 0x1f1a,0x1f4a,0x1f7b,0x1fac,0x1fdd,0x200d,0x203e,0x206f, + 0x209f,0x20d0,0x2100,0x2131,0x2161,0x2192,0x21c2,0x21f3, + 0x2223,0x2254,0x2284,0x22b5,0x22e5,0x2315,0x2346,0x2376, + 0x23a6,0x23d7,0x2407,0x2437,0x2467,0x2497,0x24c8,0x24f8, + 0x2528,0x2558,0x2588,0x25b8,0x25e8,0x2618,0x2648,0x2678, + 0x26a8,0x26d8,0x2708,0x2737,0x2767,0x2797,0x27c7,0x27f7, + 0x2826,0x2856,0x2886,0x28b5,0x28e5,0x2915,0x2944,0x2974, + 0x29a3,0x29d3,0x2a02,0x2a32,0x2a61,0x2a91,0x2ac0,0x2af0, + 0x2b1f,0x2b4e,0x2b7d,0x2bad,0x2bdc,0x2c0b,0x2c3a,0x2c6a, + 0x2c99,0x2cc8,0x2cf7,0x2d26,0x2d55,0x2d84,0x2db3,0x2de2, + 0x2e11,0x2e40,0x2e6e,0x2e9d,0x2ecc,0x2efb,0x2f2a,0x2f58, + 0x2f87,0x2fb6,0x2fe4,0x3013,0x3041,0x3070,0x309e,0x30cd, + 0x30fb,0x312a,0x3158,0x3187,0x31b5,0x31e3,0x3211,0x3240, + 0x326e,0x329c,0x32ca,0x32f8,0x3326,0x3355,0x3383,0x33b1, + 0x33df,0x340c,0x343a,0x3468,0x3496,0x34c4,0x34f2,0x351f, + 0x354d,0x357b,0x35a8,0x35d6,0x3604,0x3631,0x365f,0x368c, + 0x36ba,0x36e7,0x3715,0x3742,0x376f,0x379c,0x37ca,0x37f7, + 0x3824,0x3851,0x387e,0x38ab,0x38d9,0x3906,0x3933,0x3960, + 0x398c,0x39b9,0x39e6,0x3a13,0x3a40,0x3a6c,0x3a99,0x3ac6, + 0x3af2,0x3b1f,0x3b4c,0x3b78,0x3ba5,0x3bd1,0x3bfe,0x3c2a, + 0x3c56,0x3c83,0x3caf,0x3cdb,0x3d07,0x3d33,0x3d60,0x3d8c, + 0x3db8,0x3de4,0x3e10,0x3e3c,0x3e68,0x3e93,0x3ebf,0x3eeb, + 0x3f17,0x3f43,0x3f6e,0x3f9a,0x3fc5,0x3ff1,0x401d,0x4048, + 0x4073,0x409f,0x40ca,0x40f6,0x4121,0x414c,0x4177,0x41a2, + 0x41ce,0x41f9,0x4224,0x424f,0x427a,0x42a5,0x42d0,0x42fa, + 0x4325,0x4350,0x437b,0x43a5,0x43d0,0x43fb,0x4425,0x4450, + 0x447a,0x44a5,0x44cf,0x44f9,0x4524,0x454e,0x4578,0x45a3, + 0x45cd,0x45f7,0x4621,0x464b,0x4675,0x469f,0x46c9,0x46f3, + 0x471c,0x4746,0x4770,0x479a,0x47c3,0x47ed,0x4816,0x4840, + 0x4869,0x4893,0x48bc,0x48e5,0x490f,0x4938,0x4961,0x498a, + 0x49b4,0x49dd,0x4a06,0x4a2f,0x4a58,0x4a80,0x4aa9,0x4ad2, + 0x4afb,0x4b24,0x4b4c,0x4b75,0x4b9d,0x4bc6,0x4bee,0x4c17, + 0x4c3f,0x4c68,0x4c90,0x4cb8,0x4ce0,0x4d09,0x4d31,0x4d59, + 0x4d81,0x4da9,0x4dd1,0x4df9,0x4e20,0x4e48,0x4e70,0x4e98, + 0x4ebf,0x4ee7,0x4f0e,0x4f36,0x4f5d,0x4f85,0x4fac,0x4fd4, + 0x4ffb,0x5022,0x5049,0x5070,0x5097,0x50be,0x50e5,0x510c, + 0x5133,0x515a,0x5181,0x51a8,0x51ce,0x51f5,0x521b,0x5242, + 0x5268,0x528f,0x52b5,0x52dc,0x5302,0x5328,0x534e,0x5374, + 0x539b,0x53c1,0x53e7,0x540c,0x5432,0x5458,0x547e,0x54a4, + 0x54c9,0x54ef,0x5515,0x553a,0x5560,0x5585,0x55aa,0x55d0, + 0x55f5,0x561a,0x563f,0x5664,0x568a,0x56af,0x56d3,0x56f8, + 0x571d,0x5742,0x5767,0x578b,0x57b0,0x57d5,0x57f9,0x581e, + 0x5842,0x5867,0x588b,0x58af,0x58d3,0x58f8,0x591c,0x5940, + 0x5964,0x5988,0x59ac,0x59cf,0x59f3,0x5a17,0x5a3b,0x5a5e, + 0x5a82,0x5aa5,0x5ac9,0x5aec,0x5b0f,0x5b33,0x5b56,0x5b79, + 0x5b9c,0x5bbf,0x5be2,0x5c05,0x5c28,0x5c4b,0x5c6e,0x5c91, + 0x5cb3,0x5cd6,0x5cf9,0x5d1b,0x5d3e,0x5d60,0x5d82,0x5da5, + 0x5dc7,0x5de9,0x5e0b,0x5e2d,0x5e4f,0x5e71,0x5e93,0x5eb5, + 0x5ed7,0x5ef8,0x5f1a,0x5f3c,0x5f5d,0x5f7f,0x5fa0,0x5fc2, + 0x5fe3,0x6004,0x6025,0x6047,0x6068,0x6089,0x60aa,0x60cb, + 0x60eb,0x610c,0x612d,0x614e,0x616e,0x618f,0x61af,0x61d0, + 0x61f0,0x6211,0x6231,0x6251,0x6271,0x6291,0x62b1,0x62d1, + 0x62f1,0x6311,0x6331,0x6351,0x6370,0x6390,0x63af,0x63cf, + 0x63ee,0x640e,0x642d,0x644c,0x646c,0x648b,0x64aa,0x64c9, + 0x64e8,0x6507,0x6525,0x6544,0x6563,0x6582,0x65a0,0x65bf, + 0x65dd,0x65fc,0x661a,0x6638,0x6656,0x6675,0x6693,0x66b1, + 0x66cf,0x66ed,0x670a,0x6728,0x6746,0x6764,0x6781,0x679f, + 0x67bc,0x67da,0x67f7,0x6814,0x6832,0x684f,0x686c,0x6889, + 0x68a6,0x68c3,0x68e0,0x68fc,0x6919,0x6936,0x6952,0x696f, + 0x698b,0x69a8,0x69c4,0x69e0,0x69fd,0x6a19,0x6a35,0x6a51, + 0x6a6d,0x6a89,0x6aa4,0x6ac0,0x6adc,0x6af8,0x6b13,0x6b2f, + 0x6b4a,0x6b65,0x6b81,0x6b9c,0x6bb7,0x6bd2,0x6bed,0x6c08, + 0x6c23,0x6c3e,0x6c59,0x6c74,0x6c8e,0x6ca9,0x6cc3,0x6cde, + 0x6cf8,0x6d13,0x6d2d,0x6d47,0x6d61,0x6d7b,0x6d95,0x6daf, + 0x6dc9,0x6de3,0x6dfd,0x6e16,0x6e30,0x6e4a,0x6e63,0x6e7c, + 0x6e96,0x6eaf,0x6ec8,0x6ee1,0x6efb,0x6f14,0x6f2c,0x6f45, + 0x6f5e,0x6f77,0x6f90,0x6fa8,0x6fc1,0x6fd9,0x6ff2,0x700a, + 0x7022,0x703a,0x7053,0x706b,0x7083,0x709b,0x70b2,0x70ca, + 0x70e2,0x70fa,0x7111,0x7129,0x7140,0x7158,0x716f,0x7186, + 0x719d,0x71b4,0x71cb,0x71e2,0x71f9,0x7210,0x7227,0x723e, + 0x7254,0x726b,0x7281,0x7298,0x72ae,0x72c4,0x72db,0x72f1, + 0x7307,0x731d,0x7333,0x7349,0x735e,0x7374,0x738a,0x739f, + 0x73b5,0x73ca,0x73e0,0x73f5,0x740a,0x7420,0x7435,0x744a, + 0x745f,0x7474,0x7488,0x749d,0x74b2,0x74c6,0x74db,0x74f0, + 0x7504,0x7518,0x752d,0x7541,0x7555,0x7569,0x757d,0x7591, + 0x75a5,0x75b8,0x75cc,0x75e0,0x75f3,0x7607,0x761a,0x762d, + 0x7641,0x7654,0x7667,0x767a,0x768d,0x76a0,0x76b3,0x76c6, + 0x76d8,0x76eb,0x76fe,0x7710,0x7722,0x7735,0x7747,0x7759, + 0x776b,0x777d,0x778f,0x77a1,0x77b3,0x77c5,0x77d7,0x77e8, + 0x77fa,0x780b,0x781d,0x782e,0x783f,0x7850,0x7862,0x7873, + 0x7884,0x7894,0x78a5,0x78b6,0x78c7,0x78d7,0x78e8,0x78f8, + 0x7909,0x7919,0x7929,0x7939,0x794a,0x795a,0x796a,0x7979, + 0x7989,0x7999,0x79a9,0x79b8,0x79c8,0x79d7,0x79e6,0x79f6, + 0x7a05,0x7a14,0x7a23,0x7a32,0x7a41,0x7a50,0x7a5f,0x7a6d, + 0x7a7c,0x7a8b,0x7a99,0x7aa8,0x7ab6,0x7ac4,0x7ad2,0x7ae0, + 0x7aee,0x7afc,0x7b0a,0x7b18,0x7b26,0x7b33,0x7b41,0x7b4f, + 0x7b5c,0x7b69,0x7b77,0x7b84,0x7b91,0x7b9e,0x7bab,0x7bb8, + 0x7bc5,0x7bd2,0x7bde,0x7beb,0x7bf8,0x7c04,0x7c10,0x7c1d, + 0x7c29,0x7c35,0x7c41,0x7c4d,0x7c59,0x7c65,0x7c71,0x7c7d, + 0x7c88,0x7c94,0x7c9f,0x7cab,0x7cb6,0x7cc1,0x7ccd,0x7cd8, + 0x7ce3,0x7cee,0x7cf9,0x7d04,0x7d0e,0x7d19,0x7d24,0x7d2e, + 0x7d39,0x7d43,0x7d4d,0x7d57,0x7d62,0x7d6c,0x7d76,0x7d80, + 0x7d89,0x7d93,0x7d9d,0x7da6,0x7db0,0x7db9,0x7dc3,0x7dcc, + 0x7dd5,0x7ddf,0x7de8,0x7df1,0x7dfa,0x7e02,0x7e0b,0x7e14, + 0x7e1d,0x7e25,0x7e2e,0x7e36,0x7e3e,0x7e47,0x7e4f,0x7e57, + 0x7e5f,0x7e67,0x7e6f,0x7e77,0x7e7e,0x7e86,0x7e8d,0x7e95, + 0x7e9c,0x7ea4,0x7eab,0x7eb2,0x7eb9,0x7ec0,0x7ec7,0x7ece, + 0x7ed5,0x7edc,0x7ee2,0x7ee9,0x7eef,0x7ef6,0x7efc,0x7f02, + 0x7f09,0x7f0f,0x7f15,0x7f1b,0x7f21,0x7f26,0x7f2c,0x7f32, + 0x7f37,0x7f3d,0x7f42,0x7f48,0x7f4d,0x7f52,0x7f57,0x7f5c, + 0x7f61,0x7f66,0x7f6b,0x7f70,0x7f74,0x7f79,0x7f7d,0x7f82, + 0x7f86,0x7f8a,0x7f8f,0x7f93,0x7f97,0x7f9b,0x7f9f,0x7fa2, + 0x7fa6,0x7faa,0x7fad,0x7fb1,0x7fb4,0x7fb8,0x7fbb,0x7fbe, + 0x7fc1,0x7fc4,0x7fc7,0x7fca,0x7fcd,0x7fd0,0x7fd2,0x7fd5, + 0x7fd8,0x7fda,0x7fdc,0x7fdf,0x7fe1,0x7fe3,0x7fe5,0x7fe7, + 0x7fe9,0x7feb,0x7fec,0x7fee,0x7ff0,0x7ff1,0x7ff3,0x7ff4, + 0x7ff5,0x7ff6,0x7ff7,0x7ff8,0x7ff9,0x7ffa,0x7ffb,0x7ffc, + 0x7ffd,0x7ffd,0x7ffe,0x7ffe,0x7ffe,0x7fff,0x7fff,0x7fff, + 0x7fff,0x7fff,0x7fff,0x7fff,0x7ffe,0x7ffe,0x7ffe,0x7ffd, + 0x7ffd,0x7ffc,0x7ffb,0x7ffa,0x7ff9,0x7ff8,0x7ff7,0x7ff6, + 0x7ff5,0x7ff4,0x7ff3,0x7ff1,0x7ff0,0x7fee,0x7fec,0x7feb, + 0x7fe9,0x7fe7,0x7fe5,0x7fe3,0x7fe1,0x7fdf,0x7fdc,0x7fda, + 0x7fd8,0x7fd5,0x7fd2,0x7fd0,0x7fcd,0x7fca,0x7fc7,0x7fc4, + 0x7fc1,0x7fbe,0x7fbb,0x7fb8,0x7fb4,0x7fb1,0x7fad,0x7faa, + 0x7fa6,0x7fa2,0x7f9f,0x7f9b,0x7f97,0x7f93,0x7f8f,0x7f8a, + 0x7f86,0x7f82,0x7f7d,0x7f79,0x7f74,0x7f70,0x7f6b,0x7f66, + 0x7f61,0x7f5c,0x7f57,0x7f52,0x7f4d,0x7f48,0x7f42,0x7f3d, + 0x7f37,0x7f32,0x7f2c,0x7f26,0x7f21,0x7f1b,0x7f15,0x7f0f, + 0x7f09,0x7f02,0x7efc,0x7ef6,0x7eef,0x7ee9,0x7ee2,0x7edc, + 0x7ed5,0x7ece,0x7ec7,0x7ec0,0x7eb9,0x7eb2,0x7eab,0x7ea4, + 0x7e9c,0x7e95,0x7e8d,0x7e86,0x7e7e,0x7e77,0x7e6f,0x7e67, + 0x7e5f,0x7e57,0x7e4f,0x7e47,0x7e3e,0x7e36,0x7e2e,0x7e25, + 0x7e1d,0x7e14,0x7e0b,0x7e02,0x7dfa,0x7df1,0x7de8,0x7ddf, + 0x7dd5,0x7dcc,0x7dc3,0x7db9,0x7db0,0x7da6,0x7d9d,0x7d93, + 0x7d89,0x7d80,0x7d76,0x7d6c,0x7d62,0x7d57,0x7d4d,0x7d43, + 0x7d39,0x7d2e,0x7d24,0x7d19,0x7d0e,0x7d04,0x7cf9,0x7cee, + 0x7ce3,0x7cd8,0x7ccd,0x7cc1,0x7cb6,0x7cab,0x7c9f,0x7c94, + 0x7c88,0x7c7d,0x7c71,0x7c65,0x7c59,0x7c4d,0x7c41,0x7c35, + 0x7c29,0x7c1d,0x7c10,0x7c04,0x7bf8,0x7beb,0x7bde,0x7bd2, + 0x7bc5,0x7bb8,0x7bab,0x7b9e,0x7b91,0x7b84,0x7b77,0x7b69, + 0x7b5c,0x7b4f,0x7b41,0x7b33,0x7b26,0x7b18,0x7b0a,0x7afc, + 0x7aee,0x7ae0,0x7ad2,0x7ac4,0x7ab6,0x7aa8,0x7a99,0x7a8b, + 0x7a7c,0x7a6d,0x7a5f,0x7a50,0x7a41,0x7a32,0x7a23,0x7a14, + 0x7a05,0x79f6,0x79e6,0x79d7,0x79c8,0x79b8,0x79a9,0x7999, + 0x7989,0x7979,0x796a,0x795a,0x794a,0x7939,0x7929,0x7919, + 0x7909,0x78f8,0x78e8,0x78d7,0x78c7,0x78b6,0x78a5,0x7894, + 0x7884,0x7873,0x7862,0x7850,0x783f,0x782e,0x781d,0x780b, + 0x77fa,0x77e8,0x77d7,0x77c5,0x77b3,0x77a1,0x778f,0x777d, + 0x776b,0x7759,0x7747,0x7735,0x7722,0x7710,0x76fe,0x76eb, + 0x76d8,0x76c6,0x76b3,0x76a0,0x768d,0x767a,0x7667,0x7654, + 0x7641,0x762d,0x761a,0x7607,0x75f3,0x75e0,0x75cc,0x75b8, + 0x75a5,0x7591,0x757d,0x7569,0x7555,0x7541,0x752d,0x7518, + 0x7504,0x74f0,0x74db,0x74c6,0x74b2,0x749d,0x7488,0x7474, + 0x745f,0x744a,0x7435,0x7420,0x740a,0x73f5,0x73e0,0x73ca, + 0x73b5,0x739f,0x738a,0x7374,0x735e,0x7349,0x7333,0x731d, + 0x7307,0x72f1,0x72db,0x72c4,0x72ae,0x7298,0x7281,0x726b, + 0x7254,0x723e,0x7227,0x7210,0x71f9,0x71e2,0x71cb,0x71b4, + 0x719d,0x7186,0x716f,0x7158,0x7140,0x7129,0x7111,0x70fa, + 0x70e2,0x70ca,0x70b2,0x709b,0x7083,0x706b,0x7053,0x703a, + 0x7022,0x700a,0x6ff2,0x6fd9,0x6fc1,0x6fa8,0x6f90,0x6f77, + 0x6f5e,0x6f45,0x6f2c,0x6f14,0x6efb,0x6ee1,0x6ec8,0x6eaf, + 0x6e96,0x6e7c,0x6e63,0x6e4a,0x6e30,0x6e16,0x6dfd,0x6de3, + 0x6dc9,0x6daf,0x6d95,0x6d7b,0x6d61,0x6d47,0x6d2d,0x6d13, + 0x6cf8,0x6cde,0x6cc3,0x6ca9,0x6c8e,0x6c74,0x6c59,0x6c3e, + 0x6c23,0x6c08,0x6bed,0x6bd2,0x6bb7,0x6b9c,0x6b81,0x6b65, + 0x6b4a,0x6b2f,0x6b13,0x6af8,0x6adc,0x6ac0,0x6aa4,0x6a89, + 0x6a6d,0x6a51,0x6a35,0x6a19,0x69fd,0x69e0,0x69c4,0x69a8, + 0x698b,0x696f,0x6952,0x6936,0x6919,0x68fc,0x68e0,0x68c3, + 0x68a6,0x6889,0x686c,0x684f,0x6832,0x6814,0x67f7,0x67da, + 0x67bc,0x679f,0x6781,0x6764,0x6746,0x6728,0x670a,0x66ed, + 0x66cf,0x66b1,0x6693,0x6675,0x6656,0x6638,0x661a,0x65fc, + 0x65dd,0x65bf,0x65a0,0x6582,0x6563,0x6544,0x6525,0x6507, + 0x64e8,0x64c9,0x64aa,0x648b,0x646c,0x644c,0x642d,0x640e, + 0x63ee,0x63cf,0x63af,0x6390,0x6370,0x6351,0x6331,0x6311, + 0x62f1,0x62d1,0x62b1,0x6291,0x6271,0x6251,0x6231,0x6211, + 0x61f0,0x61d0,0x61af,0x618f,0x616e,0x614e,0x612d,0x610c, + 0x60eb,0x60cb,0x60aa,0x6089,0x6068,0x6047,0x6025,0x6004, + 0x5fe3,0x5fc2,0x5fa0,0x5f7f,0x5f5d,0x5f3c,0x5f1a,0x5ef8, + 0x5ed7,0x5eb5,0x5e93,0x5e71,0x5e4f,0x5e2d,0x5e0b,0x5de9, + 0x5dc7,0x5da5,0x5d82,0x5d60,0x5d3e,0x5d1b,0x5cf9,0x5cd6, + 0x5cb3,0x5c91,0x5c6e,0x5c4b,0x5c28,0x5c05,0x5be2,0x5bbf, + 0x5b9c,0x5b79,0x5b56,0x5b33,0x5b0f,0x5aec,0x5ac9,0x5aa5, + 0x5a82,0x5a5e,0x5a3b,0x5a17,0x59f3,0x59cf,0x59ac,0x5988, + 0x5964,0x5940,0x591c,0x58f8,0x58d3,0x58af,0x588b,0x5867, + 0x5842,0x581e,0x57f9,0x57d5,0x57b0,0x578b,0x5767,0x5742, + 0x571d,0x56f8,0x56d3,0x56af,0x568a,0x5664,0x563f,0x561a, + 0x55f5,0x55d0,0x55aa,0x5585,0x5560,0x553a,0x5515,0x54ef, + 0x54c9,0x54a4,0x547e,0x5458,0x5432,0x540c,0x53e7,0x53c1, + 0x539b,0x5374,0x534e,0x5328,0x5302,0x52dc,0x52b5,0x528f, + 0x5268,0x5242,0x521b,0x51f5,0x51ce,0x51a8,0x5181,0x515a, + 0x5133,0x510c,0x50e5,0x50be,0x5097,0x5070,0x5049,0x5022, + 0x4ffb,0x4fd4,0x4fac,0x4f85,0x4f5d,0x4f36,0x4f0e,0x4ee7, + 0x4ebf,0x4e98,0x4e70,0x4e48,0x4e20,0x4df9,0x4dd1,0x4da9, + 0x4d81,0x4d59,0x4d31,0x4d09,0x4ce0,0x4cb8,0x4c90,0x4c68, + 0x4c3f,0x4c17,0x4bee,0x4bc6,0x4b9d,0x4b75,0x4b4c,0x4b24, + 0x4afb,0x4ad2,0x4aa9,0x4a80,0x4a58,0x4a2f,0x4a06,0x49dd, + 0x49b4,0x498a,0x4961,0x4938,0x490f,0x48e5,0x48bc,0x4893, + 0x4869,0x4840,0x4816,0x47ed,0x47c3,0x479a,0x4770,0x4746, + 0x471c,0x46f3,0x46c9,0x469f,0x4675,0x464b,0x4621,0x45f7, + 0x45cd,0x45a3,0x4578,0x454e,0x4524,0x44f9,0x44cf,0x44a5, + 0x447a,0x4450,0x4425,0x43fb,0x43d0,0x43a5,0x437b,0x4350, + 0x4325,0x42fa,0x42d0,0x42a5,0x427a,0x424f,0x4224,0x41f9, + 0x41ce,0x41a2,0x4177,0x414c,0x4121,0x40f6,0x40ca,0x409f, + 0x4073,0x4048,0x401d,0x3ff1,0x3fc5,0x3f9a,0x3f6e,0x3f43, + 0x3f17,0x3eeb,0x3ebf,0x3e93,0x3e68,0x3e3c,0x3e10,0x3de4, + 0x3db8,0x3d8c,0x3d60,0x3d33,0x3d07,0x3cdb,0x3caf,0x3c83, + 0x3c56,0x3c2a,0x3bfe,0x3bd1,0x3ba5,0x3b78,0x3b4c,0x3b1f, + 0x3af2,0x3ac6,0x3a99,0x3a6c,0x3a40,0x3a13,0x39e6,0x39b9, + 0x398c,0x3960,0x3933,0x3906,0x38d9,0x38ab,0x387e,0x3851, + 0x3824,0x37f7,0x37ca,0x379c,0x376f,0x3742,0x3715,0x36e7, + 0x36ba,0x368c,0x365f,0x3631,0x3604,0x35d6,0x35a8,0x357b, + 0x354d,0x351f,0x34f2,0x34c4,0x3496,0x3468,0x343a,0x340c, + 0x33df,0x33b1,0x3383,0x3355,0x3326,0x32f8,0x32ca,0x329c, + 0x326e,0x3240,0x3211,0x31e3,0x31b5,0x3187,0x3158,0x312a, + 0x30fb,0x30cd,0x309e,0x3070,0x3041,0x3013,0x2fe4,0x2fb6, + 0x2f87,0x2f58,0x2f2a,0x2efb,0x2ecc,0x2e9d,0x2e6e,0x2e40, + 0x2e11,0x2de2,0x2db3,0x2d84,0x2d55,0x2d26,0x2cf7,0x2cc8, + 0x2c99,0x2c6a,0x2c3a,0x2c0b,0x2bdc,0x2bad,0x2b7d,0x2b4e, + 0x2b1f,0x2af0,0x2ac0,0x2a91,0x2a61,0x2a32,0x2a02,0x29d3, + 0x29a3,0x2974,0x2944,0x2915,0x28e5,0x28b5,0x2886,0x2856, + 0x2826,0x27f7,0x27c7,0x2797,0x2767,0x2737,0x2708,0x26d8, + 0x26a8,0x2678,0x2648,0x2618,0x25e8,0x25b8,0x2588,0x2558, + 0x2528,0x24f8,0x24c8,0x2497,0x2467,0x2437,0x2407,0x23d7, + 0x23a6,0x2376,0x2346,0x2315,0x22e5,0x22b5,0x2284,0x2254, + 0x2223,0x21f3,0x21c2,0x2192,0x2161,0x2131,0x2100,0x20d0, + 0x209f,0x206f,0x203e,0x200d,0x1fdd,0x1fac,0x1f7b,0x1f4a, + 0x1f1a,0x1ee9,0x1eb8,0x1e87,0x1e57,0x1e26,0x1df5,0x1dc4, + 0x1d93,0x1d62,0x1d31,0x1d00,0x1ccf,0x1c9e,0x1c6d,0x1c3c, + 0x1c0b,0x1bda,0x1ba9,0x1b78,0x1b47,0x1b16,0x1ae5,0x1ab4, + 0x1a82,0x1a51,0x1a20,0x19ef,0x19be,0x198c,0x195b,0x192a, + 0x18f9,0x18c7,0x1896,0x1865,0x1833,0x1802,0x17d0,0x179f, + 0x176e,0x173c,0x170b,0x16d9,0x16a8,0x1676,0x1645,0x1613, + 0x15e2,0x15b0,0x157f,0x154d,0x151c,0x14ea,0x14b9,0x1487, + 0x1455,0x1424,0x13f2,0x13c0,0x138f,0x135d,0x132b,0x12fa, + 0x12c8,0x1296,0x1264,0x1233,0x1201,0x11cf,0x119d,0x116c, + 0x113a,0x1108,0x10d6,0x10a4,0x1072,0x1041,0x100f,0x0fdd, + 0x0fab,0x0f79,0x0f47,0x0f15,0x0ee3,0x0eb1,0x0e80,0x0e4e, + 0x0e1c,0x0dea,0x0db8,0x0d86,0x0d54,0x0d22,0x0cf0,0x0cbe, + 0x0c8c,0x0c5a,0x0c28,0x0bf6,0x0bc4,0x0b92,0x0b5f,0x0b2d, + 0x0afb,0x0ac9,0x0a97,0x0a65,0x0a33,0x0a01,0x09cf,0x099d, + 0x096a,0x0938,0x0906,0x08d4,0x08a2,0x0870,0x083e,0x080b, + 0x07d9,0x07a7,0x0775,0x0743,0x0711,0x06de,0x06ac,0x067a, + 0x0648,0x0616,0x05e3,0x05b1,0x057f,0x054d,0x051b,0x04e8, + 0x04b6,0x0484,0x0452,0x041f,0x03ed,0x03bb,0x0389,0x0356, + 0x0324,0x02f2,0x02c0,0x028d,0x025b,0x0229,0x01f7,0x01c4, + 0x0192,0x0160,0x012e,0x00fb,0x00c9,0x0097,0x0065,0x0032, + 0x0000,0xffce,0xff9b,0xff69,0xff37,0xff05,0xfed2,0xfea0, + 0xfe6e,0xfe3c,0xfe09,0xfdd7,0xfda5,0xfd73,0xfd40,0xfd0e, + 0xfcdc,0xfcaa,0xfc77,0xfc45,0xfc13,0xfbe1,0xfbae,0xfb7c, + 0xfb4a,0xfb18,0xfae5,0xfab3,0xfa81,0xfa4f,0xfa1d,0xf9ea, + 0xf9b8,0xf986,0xf954,0xf922,0xf8ef,0xf8bd,0xf88b,0xf859, + 0xf827,0xf7f5,0xf7c2,0xf790,0xf75e,0xf72c,0xf6fa,0xf6c8, + 0xf696,0xf663,0xf631,0xf5ff,0xf5cd,0xf59b,0xf569,0xf537, + 0xf505,0xf4d3,0xf4a1,0xf46e,0xf43c,0xf40a,0xf3d8,0xf3a6, + 0xf374,0xf342,0xf310,0xf2de,0xf2ac,0xf27a,0xf248,0xf216, + 0xf1e4,0xf1b2,0xf180,0xf14f,0xf11d,0xf0eb,0xf0b9,0xf087, + 0xf055,0xf023,0xeff1,0xefbf,0xef8e,0xef5c,0xef2a,0xeef8, + 0xeec6,0xee94,0xee63,0xee31,0xedff,0xedcd,0xed9c,0xed6a, + 0xed38,0xed06,0xecd5,0xeca3,0xec71,0xec40,0xec0e,0xebdc, + 0xebab,0xeb79,0xeb47,0xeb16,0xeae4,0xeab3,0xea81,0xea50, + 0xea1e,0xe9ed,0xe9bb,0xe98a,0xe958,0xe927,0xe8f5,0xe8c4, + 0xe892,0xe861,0xe830,0xe7fe,0xe7cd,0xe79b,0xe76a,0xe739, + 0xe707,0xe6d6,0xe6a5,0xe674,0xe642,0xe611,0xe5e0,0xe5af, + 0xe57e,0xe54c,0xe51b,0xe4ea,0xe4b9,0xe488,0xe457,0xe426, + 0xe3f5,0xe3c4,0xe393,0xe362,0xe331,0xe300,0xe2cf,0xe29e, + 0xe26d,0xe23c,0xe20b,0xe1da,0xe1a9,0xe179,0xe148,0xe117, + 0xe0e6,0xe0b6,0xe085,0xe054,0xe023,0xdff3,0xdfc2,0xdf91, + 0xdf61,0xdf30,0xdf00,0xdecf,0xde9f,0xde6e,0xde3e,0xde0d, + 0xdddd,0xddac,0xdd7c,0xdd4b,0xdd1b,0xdceb,0xdcba,0xdc8a, + 0xdc5a,0xdc29,0xdbf9,0xdbc9,0xdb99,0xdb69,0xdb38,0xdb08, + 0xdad8,0xdaa8,0xda78,0xda48,0xda18,0xd9e8,0xd9b8,0xd988, + 0xd958,0xd928,0xd8f8,0xd8c9,0xd899,0xd869,0xd839,0xd809, + 0xd7da,0xd7aa,0xd77a,0xd74b,0xd71b,0xd6eb,0xd6bc,0xd68c, + 0xd65d,0xd62d,0xd5fe,0xd5ce,0xd59f,0xd56f,0xd540,0xd510, + 0xd4e1,0xd4b2,0xd483,0xd453,0xd424,0xd3f5,0xd3c6,0xd396, + 0xd367,0xd338,0xd309,0xd2da,0xd2ab,0xd27c,0xd24d,0xd21e, + 0xd1ef,0xd1c0,0xd192,0xd163,0xd134,0xd105,0xd0d6,0xd0a8, + 0xd079,0xd04a,0xd01c,0xcfed,0xcfbf,0xcf90,0xcf62,0xcf33, + 0xcf05,0xced6,0xcea8,0xce79,0xce4b,0xce1d,0xcdef,0xcdc0, + 0xcd92,0xcd64,0xcd36,0xcd08,0xccda,0xccab,0xcc7d,0xcc4f, + 0xcc21,0xcbf4,0xcbc6,0xcb98,0xcb6a,0xcb3c,0xcb0e,0xcae1, + 0xcab3,0xca85,0xca58,0xca2a,0xc9fc,0xc9cf,0xc9a1,0xc974, + 0xc946,0xc919,0xc8eb,0xc8be,0xc891,0xc864,0xc836,0xc809, + 0xc7dc,0xc7af,0xc782,0xc755,0xc727,0xc6fa,0xc6cd,0xc6a0, + 0xc674,0xc647,0xc61a,0xc5ed,0xc5c0,0xc594,0xc567,0xc53a, + 0xc50e,0xc4e1,0xc4b4,0xc488,0xc45b,0xc42f,0xc402,0xc3d6, + 0xc3aa,0xc37d,0xc351,0xc325,0xc2f9,0xc2cd,0xc2a0,0xc274, + 0xc248,0xc21c,0xc1f0,0xc1c4,0xc198,0xc16d,0xc141,0xc115, + 0xc0e9,0xc0bd,0xc092,0xc066,0xc03b,0xc00f,0xbfe3,0xbfb8, + 0xbf8d,0xbf61,0xbf36,0xbf0a,0xbedf,0xbeb4,0xbe89,0xbe5e, + 0xbe32,0xbe07,0xbddc,0xbdb1,0xbd86,0xbd5b,0xbd30,0xbd06, + 0xbcdb,0xbcb0,0xbc85,0xbc5b,0xbc30,0xbc05,0xbbdb,0xbbb0, + 0xbb86,0xbb5b,0xbb31,0xbb07,0xbadc,0xbab2,0xba88,0xba5d, + 0xba33,0xba09,0xb9df,0xb9b5,0xb98b,0xb961,0xb937,0xb90d, + 0xb8e4,0xb8ba,0xb890,0xb866,0xb83d,0xb813,0xb7ea,0xb7c0, + 0xb797,0xb76d,0xb744,0xb71b,0xb6f1,0xb6c8,0xb69f,0xb676, + 0xb64c,0xb623,0xb5fa,0xb5d1,0xb5a8,0xb580,0xb557,0xb52e, + 0xb505,0xb4dc,0xb4b4,0xb48b,0xb463,0xb43a,0xb412,0xb3e9, + 0xb3c1,0xb398,0xb370,0xb348,0xb320,0xb2f7,0xb2cf,0xb2a7, + 0xb27f,0xb257,0xb22f,0xb207,0xb1e0,0xb1b8,0xb190,0xb168, + 0xb141,0xb119,0xb0f2,0xb0ca,0xb0a3,0xb07b,0xb054,0xb02c, + 0xb005,0xafde,0xafb7,0xaf90,0xaf69,0xaf42,0xaf1b,0xaef4, + 0xaecd,0xaea6,0xae7f,0xae58,0xae32,0xae0b,0xade5,0xadbe, + 0xad98,0xad71,0xad4b,0xad24,0xacfe,0xacd8,0xacb2,0xac8c, + 0xac65,0xac3f,0xac19,0xabf4,0xabce,0xaba8,0xab82,0xab5c, + 0xab37,0xab11,0xaaeb,0xaac6,0xaaa0,0xaa7b,0xaa56,0xaa30, + 0xaa0b,0xa9e6,0xa9c1,0xa99c,0xa976,0xa951,0xa92d,0xa908, + 0xa8e3,0xa8be,0xa899,0xa875,0xa850,0xa82b,0xa807,0xa7e2, + 0xa7be,0xa799,0xa775,0xa751,0xa72d,0xa708,0xa6e4,0xa6c0, + 0xa69c,0xa678,0xa654,0xa631,0xa60d,0xa5e9,0xa5c5,0xa5a2, + 0xa57e,0xa55b,0xa537,0xa514,0xa4f1,0xa4cd,0xa4aa,0xa487, + 0xa464,0xa441,0xa41e,0xa3fb,0xa3d8,0xa3b5,0xa392,0xa36f, + 0xa34d,0xa32a,0xa307,0xa2e5,0xa2c2,0xa2a0,0xa27e,0xa25b, + 0xa239,0xa217,0xa1f5,0xa1d3,0xa1b1,0xa18f,0xa16d,0xa14b, + 0xa129,0xa108,0xa0e6,0xa0c4,0xa0a3,0xa081,0xa060,0xa03e, + 0xa01d,0x9ffc,0x9fdb,0x9fb9,0x9f98,0x9f77,0x9f56,0x9f35, + 0x9f15,0x9ef4,0x9ed3,0x9eb2,0x9e92,0x9e71,0x9e51,0x9e30, + 0x9e10,0x9def,0x9dcf,0x9daf,0x9d8f,0x9d6f,0x9d4f,0x9d2f, + 0x9d0f,0x9cef,0x9ccf,0x9caf,0x9c90,0x9c70,0x9c51,0x9c31, + 0x9c12,0x9bf2,0x9bd3,0x9bb4,0x9b94,0x9b75,0x9b56,0x9b37, + 0x9b18,0x9af9,0x9adb,0x9abc,0x9a9d,0x9a7e,0x9a60,0x9a41, + 0x9a23,0x9a04,0x99e6,0x99c8,0x99aa,0x998b,0x996d,0x994f, + 0x9931,0x9913,0x98f6,0x98d8,0x98ba,0x989c,0x987f,0x9861, + 0x9844,0x9826,0x9809,0x97ec,0x97ce,0x97b1,0x9794,0x9777, + 0x975a,0x973d,0x9720,0x9704,0x96e7,0x96ca,0x96ae,0x9691, + 0x9675,0x9658,0x963c,0x9620,0x9603,0x95e7,0x95cb,0x95af, + 0x9593,0x9577,0x955c,0x9540,0x9524,0x9508,0x94ed,0x94d1, + 0x94b6,0x949b,0x947f,0x9464,0x9449,0x942e,0x9413,0x93f8, + 0x93dd,0x93c2,0x93a7,0x938c,0x9372,0x9357,0x933d,0x9322, + 0x9308,0x92ed,0x92d3,0x92b9,0x929f,0x9285,0x926b,0x9251, + 0x9237,0x921d,0x9203,0x91ea,0x91d0,0x91b6,0x919d,0x9184, + 0x916a,0x9151,0x9138,0x911f,0x9105,0x90ec,0x90d4,0x90bb, + 0x90a2,0x9089,0x9070,0x9058,0x903f,0x9027,0x900e,0x8ff6, + 0x8fde,0x8fc6,0x8fad,0x8f95,0x8f7d,0x8f65,0x8f4e,0x8f36, + 0x8f1e,0x8f06,0x8eef,0x8ed7,0x8ec0,0x8ea8,0x8e91,0x8e7a, + 0x8e63,0x8e4c,0x8e35,0x8e1e,0x8e07,0x8df0,0x8dd9,0x8dc2, + 0x8dac,0x8d95,0x8d7f,0x8d68,0x8d52,0x8d3c,0x8d25,0x8d0f, + 0x8cf9,0x8ce3,0x8ccd,0x8cb7,0x8ca2,0x8c8c,0x8c76,0x8c61, + 0x8c4b,0x8c36,0x8c20,0x8c0b,0x8bf6,0x8be0,0x8bcb,0x8bb6, + 0x8ba1,0x8b8c,0x8b78,0x8b63,0x8b4e,0x8b3a,0x8b25,0x8b10, + 0x8afc,0x8ae8,0x8ad3,0x8abf,0x8aab,0x8a97,0x8a83,0x8a6f, + 0x8a5b,0x8a48,0x8a34,0x8a20,0x8a0d,0x89f9,0x89e6,0x89d3, + 0x89bf,0x89ac,0x8999,0x8986,0x8973,0x8960,0x894d,0x893a, + 0x8928,0x8915,0x8902,0x88f0,0x88de,0x88cb,0x88b9,0x88a7, + 0x8895,0x8883,0x8871,0x885f,0x884d,0x883b,0x8829,0x8818, + 0x8806,0x87f5,0x87e3,0x87d2,0x87c1,0x87b0,0x879e,0x878d, + 0x877c,0x876c,0x875b,0x874a,0x8739,0x8729,0x8718,0x8708, + 0x86f7,0x86e7,0x86d7,0x86c7,0x86b6,0x86a6,0x8696,0x8687, + 0x8677,0x8667,0x8657,0x8648,0x8638,0x8629,0x861a,0x860a, + 0x85fb,0x85ec,0x85dd,0x85ce,0x85bf,0x85b0,0x85a1,0x8593, + 0x8584,0x8575,0x8567,0x8558,0x854a,0x853c,0x852e,0x8520, + 0x8512,0x8504,0x84f6,0x84e8,0x84da,0x84cd,0x84bf,0x84b1, + 0x84a4,0x8497,0x8489,0x847c,0x846f,0x8462,0x8455,0x8448, + 0x843b,0x842e,0x8422,0x8415,0x8408,0x83fc,0x83f0,0x83e3, + 0x83d7,0x83cb,0x83bf,0x83b3,0x83a7,0x839b,0x838f,0x8383, + 0x8378,0x836c,0x8361,0x8355,0x834a,0x833f,0x8333,0x8328, + 0x831d,0x8312,0x8307,0x82fc,0x82f2,0x82e7,0x82dc,0x82d2, + 0x82c7,0x82bd,0x82b3,0x82a9,0x829e,0x8294,0x828a,0x8280, + 0x8277,0x826d,0x8263,0x825a,0x8250,0x8247,0x823d,0x8234, + 0x822b,0x8221,0x8218,0x820f,0x8206,0x81fe,0x81f5,0x81ec, + 0x81e3,0x81db,0x81d2,0x81ca,0x81c2,0x81b9,0x81b1,0x81a9, + 0x81a1,0x8199,0x8191,0x8189,0x8182,0x817a,0x8173,0x816b, + 0x8164,0x815c,0x8155,0x814e,0x8147,0x8140,0x8139,0x8132, + 0x812b,0x8124,0x811e,0x8117,0x8111,0x810a,0x8104,0x80fe, + 0x80f7,0x80f1,0x80eb,0x80e5,0x80df,0x80da,0x80d4,0x80ce, + 0x80c9,0x80c3,0x80be,0x80b8,0x80b3,0x80ae,0x80a9,0x80a4, + 0x809f,0x809a,0x8095,0x8090,0x808c,0x8087,0x8083,0x807e, + 0x807a,0x8076,0x8071,0x806d,0x8069,0x8065,0x8061,0x805e, + 0x805a,0x8056,0x8053,0x804f,0x804c,0x8048,0x8045,0x8042, + 0x803f,0x803c,0x8039,0x8036,0x8033,0x8030,0x802e,0x802b, + 0x8028,0x8026,0x8024,0x8021,0x801f,0x801d,0x801b,0x8019, + 0x8017,0x8015,0x8014,0x8012,0x8010,0x800f,0x800d,0x800c, + 0x800b,0x800a,0x8009,0x8008,0x8007,0x8006,0x8005,0x8004, + 0x8003,0x8003,0x8002,0x8002,0x8002,0x8001,0x8001,0x8001, + 0x8001,0x8001,0x8001,0x8001,0x8002,0x8002,0x8002,0x8003, + 0x8003,0x8004,0x8005,0x8006,0x8007,0x8008,0x8009,0x800a, + 0x800b,0x800c,0x800d,0x800f,0x8010,0x8012,0x8014,0x8015, + 0x8017,0x8019,0x801b,0x801d,0x801f,0x8021,0x8024,0x8026, + 0x8028,0x802b,0x802e,0x8030,0x8033,0x8036,0x8039,0x803c, + 0x803f,0x8042,0x8045,0x8048,0x804c,0x804f,0x8053,0x8056, + 0x805a,0x805e,0x8061,0x8065,0x8069,0x806d,0x8071,0x8076, + 0x807a,0x807e,0x8083,0x8087,0x808c,0x8090,0x8095,0x809a, + 0x809f,0x80a4,0x80a9,0x80ae,0x80b3,0x80b8,0x80be,0x80c3, + 0x80c9,0x80ce,0x80d4,0x80da,0x80df,0x80e5,0x80eb,0x80f1, + 0x80f7,0x80fe,0x8104,0x810a,0x8111,0x8117,0x811e,0x8124, + 0x812b,0x8132,0x8139,0x8140,0x8147,0x814e,0x8155,0x815c, + 0x8164,0x816b,0x8173,0x817a,0x8182,0x8189,0x8191,0x8199, + 0x81a1,0x81a9,0x81b1,0x81b9,0x81c2,0x81ca,0x81d2,0x81db, + 0x81e3,0x81ec,0x81f5,0x81fe,0x8206,0x820f,0x8218,0x8221, + 0x822b,0x8234,0x823d,0x8247,0x8250,0x825a,0x8263,0x826d, + 0x8277,0x8280,0x828a,0x8294,0x829e,0x82a9,0x82b3,0x82bd, + 0x82c7,0x82d2,0x82dc,0x82e7,0x82f2,0x82fc,0x8307,0x8312, + 0x831d,0x8328,0x8333,0x833f,0x834a,0x8355,0x8361,0x836c, + 0x8378,0x8383,0x838f,0x839b,0x83a7,0x83b3,0x83bf,0x83cb, + 0x83d7,0x83e3,0x83f0,0x83fc,0x8408,0x8415,0x8422,0x842e, + 0x843b,0x8448,0x8455,0x8462,0x846f,0x847c,0x8489,0x8497, + 0x84a4,0x84b1,0x84bf,0x84cd,0x84da,0x84e8,0x84f6,0x8504, + 0x8512,0x8520,0x852e,0x853c,0x854a,0x8558,0x8567,0x8575, + 0x8584,0x8593,0x85a1,0x85b0,0x85bf,0x85ce,0x85dd,0x85ec, + 0x85fb,0x860a,0x861a,0x8629,0x8638,0x8648,0x8657,0x8667, + 0x8677,0x8687,0x8696,0x86a6,0x86b6,0x86c7,0x86d7,0x86e7, + 0x86f7,0x8708,0x8718,0x8729,0x8739,0x874a,0x875b,0x876c, + 0x877c,0x878d,0x879e,0x87b0,0x87c1,0x87d2,0x87e3,0x87f5, + 0x8806,0x8818,0x8829,0x883b,0x884d,0x885f,0x8871,0x8883, + 0x8895,0x88a7,0x88b9,0x88cb,0x88de,0x88f0,0x8902,0x8915, + 0x8928,0x893a,0x894d,0x8960,0x8973,0x8986,0x8999,0x89ac, + 0x89bf,0x89d3,0x89e6,0x89f9,0x8a0d,0x8a20,0x8a34,0x8a48, + 0x8a5b,0x8a6f,0x8a83,0x8a97,0x8aab,0x8abf,0x8ad3,0x8ae8, + 0x8afc,0x8b10,0x8b25,0x8b3a,0x8b4e,0x8b63,0x8b78,0x8b8c, + 0x8ba1,0x8bb6,0x8bcb,0x8be0,0x8bf6,0x8c0b,0x8c20,0x8c36, + 0x8c4b,0x8c61,0x8c76,0x8c8c,0x8ca2,0x8cb7,0x8ccd,0x8ce3, + 0x8cf9,0x8d0f,0x8d25,0x8d3c,0x8d52,0x8d68,0x8d7f,0x8d95, + 0x8dac,0x8dc2,0x8dd9,0x8df0,0x8e07,0x8e1e,0x8e35,0x8e4c, + 0x8e63,0x8e7a,0x8e91,0x8ea8,0x8ec0,0x8ed7,0x8eef,0x8f06, + 0x8f1e,0x8f36,0x8f4e,0x8f65,0x8f7d,0x8f95,0x8fad,0x8fc6, + 0x8fde,0x8ff6,0x900e,0x9027,0x903f,0x9058,0x9070,0x9089, + 0x90a2,0x90bb,0x90d4,0x90ec,0x9105,0x911f,0x9138,0x9151, + 0x916a,0x9184,0x919d,0x91b6,0x91d0,0x91ea,0x9203,0x921d, + 0x9237,0x9251,0x926b,0x9285,0x929f,0x92b9,0x92d3,0x92ed, + 0x9308,0x9322,0x933d,0x9357,0x9372,0x938c,0x93a7,0x93c2, + 0x93dd,0x93f8,0x9413,0x942e,0x9449,0x9464,0x947f,0x949b, + 0x94b6,0x94d1,0x94ed,0x9508,0x9524,0x9540,0x955c,0x9577, + 0x9593,0x95af,0x95cb,0x95e7,0x9603,0x9620,0x963c,0x9658, + 0x9675,0x9691,0x96ae,0x96ca,0x96e7,0x9704,0x9720,0x973d, + 0x975a,0x9777,0x9794,0x97b1,0x97ce,0x97ec,0x9809,0x9826, + 0x9844,0x9861,0x987f,0x989c,0x98ba,0x98d8,0x98f6,0x9913, + 0x9931,0x994f,0x996d,0x998b,0x99aa,0x99c8,0x99e6,0x9a04, + 0x9a23,0x9a41,0x9a60,0x9a7e,0x9a9d,0x9abc,0x9adb,0x9af9, + 0x9b18,0x9b37,0x9b56,0x9b75,0x9b94,0x9bb4,0x9bd3,0x9bf2, + 0x9c12,0x9c31,0x9c51,0x9c70,0x9c90,0x9caf,0x9ccf,0x9cef, + 0x9d0f,0x9d2f,0x9d4f,0x9d6f,0x9d8f,0x9daf,0x9dcf,0x9def, + 0x9e10,0x9e30,0x9e51,0x9e71,0x9e92,0x9eb2,0x9ed3,0x9ef4, + 0x9f15,0x9f35,0x9f56,0x9f77,0x9f98,0x9fb9,0x9fdb,0x9ffc, + 0xa01d,0xa03e,0xa060,0xa081,0xa0a3,0xa0c4,0xa0e6,0xa108, + 0xa129,0xa14b,0xa16d,0xa18f,0xa1b1,0xa1d3,0xa1f5,0xa217, + 0xa239,0xa25b,0xa27e,0xa2a0,0xa2c2,0xa2e5,0xa307,0xa32a, + 0xa34d,0xa36f,0xa392,0xa3b5,0xa3d8,0xa3fb,0xa41e,0xa441, + 0xa464,0xa487,0xa4aa,0xa4cd,0xa4f1,0xa514,0xa537,0xa55b, + 0xa57e,0xa5a2,0xa5c5,0xa5e9,0xa60d,0xa631,0xa654,0xa678, + 0xa69c,0xa6c0,0xa6e4,0xa708,0xa72d,0xa751,0xa775,0xa799, + 0xa7be,0xa7e2,0xa807,0xa82b,0xa850,0xa875,0xa899,0xa8be, + 0xa8e3,0xa908,0xa92d,0xa951,0xa976,0xa99c,0xa9c1,0xa9e6, + 0xaa0b,0xaa30,0xaa56,0xaa7b,0xaaa0,0xaac6,0xaaeb,0xab11, + 0xab37,0xab5c,0xab82,0xaba8,0xabce,0xabf4,0xac19,0xac3f, + 0xac65,0xac8c,0xacb2,0xacd8,0xacfe,0xad24,0xad4b,0xad71, + 0xad98,0xadbe,0xade5,0xae0b,0xae32,0xae58,0xae7f,0xaea6, + 0xaecd,0xaef4,0xaf1b,0xaf42,0xaf69,0xaf90,0xafb7,0xafde, + 0xb005,0xb02c,0xb054,0xb07b,0xb0a3,0xb0ca,0xb0f2,0xb119, + 0xb141,0xb168,0xb190,0xb1b8,0xb1e0,0xb207,0xb22f,0xb257, + 0xb27f,0xb2a7,0xb2cf,0xb2f7,0xb320,0xb348,0xb370,0xb398, + 0xb3c1,0xb3e9,0xb412,0xb43a,0xb463,0xb48b,0xb4b4,0xb4dc, + 0xb505,0xb52e,0xb557,0xb580,0xb5a8,0xb5d1,0xb5fa,0xb623, + 0xb64c,0xb676,0xb69f,0xb6c8,0xb6f1,0xb71b,0xb744,0xb76d, + 0xb797,0xb7c0,0xb7ea,0xb813,0xb83d,0xb866,0xb890,0xb8ba, + 0xb8e4,0xb90d,0xb937,0xb961,0xb98b,0xb9b5,0xb9df,0xba09, + 0xba33,0xba5d,0xba88,0xbab2,0xbadc,0xbb07,0xbb31,0xbb5b, + 0xbb86,0xbbb0,0xbbdb,0xbc05,0xbc30,0xbc5b,0xbc85,0xbcb0, + 0xbcdb,0xbd06,0xbd30,0xbd5b,0xbd86,0xbdb1,0xbddc,0xbe07, + 0xbe32,0xbe5e,0xbe89,0xbeb4,0xbedf,0xbf0a,0xbf36,0xbf61, + 0xbf8d,0xbfb8,0xbfe3,0xc00f,0xc03b,0xc066,0xc092,0xc0bd, + 0xc0e9,0xc115,0xc141,0xc16d,0xc198,0xc1c4,0xc1f0,0xc21c, + 0xc248,0xc274,0xc2a0,0xc2cd,0xc2f9,0xc325,0xc351,0xc37d, + 0xc3aa,0xc3d6,0xc402,0xc42f,0xc45b,0xc488,0xc4b4,0xc4e1, + 0xc50e,0xc53a,0xc567,0xc594,0xc5c0,0xc5ed,0xc61a,0xc647, + 0xc674,0xc6a0,0xc6cd,0xc6fa,0xc727,0xc755,0xc782,0xc7af, + 0xc7dc,0xc809,0xc836,0xc864,0xc891,0xc8be,0xc8eb,0xc919, + 0xc946,0xc974,0xc9a1,0xc9cf,0xc9fc,0xca2a,0xca58,0xca85, + 0xcab3,0xcae1,0xcb0e,0xcb3c,0xcb6a,0xcb98,0xcbc6,0xcbf4, + 0xcc21,0xcc4f,0xcc7d,0xccab,0xccda,0xcd08,0xcd36,0xcd64, + 0xcd92,0xcdc0,0xcdef,0xce1d,0xce4b,0xce79,0xcea8,0xced6, + 0xcf05,0xcf33,0xcf62,0xcf90,0xcfbf,0xcfed,0xd01c,0xd04a, + 0xd079,0xd0a8,0xd0d6,0xd105,0xd134,0xd163,0xd192,0xd1c0, + 0xd1ef,0xd21e,0xd24d,0xd27c,0xd2ab,0xd2da,0xd309,0xd338, + 0xd367,0xd396,0xd3c6,0xd3f5,0xd424,0xd453,0xd483,0xd4b2, + 0xd4e1,0xd510,0xd540,0xd56f,0xd59f,0xd5ce,0xd5fe,0xd62d, + 0xd65d,0xd68c,0xd6bc,0xd6eb,0xd71b,0xd74b,0xd77a,0xd7aa, + 0xd7da,0xd809,0xd839,0xd869,0xd899,0xd8c9,0xd8f8,0xd928, + 0xd958,0xd988,0xd9b8,0xd9e8,0xda18,0xda48,0xda78,0xdaa8, + 0xdad8,0xdb08,0xdb38,0xdb69,0xdb99,0xdbc9,0xdbf9,0xdc29, + 0xdc5a,0xdc8a,0xdcba,0xdceb,0xdd1b,0xdd4b,0xdd7c,0xddac, + 0xdddd,0xde0d,0xde3e,0xde6e,0xde9f,0xdecf,0xdf00,0xdf30, + 0xdf61,0xdf91,0xdfc2,0xdff3,0xe023,0xe054,0xe085,0xe0b6, + 0xe0e6,0xe117,0xe148,0xe179,0xe1a9,0xe1da,0xe20b,0xe23c, + 0xe26d,0xe29e,0xe2cf,0xe300,0xe331,0xe362,0xe393,0xe3c4, + 0xe3f5,0xe426,0xe457,0xe488,0xe4b9,0xe4ea,0xe51b,0xe54c, + 0xe57e,0xe5af,0xe5e0,0xe611,0xe642,0xe674,0xe6a5,0xe6d6, + 0xe707,0xe739,0xe76a,0xe79b,0xe7cd,0xe7fe,0xe830,0xe861, + 0xe892,0xe8c4,0xe8f5,0xe927,0xe958,0xe98a,0xe9bb,0xe9ed, + 0xea1e,0xea50,0xea81,0xeab3,0xeae4,0xeb16,0xeb47,0xeb79, + 0xebab,0xebdc,0xec0e,0xec40,0xec71,0xeca3,0xecd5,0xed06, + 0xed38,0xed6a,0xed9c,0xedcd,0xedff,0xee31,0xee63,0xee94, + 0xeec6,0xeef8,0xef2a,0xef5c,0xef8e,0xefbf,0xeff1,0xf023, + 0xf055,0xf087,0xf0b9,0xf0eb,0xf11d,0xf14f,0xf180,0xf1b2, + 0xf1e4,0xf216,0xf248,0xf27a,0xf2ac,0xf2de,0xf310,0xf342, + 0xf374,0xf3a6,0xf3d8,0xf40a,0xf43c,0xf46e,0xf4a1,0xf4d3, + 0xf505,0xf537,0xf569,0xf59b,0xf5cd,0xf5ff,0xf631,0xf663, + 0xf696,0xf6c8,0xf6fa,0xf72c,0xf75e,0xf790,0xf7c2,0xf7f5, + 0xf827,0xf859,0xf88b,0xf8bd,0xf8ef,0xf922,0xf954,0xf986, + 0xf9b8,0xf9ea,0xfa1d,0xfa4f,0xfa81,0xfab3,0xfae5,0xfb18, + 0xfb4a,0xfb7c,0xfbae,0xfbe1,0xfc13,0xfc45,0xfc77,0xfcaa, + 0xfcdc,0xfd0e,0xfd40,0xfd73,0xfda5,0xfdd7,0xfe09,0xfe3c, + 0xfe6e,0xfea0,0xfed2,0xff05,0xff37,0xff69,0xff9b,0xffce +}; + +int intsin(int arg) +{ + unsigned int u; + int p; + + u = arg; + u &= 0xffff; + u >>= 4; + + p = (signed short)sintbl[u]; + + return p; +} + +int intcos(int arg) +{ + return intsin(arg + 16384); +} diff --git a/modules/Makefile b/modules/Makefile new file mode 100644 index 0000000..de5509a --- /dev/null +++ b/modules/Makefile @@ -0,0 +1,16 @@ +LDFLAGS=-lm +CFLAGS=-O2 -g -Wall -pedantic -I../include + +MODULES = send_to_audio.o pulsegen.o sinegen.o replicate.o \ + mod_scrambler.o modulator-V29.o fsk_demod.o fsk_mod.o \ + decode_serial.o encode_serial.o debug.o + +HELPERS = scrambler17.o + +all: modules.a + +modules.a: $(MODULES) $(HELPERS) + $(AR) rcs $@ $^ + +clean: + rm -f $(MODULES) *~ diff --git a/modules/debug.c b/modules/debug.c new file mode 100644 index 0000000..73ec795 --- /dev/null +++ b/modules/debug.c @@ -0,0 +1,88 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Debugging module. Take input stream and print it out to stderr. + Then pass it on. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include +#include + +typedef struct { + + /* How many bytes are there per "len" unit ? */ + int bytes_per_sample; + +} debug_private; + +/* Free the private data + */ +void debug_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int debug_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int debug_handle(ifax_modp self, void *data, size_t length) +{ + unsigned char *dat=data; + int handled=0; + int x; + + debug_private *priv=(debug_private *)self->private; + + while(handledbytes_per_sample;x++,dat++) + fprintf(stderr,"%2x(%c) ",*dat,*dat); + + fprintf(stderr,"\n"); + fflush(stderr); + + handled++; + } + if (self->sendto) + ifax_handle_input(self->sendto,data,length); + return handled; +} + +int debug_construct(ifax_modp self,va_list args) +{ + debug_private *priv; + if (NULL==(priv=self->private=malloc(sizeof(debug_private)))) + return 1; + self->destroy =debug_destroy; + self->handle_input =debug_handle; + self->command =debug_command; + + priv->bytes_per_sample=va_arg(args,int); + + return 0; +} diff --git a/modules/decode_serial.c b/modules/decode_serial.c new file mode 100644 index 0000000..b1e8691 --- /dev/null +++ b/modules/decode_serial.c @@ -0,0 +1,186 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Decoder for serial data input. Expects a datastream of alternating + 0/1,confidence bytes at SAMPLES_PER_SECOND. + Outputs decoded bytes that came in without any error. + Automatically locks onto the start/stop bits. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include +#include +#include +#include +#include +#include +#include + +enum parity { + PAR_NONE, + PAR_ODD, + PAR_EVEN, + PAR_ONE, + PAR_ZERO +}; + +typedef struct { + + int baud; + int bits; + int stopbits; + enum parity parity; + + char lastbits[11]; + int bitnum; + int sampcount; + +} decode_serial_private; + +/* Free the private data + */ +void decode_serial_destroy(ifax_modp self) +{ + decode_serial_private *priv=(decode_serial_private *)self->private; + + free(self->private); + + return; +} + +int decode_serial_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int decode_serial_handle(ifax_modp self, void *data, size_t length) +{ + char *dat=data; + int currbit,currconf; + int x,result,handled,parity; + char hlpres; + + decode_serial_private *priv=(decode_serial_private *)self->private; + + handled=0; + while(length--) { + + currbit =*dat++; + currconf=*dat++; + priv->sampcount++; + +// printf("%d,%d\n",currbit,currconf); + + if (currconf<10) continue; + + if (priv->bitnum==-1) { + if (currbit==1) continue; + priv->bitnum=0; + priv->sampcount=-SAMPLES_PER_SECOND/2/priv->baud; + } else + if ( priv->sampcount >= priv->bitnum* + SAMPLES_PER_SECOND/priv->baud) + { + if (priv->bitnum==0 && currbit!=0) { + priv->bitnum=-1; + continue; /* Garbage */ + } + if (priv->bitnum==9 && currbit!=1) { + priv->bitnum=-1; + continue; /* Garbage */ + } + + priv->lastbits[priv->bitnum++]=currbit; + + if (priv->bitnum >= 1+8+priv->stopbits) { + result=parity=0; + for (x=0;xbits;x++) + { + result|=priv->lastbits[x+1]<lastbits[x+1]; + } +// for (x=0;xbitnum;x++) +// printf("%d%s",priv->lastbits[x], (x==0 || x==8) ? " " : ""); + priv->bitnum=-1; + switch(priv->parity) { + case PAR_NONE: parity=0;break; + case PAR_ODD: parity=(parity==priv->lastbits[8]);break; + case PAR_EVEN: parity=(parity!=priv->lastbits[8]);break; + case PAR_ONE: parity=(1!=priv->lastbits[8]);break; + case PAR_ZERO: parity=(0!=priv->lastbits[8]);break; + } + hlpres=result; +// printf(" %c\n",result); + if (parity==0 && self->sendto) + ifax_handle_input(self->sendto,&hlpres,1); + } + } + handled++; + } + return handled; +} + +int decode_serial_construct(ifax_modp self,va_list args) +{ + decode_serial_private *priv; + char *encode; + + if (NULL==(priv=self->private=malloc(sizeof(decode_serial_private)))) + return 1; + self->destroy =decode_serial_destroy; + self->handle_input =decode_serial_handle; + self->command =decode_serial_command; + + priv->baud=va_arg(args,int); + encode =va_arg(args,char *); + + switch(encode[0]) + { + case '7': priv->bits=7;break; + default : fprintf(stderr,"not 7/8 bits !\n"); + case '8': priv->bits=8;break; + } + + switch(encode[1]) + { + default : fprintf(stderr,"invalid parity specified !\n"); + case 'N': case 'n': priv->parity=PAR_NONE;break; + case 'O': case 'o': priv->parity=PAR_ODD ;break; + case 'E': case 'e': priv->parity=PAR_EVEN;break; + case '1': priv->parity=PAR_ONE ;break; + case '0': priv->parity=PAR_ZERO;break; + } + + switch(encode[2]) + { + default : fprintf(stderr,"not 1/2 stopbits !\n"); + case '1': priv->stopbits=1;break; + case '2': priv->stopbits=2;break; + } + + priv->bitnum=-1; /* Init to "wait for 0->1" */ + priv->sampcount=0; + + return 0; +} diff --git a/modules/encode_serial.c b/modules/encode_serial.c new file mode 100644 index 0000000..999df17 --- /dev/null +++ b/modules/encode_serial.c @@ -0,0 +1,184 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Serial bits encoder. Takes bytes as input and generates 0/1 bytes at + SAMPLES_PER_SECOND. Take care not to overflow the input buffer. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +enum parity { + PAR_NONE, + PAR_ODD, + PAR_EVEN, + PAR_ONE, + PAR_ZERO +}; + +#define MAXBUFLEN 256 + +typedef struct { + + int baud; + int bits; + int stopbits; + enum parity parity; + + char lastbits[11]; + int bitnum; + int sampcount; + + char buffer[MAXBUFLEN]; + int bufferlen; + +} encode_serial_private; + +/* Free the private data + */ +void encode_serial_destroy(ifax_modp self) +{ + encode_serial_private *priv=(encode_serial_private *)self->private; + + free(self->private); + + return; +} + +int encode_serial_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int encode_serial_handle(ifax_modp self, void *data, size_t length) +{ + char *dat=data; + int x,handled,parity; + char hlpres; + + encode_serial_private *priv=(encode_serial_private *)self->private; + + handled=0; + while(length--) { + if (priv->bufferlenbuffer[priv->bufferlen++]=*dat++; + handled++; + } else + fprintf(stderr,"encode_serial: buffer overrun."); + } + if (priv->bufferlen && priv->bitnum==-1) + { + priv->lastbits[0]=0; /* START BIT */ + parity=0; + for(x=0;xbits;x++) + { + priv->lastbits[x+1]=((priv->buffer[0]&(1<lastbits[x+1]; + } + switch(priv->parity) { + case PAR_NONE: break; + case PAR_ODD: priv->lastbits[8]=!parity;break; + case PAR_EVEN: priv->lastbits[8]= parity;break; + case PAR_ONE: priv->lastbits[8]= 1 ;break; + case PAR_ZERO: priv->lastbits[8]= 0 ;break; + } + priv->lastbits[9]=1; /* STOP BIT */ + priv->lastbits[10]=1; /* STOP BIT - maybe not used */ + memmove(priv->buffer,priv->buffer+1,--priv->bufferlen); + priv->bitnum=0; + priv->sampcount=0; + } + + hlpres=1; /* constant 1 for no activity */ + + if (priv->bitnum>=0) + { + hlpres=priv->lastbits[priv->bitnum]; + + priv->sampcount++; + + if ( priv->sampcount >= (priv->bitnum+1)* + SAMPLES_PER_SECOND/priv->baud) + { + priv->bitnum++; + if (priv->bitnum>= 1+8+priv->stopbits) + priv->bitnum=-1; + } + } + ifax_handle_input(self->sendto,&hlpres,1); + + return handled; +} + +int encode_serial_construct(ifax_modp self,va_list args) +{ + encode_serial_private *priv; + char *encode; + + if (NULL==(priv=self->private=malloc(sizeof(encode_serial_private)))) + return 1; + self->destroy =encode_serial_destroy; + self->handle_input =encode_serial_handle; + self->command =encode_serial_command; + + priv->baud=va_arg(args,int); + encode =va_arg(args,char *); + + switch(encode[0]) + { + case '7': priv->bits=7;break; + default : fprintf(stderr,"not 7/8 bits !\n"); + case '8': priv->bits=8;break; + } + + switch(encode[1]) + { + default : fprintf(stderr,"invalid parity specified !\n"); + case 'N': case 'n': priv->parity=PAR_NONE;break; + case 'O': case 'o': priv->parity=PAR_ODD ;break; + case 'E': case 'e': priv->parity=PAR_EVEN;break; + case '1': priv->parity=PAR_ONE ;break; + case '0': priv->parity=PAR_ZERO;break; + } + + switch(encode[2]) + { + default : fprintf(stderr,"not 1/2 stopbits !\n"); + case '1': priv->stopbits=1;break; + case '2': priv->stopbits=2;break; + } + + priv->bitnum=-1; /* Init to "wait for 0->1" */ + priv->sampcount=0; + priv->bufferlen=0; + + return 0; +} diff --git a/modules/fsk_demod.c b/modules/fsk_demod.c new file mode 100644 index 0000000..5f5362c --- /dev/null +++ b/modules/fsk_demod.c @@ -0,0 +1,215 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + FSK demodulator. Takes alaw data and demodulates it to a stream of + 0/1,conf pairs. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include +#include +#include +#include +#include +#include +#include + +/* Turn on to generate a big bunch of debugging code. + */ +#undef BIGDEBUG + +typedef struct four_help { + + int depth,depthsquare,currpos; + int currreal,currimag; + char *histreal,*histimag; + int stpos,ctpos,stdepth; + char *fasttable; + +} four_help; + + +typedef struct { + + four_help freq1,freq2; + int f1,f2; + int baud; + +} fskdemod_private; + +int gcd(int d1,int d2) +{ + /* FIXME ! Is this correct ? Pretty long ago that I did that last time ... */ + while(d1!=d2) + { + if (d1>d2) d1-=d2; + else d2-=d1; + } + dprintf(DEBUG_INFO,"GCD is %d\n",d1); + return d1; +} + +/* The following do the DFT "on the fly" with a sliding window. + */ + +static void init_four_help(four_help *hlp,int depth,int freq) +{ + int x,y; + char *ftptr; + double sinval; + + hlp->depth=depth; + hlp->depthsquare=depth*depth; + hlp->currpos=0; + hlp->currreal=hlp->currimag=0; + hlp->histreal=malloc(sizeof(hlp->histreal[0])*depth); + hlp->histimag=malloc(sizeof(hlp->histimag[0])*depth); + while(depth--) + hlp->histreal[depth]= + hlp->histimag[depth]=0; + + x=gcd(freq,SAMPLES_PER_SECOND);x=SAMPLES_PER_SECOND/x; + if (x%4) { + fprintf(stderr,"fsk_demod: ERROR: sinetable size not divideable by 4.\n" + "Cosine shift is slighty incorrect.\n"); + } + hlp->stdepth=256*x; + hlp->stpos=0; + hlp->ctpos=256*(x/4); /* The bracket _IS_ important. Do not optimize. */ + + hlp->fasttable=malloc(sizeof(hlp->fasttable[0])*hlp->stdepth); + ftptr=hlp->fasttable; + for(x=0;xstdepth/256;x++) + { + sinval=sin(x*2.0*M_PI*(double)freq/(double)SAMPLES_PER_SECOND); + for(y=0;y<256;y++) + *ftptr++=((int)(sinval*alaw2int(y))) >> + ((sizeof(int)-sizeof(char))*8); + } +} + +/* Free the private data + */ +static void destroy_four_help(four_help *hlp) +{ + free(hlp->histreal); hlp->histreal=NULL; + free(hlp->histimag); hlp->histimag=NULL; + free(hlp->fasttable);hlp->fasttable=NULL; +} + +inline void add_samp(four_help *hlp,char sample) +{ + hlp->currreal-=hlp->histreal[hlp->currpos]; + hlp->currimag-=hlp->histimag[hlp->currpos]; + + hlp->currreal+= + (hlp->histreal[hlp->currpos]=hlp->fasttable[hlp->stpos+(unsigned char)sample]); + hlp->currimag+= + (hlp->histimag[hlp->currpos]=hlp->fasttable[hlp->ctpos+(unsigned char)sample]); + + hlp->currpos++ ;if (hlp->currpos>=hlp->depth ) hlp->currpos=0; + hlp->stpos+=256;if (hlp->stpos >=hlp->stdepth) hlp->stpos=0; + hlp->ctpos+=256;if (hlp->ctpos >=hlp->stdepth) hlp->ctpos=0; +} + +void fskdemod_destroy(ifax_modp self) +{ + fskdemod_private *priv=(fskdemod_private *)self->private; + + destroy_four_help(&priv->freq1); + destroy_four_help(&priv->freq2); + free(self->private); + + return; +} + +int fskdemod_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int fskdemod_handle(ifax_modp self, void *data, size_t length) +{ + unsigned char dat[2]; + char *input=data; + int a1,a2,conf,pwr; + int handled=0; + + fskdemod_private *priv=(fskdemod_private *)self->private; + + while(length--) { + + add_samp(&priv->freq1,*input); + add_samp(&priv->freq2,*input); + input++; + + a1=priv->freq1.currreal*priv->freq1.currreal+ + priv->freq1.currimag*priv->freq1.currimag; + a2=priv->freq2.currreal*priv->freq2.currreal+ + priv->freq2.currimag*priv->freq2.currimag; +#ifdef BIGDEBUG + printf("Power: %d: %8d, %d: %8d", + priv->f1,a1,priv->f2,a2); +#endif + if (!a2) a2=1;if (!a1) a1=1; + if (a1>a2) { conf=100-100*a2/a1; pwr=a1/priv->freq1.depthsquare; } + else { conf=100-100*a1/a2; pwr=a2/priv->freq2.depthsquare; } +#ifdef BIGDEBUG + printf(" dec: %d conf=%d pwr=%d\n", + a1 > a2 ? 1 : 0, + conf, + pwr ); +#endif + + dat[0]= a1 > a2 ? 1 : 0; + dat[1]= pwr<10 ? 0 : conf; /* Don't trust weak signals. */ + + ifax_handle_input(self->sendto,dat,1); + handled++; + } + return handled; +} + +int fskdemod_construct(ifax_modp self,va_list args) +{ + fskdemod_private *priv; + int sampbaud; + + if (NULL==(priv=self->private=malloc(sizeof(fskdemod_private)))) + return 1; + self->destroy =fskdemod_destroy; + self->handle_input =fskdemod_handle; + self->command =fskdemod_command; + + priv->f1 =va_arg(args,int); + priv->f2 =va_arg(args,int); + priv->baud=va_arg(args,int); + + sampbaud=(SAMPLES_PER_SECOND+priv->baud)/priv->baud; + + init_four_help(&priv->freq1,sampbaud,priv->f1); + init_four_help(&priv->freq2,sampbaud,priv->f2); + + return 0; +} diff --git a/modules/fsk_mod.c b/modules/fsk_mod.c new file mode 100644 index 0000000..324d42f --- /dev/null +++ b/modules/fsk_mod.c @@ -0,0 +1,112 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + FSK modulator. This is a pretty simple one. It takes a stream of 0/1 + and generates an FSK modulated signal. + BUGBUG: The output encoding isn't well defined. It is configured in the + source at the moment ... + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include +#include +#include +#include +#include +#include +#include + +/* Turn on to generate a big bunch of debugging code. + */ +#undef BIGDEBUG + +typedef struct { + + int f1,f2; + double p1,p2; + double currphase; + +} fskmod_private; + +/* Free the private data + */ +void fskmod_destroy(ifax_modp self) +{ + fskmod_private *priv=(fskmod_private *)self->private; + + free(self->private); + + return; +} + +int fskmod_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int fskmod_handle(ifax_modp self, void *data, size_t length) +{ + unsigned char dat; + char *input=data; + int handled=0; + + fskmod_private *priv=(fskmod_private *)self->private; + + while(length--) { + + priv->currphase+= *input++ ? priv->p1 : priv->p2 ; + dat=int2alaw((int)(0.62*2147483647.0*sin(priv->currphase))); +// dat=linear2ulaw((short)(25000.0*sin(priv->currphase))); +#if 0 + printf("Phases: %8.5f %11d %5d %11d %11d\n",sin(priv->currphase), + (int)(2147483647.0*sin(priv->currphase)), + dat, alaw2int(dat), + (int)(2147483647.0*sin(priv->currphase))-alaw2int(dat)); +#endif + ifax_handle_input(self->sendto,&dat,1); + handled++; + } + return handled; +} + +int fskmod_construct(ifax_modp self,va_list args) +{ + fskmod_private *priv; + + if (NULL==(priv=self->private=malloc(sizeof(fskmod_private)))) + return 1; + self->destroy =fskmod_destroy; + self->handle_input =fskmod_handle; + self->command =fskmod_command; + + priv->f1 =va_arg(args,int); + priv->f2 =va_arg(args,int); + priv->p1 =(double)2.0*M_PI * (double)priv->f1 / SAMPLES_PER_SECOND ; + priv->p2 =(double)2.0*M_PI * (double)priv->f2 / SAMPLES_PER_SECOND ; + priv->currphase=0.0; + + printf("Phases : %f %f\n",priv->p1,priv->p2); + + return 0; +} diff --git a/modules/mod_scrambler.c b/modules/mod_scrambler.c new file mode 100644 index 0000000..a8b695b --- /dev/null +++ b/modules/mod_scrambler.c @@ -0,0 +1,84 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Scrambler. + + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include + +#include + +#define MAXBUFFERING 256 + +typedef struct { + + unsigned int state; + unsigned char buffer[MAXBUFFERING]; + +} scrambler_private; + +/* Free the private data + */ +void scrambler_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int scrambler_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; +} + +int scrambler_handle(ifax_modp self, void *data, size_t length) +{ + scrambler_private *priv=(scrambler_private *)self->private; + size_t chunk, remaining=length; + + while ( remaining > 0 ) { + chunk = remaining; + if ( chunk > MAXBUFFERING ) + chunk = MAXBUFFERING; + scramble17(data,priv->buffer,&priv->state,chunk); + ifax_handle_input(self->sendto,priv->buffer,chunk); + remaining -= chunk; + } + + return length; +} + +int scrambler_construct(ifax_modp self,va_list args) +{ + scrambler_private *priv; + if (NULL==(priv=self->private=malloc(sizeof(scrambler_private)))) + return 1; + self->destroy =scrambler_destroy; + self->handle_input =scrambler_handle; + self->command =scrambler_command; + + priv->state=0; + + return 0; +} diff --git a/modules/modulator-V29.c b/modules/modulator-V29.c new file mode 100644 index 0000000..3176b36 --- /dev/null +++ b/modules/modulator-V29.c @@ -0,0 +1,158 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + V.29 modulator. + + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +/* modulator-V29.c + * + * Modulate a bitstream into 9600 bit/s according to V.29 + * + * (C) 1998 Morten Rolland + */ + +/* Bugs: Can only do 9600 */ + +#include +#include +#include + +/* Samplerate and samples/symbol is closely related here */ +#define SAMPLERATE 9600 +#define SAMPLESPERSYMBOL 4 + +/* Carrier frequency */ +#define CARRIERFREQ 1700 + +/* This is the delta-phase for the carrier */ +#define SAMPLEPHASEINC ((0x10000*CARRIERFREQ)/SAMPLERATE) + +#define MAXBUFFERING 128 + +typedef struct { + + unsigned int prev_phase; + unsigned short w; + signed short buffer[MAXBUFFERING+2*SAMPLESPERSYMBOL]; + /* unsigned char watingbits; (For use when symbol != 4 bits + int waitingbits_count; */ + +} modulator_V29_private; + +unsigned char bits2phase[] = { 1,0,2,3,6,7,5,4 }; + +/* Free the private data + */ +void modulator_V29_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int modulator_V29_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; +} + +void modulate_symbol(unsigned char bits, signed short *dst, + unsigned int *prev_phase, unsigned short *w) +{ + unsigned int p; + signed short wave, amp; + signed int sample; + int t; + + p = (*prev_phase + bits2phase[bits>>1]) & 0x7; + *prev_phase = p; + + fprintf(stderr,"%d\n",p*45); + + if ( p & 1 ) { + /* 45 + 90*n */ + if ( bits & 1 ) { + amp = 27798; + } else { + amp = 9266; + } + } else { + /* 0 + 90*n */ + if ( bits & 1 ) { + amp = 32760; + } else { + amp = 19656; + } + } + + p *= 0x2000; + + for ( t=0; t < SAMPLESPERSYMBOL; t++ ) { + wave = intsin(*w + p); + sample = wave * amp; + sample /= 0x10000; + printf("%d\n",sample); + *dst++ = sample; + *w += SAMPLEPHASEINC; + } +} + +int modulator_V29_handle(ifax_modp self, void *data, size_t length) +{ + modulator_V29_private *priv=(modulator_V29_private *)self->private; + size_t chunk, remaining=length; + signed short *bp = priv->buffer; + unsigned char *dp = data; + int t; + + while ( remaining > 0 ) { + + chunk = remaining; + if ( chunk > MAXBUFFERING ) + chunk = MAXBUFFERING; + for ( t=0; t < chunk; t++ ) { + modulate_symbol(dp[t]&0xf,bp,&priv->prev_phase,&priv->w); + bp += SAMPLESPERSYMBOL; + modulate_symbol(dp[t]>>4,bp,&priv->prev_phase,&priv->w); + bp += SAMPLESPERSYMBOL; + } + /* ifax_handle_input(self->sendto,priv->buffer,chunk); */ + remaining -= chunk; + } + + return length; +} + +int modulator_V29_construct(ifax_modp self,va_list args) +{ + modulator_V29_private *priv; + if (NULL==(priv=self->private=malloc(sizeof(modulator_V29_private)))) + return 1; + self->destroy = modulator_V29_destroy; + self->handle_input = modulator_V29_handle; + self->command = modulator_V29_command; + + priv->w = 0; + priv->prev_phase = 0; + + return 0; +} diff --git a/modules/pulsegen.c b/modules/pulsegen.c new file mode 100644 index 0000000..573cd47 --- /dev/null +++ b/modules/pulsegen.c @@ -0,0 +1,89 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Pulse generator. Takes a dummy input stream and generates a pulsed + output of 0/1. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include + +typedef struct { + + int on,off; + int counter,state; + +} pulsegen_private; + +/* Free the private data + */ +void pulsegen_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int pulsegen_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int pulsegen_handle(ifax_modp self, void *data, size_t length) +{ + unsigned char dat; + int handled=0; + + pulsegen_private *priv=(pulsegen_private *)self->private; + + while(length--) { + + dat= priv->state ? 255 : 0; + + if (--priv->counter==0) { + priv->state = !priv->state; + priv->counter = priv->state ? priv->on : priv->off ; + } + + ifax_handle_input(self->sendto,&dat,1); + handled++; + } + return handled; +} + +int pulsegen_construct(ifax_modp self,va_list args) +{ + pulsegen_private *priv; + if (NULL==(priv=self->private=malloc(sizeof(pulsegen_private)))) + return 1; + self->destroy =pulsegen_destroy; + self->handle_input =pulsegen_handle; + self->command =pulsegen_command; + + priv->on =va_arg(args,int); + priv->off=va_arg(args,int); + priv->counter=priv->on; /* Start in the "on" state */ + priv->state=1; + + return 0; +} diff --git a/modules/replicate.c b/modules/replicate.c new file mode 100644 index 0000000..597c1f2 --- /dev/null +++ b/modules/replicate.c @@ -0,0 +1,94 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Replicator module. Gives incoming data to all attached modules. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include +#include +#include + +#define MAXSUB 10 + +typedef struct { + + int subnum; + ifax_modp subs[MAXSUB]; + +} replicate_private; + +/* Free the private data + */ +void replicate_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int replicate_command(ifax_modp self,int cmd,va_list cmds) +{ + replicate_private *priv=(replicate_private *)self->private; + + switch(cmd) + { case CMD_REPLICATE_ADD: + if (priv->subnum>=MAXSUB) return -1; + priv->subs[priv->subnum++]=va_arg(cmds,ifax_modp); + break; + case CMD_REPLICATE_DEL: + /* FIXME ! Search and destroy references */ + {}; + } + return 0; /* Not yet used. */ +} + +int replicate_handle(ifax_modp self, void *data, size_t length) +{ + replicate_private *priv=(replicate_private *)self->private; + + int rc,x; + + rc=0; + for(x=0;xsubnum;x++) + rc=ifax_handle_input(priv->subs[x],data,length); + if (self->sendto) + rc=ifax_handle_input(self->sendto,data,length); + + return rc; +} + +int replicate_construct(ifax_modp self,va_list args) +{ + replicate_private *priv; + + if (NULL==(priv=self->private=malloc(sizeof(replicate_private)))) + return 1; + self->destroy =replicate_destroy; + self->handle_input =replicate_handle; + self->command =replicate_command; + + priv->subnum=0; + + return 0; +} diff --git a/modules/scrambler17.c b/modules/scrambler17.c new file mode 100644 index 0000000..4abf3cf --- /dev/null +++ b/modules/scrambler17.c @@ -0,0 +1,111 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Helper for scrambler module. + + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +/* scrambler17.c + * + * Scramble/descramble a bitstream using a polynomial of + * + * 1 + x-18 + x-23 + * + * As defined by the V.17 modulation standard. + * + * (C) 1998 Morten Rolland + */ + +#include + +static unsigned char rotate_self[64] = { + 0x00,0xfa,0x0f,0xf5,0x1f,0xe5,0x10,0xea, + 0x3f,0xc5,0x30,0xca,0x20,0xda,0x2f,0xd5, + 0x7e,0x84,0x71,0x8b,0x61,0x9b,0x6e,0x94, + 0x41,0xbb,0x4e,0xb4,0x5e,0xa4,0x51,0xab, + 0xfd,0x07,0xf2,0x08,0xe2,0x18,0xed,0x17, + 0xc2,0x38,0xcd,0x37,0xdd,0x27,0xd2,0x28, + 0x83,0x79,0x8c,0x76,0x9c,0x66,0x93,0x69, + 0xbc,0x46,0xb3,0x49,0xa3,0x59,0xac,0x56 +}; + +static unsigned char rotate_byte[256] = { + 0x00,0xfd,0x7e,0x83,0x3f,0xc2,0x41,0xbc, + 0x1f,0xe2,0x61,0x9c,0x20,0xdd,0x5e,0xa3, + 0x0f,0xf2,0x71,0x8c,0x30,0xcd,0x4e,0xb3, + 0x10,0xed,0x6e,0x93,0x2f,0xd2,0x51,0xac, + 0x07,0xfa,0x79,0x84,0x38,0xc5,0x46,0xbb, + 0x18,0xe5,0x66,0x9b,0x27,0xda,0x59,0xa4, + 0x08,0xf5,0x76,0x8b,0x37,0xca,0x49,0xb4, + 0x17,0xea,0x69,0x94,0x28,0xd5,0x56,0xab, + 0x03,0xfe,0x7d,0x80,0x3c,0xc1,0x42,0xbf, + 0x1c,0xe1,0x62,0x9f,0x23,0xde,0x5d,0xa0, + 0x0c,0xf1,0x72,0x8f,0x33,0xce,0x4d,0xb0, + 0x13,0xee,0x6d,0x90,0x2c,0xd1,0x52,0xaf, + 0x04,0xf9,0x7a,0x87,0x3b,0xc6,0x45,0xb8, + 0x1b,0xe6,0x65,0x98,0x24,0xd9,0x5a,0xa7, + 0x0b,0xf6,0x75,0x88,0x34,0xc9,0x4a,0xb7, + 0x14,0xe9,0x6a,0x97,0x2b,0xd6,0x55,0xa8, + 0x01,0xfc,0x7f,0x82,0x3e,0xc3,0x40,0xbd, + 0x1e,0xe3,0x60,0x9d,0x21,0xdc,0x5f,0xa2, + 0x0e,0xf3,0x70,0x8d,0x31,0xcc,0x4f,0xb2, + 0x11,0xec,0x6f,0x92,0x2e,0xd3,0x50,0xad, + 0x06,0xfb,0x78,0x85,0x39,0xc4,0x47,0xba, + 0x19,0xe4,0x67,0x9a,0x26,0xdb,0x58,0xa5, + 0x09,0xf4,0x77,0x8a,0x36,0xcb,0x48,0xb5, + 0x16,0xeb,0x68,0x95,0x29,0xd4,0x57,0xaa, + 0x02,0xff,0x7c,0x81,0x3d,0xc0,0x43,0xbe, + 0x1d,0xe0,0x63,0x9e,0x22,0xdf,0x5c,0xa1, + 0x0d,0xf0,0x73,0x8e,0x32,0xcf,0x4c,0xb1, + 0x12,0xef,0x6c,0x91,0x2d,0xd0,0x53,0xae, + 0x05,0xf8,0x7b,0x86,0x3a,0xc7,0x44,0xb9, + 0x1a,0xe7,0x64,0x99,0x25,0xd8,0x5b,0xa6, + 0x0a,0xf7,0x74,0x89,0x35,0xc8,0x4b,0xb6, + 0x15,0xe8,0x6b,0x96,0x2a,0xd7,0x54,0xa9 +}; + + +/* scramble a series of bytes from source (s) to destination (d) buffer. + * The state is used and updated, and buffer size is in *bytes*. + * First bit to pass through the scrambling is bit 0 of s[0], and + * the last is bit 7 of s[size-1]. + * First bit to pop out of the scrambling is bit 0 of d[0] etc. + */ + +void scramble17(unsigned char *s, unsigned char *d, + unsigned int *state, int size) +{ + unsigned char next; + unsigned int st; + + st = *state; + while ( size-- ) { + next = rotate_self[st&0x3f] ^ + rotate_byte[*s] ^ + rotate_byte[bitrev((st>>16)&0xff)]; + st = (st<<8) | next; + *d = bitrev(next); + s++, d++; + } + *state = st; +} diff --git a/modules/send_to_audio.c b/modules/send_to_audio.c new file mode 100644 index 0000000..fcd1748 --- /dev/null +++ b/modules/send_to_audio.c @@ -0,0 +1,67 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Send the received data to a write()-compatible function. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include +#include + +typedef int (*auw)(int handle,void *ptr,size_t length); + +typedef struct { + + auw audio_write; + int handle; + +} send_to_audio_private; + +/* Free the private data + */ +void send_to_audio_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int send_to_audio_handle(ifax_modp self, void *data, size_t length) +{ + send_to_audio_private *priv=(send_to_audio_private *)self->private; + return priv->audio_write(priv->handle,data,length); +} + +int send_to_audio_construct(ifax_modp self,va_list args) +{ + send_to_audio_private *priv; + if (NULL==(priv=self->private=malloc(sizeof(send_to_audio_private)))) + return 1; + self->destroy =send_to_audio_destroy; + self->handle_input =send_to_audio_handle; + self->command =NULL; + + priv->audio_write=va_arg(args,auw); + priv->handle =va_arg(args,int); + return 0; +} diff --git a/modules/sinegen.c b/modules/sinegen.c new file mode 100644 index 0000000..bedeb95 --- /dev/null +++ b/modules/sinegen.c @@ -0,0 +1,86 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + Sine generator. Create an aLaw encoded sine pattern. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include +#include + +typedef struct { + + double step; + double currphase; + +} sinegen_private; + +void sinegen_destroy(ifax_modp self) +{ + free(self->private); + return; +} + +int sinegen_command(ifax_modp self,int cmd,va_list cmds) +{ + return 0; /* Not yet used. */ +} + +int sinegen_handle(ifax_modp self, void *data, size_t length) +{ + unsigned char *dat=data; + unsigned char out; + + int handled=0; + + sinegen_private *priv=(sinegen_private *)self->private; + + while(length--) { + + out=int2alaw(2147483647*(*dat/255)*sin(priv->currphase)); + priv->currphase+=priv->step; + + ifax_handle_input(self->sendto,&out,1); + handled++; + } + return handled; +} + +int sinegen_construct(ifax_modp self,va_list args) +{ + sinegen_private *priv; + int frequency; + + if (NULL==(priv=self->private=malloc(sizeof(sinegen_private)))) + return 1; + self->destroy =sinegen_destroy; + self->handle_input =sinegen_handle; + self->command =sinegen_command; + + frequency=va_arg(args,int); + priv->step=2.0*M_PI*(double)frequency/SAMPLES_PER_SECOND; + priv->currphase=0.0; + + return 0; +} diff --git a/test.c b/test.c new file mode 100644 index 0000000..34c7c9d --- /dev/null +++ b/test.c @@ -0,0 +1,130 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include +#include + +#include +#include +#include +#include + +#include + +int send_to_audio_construct(ifax_modp self,va_list args); +int pulsegen_construct(ifax_modp self,va_list args); +int sinegen_construct(ifax_modp self,va_list args); +int scrambler_construct(ifax_modp self, va_list args); +int modulator_V29_construct(ifax_modp self, va_list args); +int fskdemod_construct(ifax_modp self, va_list args); +int fskmod_construct(ifax_modp self, va_list args); +int decode_serial_construct(ifax_modp self, va_list args); +int encode_serial_construct(ifax_modp self, va_list args); +int debug_construct(ifax_modp self, va_list args); +#include + +ifax_module_id IFAX_TOAUDIO; +ifax_module_id IFAX_PULSEGEN; +ifax_module_id IFAX_SINEGEN; +ifax_module_id IFAX_REPLICATE; +ifax_module_id IFAX_SCRAMBLER; +ifax_module_id IFAX_MODULATORV29; +ifax_module_id IFAX_FSKDEMOD; +ifax_module_id IFAX_FSKMOD; +ifax_module_id IFAX_DECODE_SERIAL; +ifax_module_id IFAX_ENCODE_SERIAL; +ifax_module_id IFAX_DEBUG; + +void setup_all_modules(void) +{ + IFAX_TOAUDIO = ifax_register_module_class("Audio output",send_to_audio_construct); + IFAX_PULSEGEN = ifax_register_module_class("Square wave generator",pulsegen_construct); + IFAX_SINEGEN = ifax_register_module_class("Sine wave generator",sinegen_construct); + IFAX_REPLICATE = ifax_register_module_class("Replicator",replicate_construct); + IFAX_FSKDEMOD = ifax_register_module_class("FSK demodulator",fskdemod_construct); + IFAX_FSKMOD = ifax_register_module_class("FSK modulator",fskmod_construct); + IFAX_DECODE_SERIAL= ifax_register_module_class("Serializer",decode_serial_construct); + IFAX_ENCODE_SERIAL= ifax_register_module_class("Serial encoder",encode_serial_construct); + IFAX_SCRAMBLER = ifax_register_module_class("Bitstream scrambler",scrambler_construct); + IFAX_MODULATORV29 = ifax_register_module_class("V.29 Modulator 9600",modulator_V29_construct); + IFAX_DEBUG = ifax_register_module_class("Debugger",debug_construct); +} + +void transmit_carrier(void) +{ + ifax_modp toaudio,square,sine,replicate; + char data; + int cnt; + + /* Replicate the incoming signal. */ + replicate=ifax_create_module(IFAX_REPLICATE); + + /* Generate an square wave of 0.5s on, 3s off - CNG */ + square=ifax_create_module(IFAX_PULSEGEN, SAMPLES_PER_SECOND/2, + 3*SAMPLES_PER_SECOND); + + /* Generate 1100Hz */ + sine=ifax_create_module(IFAX_SINEGEN, 1100); + + /* Test - go to stdout */ + toaudio=ifax_create_module(IFAX_TOAUDIO, write, 1); + ifax_command(replicate,CMD_REPLICATE_ADD,square); + square->sendto=sine; + sine ->sendto=toaudio; + + /* Feed in dummy input data. */ + for(cnt=0;cnt<10*SAMPLES_PER_SECOND;cnt++) + ifax_handle_input(replicate,&data,1); + +} + +void test_modulator(void) +{ + ifax_modp scrambler, modulator; + unsigned char data; + + /* Test scrambler as a module */ + scrambler = ifax_create_module(IFAX_SCRAMBLER); + + /* Modulate into signed shorts */ + modulator = ifax_create_module(IFAX_MODULATORV29); + + scrambler->sendto = modulator; + + /* Count from 0 to 20 and see what the scrambler/modulator says */ + for ( data=0; data <= 20; data++ ) + ifax_handle_input(scrambler,&data,1); +} + + +void main(int argc,char **argv) +{ + setup_all_modules(); + + transmit_carrier(); +} diff --git a/v21_softmodem.c b/v21_softmodem.c new file mode 100644 index 0000000..69d6315 --- /dev/null +++ b/v21_softmodem.c @@ -0,0 +1,341 @@ +/* $Id$ +****************************************************************************** + + Fax program for ISDN. + V21 Softmodem implementation. + + Copyright (C) 1998 Andreas Beck [becka@ggi-project.org] + Copyright (C) 1998 Morten Rolland [Morten.Rolland@asker.mail.telia.com] + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +/* Prototypes for all the modules. We should probably move them to a big + * bunch of .h files. + */ +int send_to_audio_construct(ifax_modp self,va_list args); +int pulsegen_construct(ifax_modp self,va_list args); +int sinegen_construct(ifax_modp self,va_list args); +int scrambler_construct(ifax_modp self, va_list args); +int modulator_V29_construct(ifax_modp self, va_list args); +int fskdemod_construct(ifax_modp self, va_list args); +int fskmod_construct(ifax_modp self, va_list args); +int decode_serial_construct(ifax_modp self, va_list args); +int encode_serial_construct(ifax_modp self, va_list args); +int debug_construct(ifax_modp self, va_list args); +#include + +/* Module-IDs for all the modules. Needed for instantiating them. + */ +ifax_module_id IFAX_TOAUDIO; +ifax_module_id IFAX_REPLICATE; +ifax_module_id IFAX_FSKDEMOD; +ifax_module_id IFAX_FSKMOD; +ifax_module_id IFAX_DECODE_SERIAL; +ifax_module_id IFAX_ENCODE_SERIAL; +ifax_module_id IFAX_DEBUG; + +/* Register all needed modules. + */ +static void setup_all_modules(void) +{ + IFAX_TOAUDIO = ifax_register_module_class("Audio output",send_to_audio_construct); + IFAX_REPLICATE = ifax_register_module_class("Replicator",replicate_construct); + IFAX_FSKDEMOD = ifax_register_module_class("FSK demodulator",fskdemod_construct); + IFAX_FSKMOD = ifax_register_module_class("FSK modulator",fskmod_construct); + IFAX_DECODE_SERIAL= ifax_register_module_class("Serializer",decode_serial_construct); + IFAX_ENCODE_SERIAL= ifax_register_module_class("Serial encoder",encode_serial_construct); + IFAX_DEBUG = ifax_register_module_class("Debugger",debug_construct); +} + +/* Handles for the ISDN device, and the in- and output. + */ +static int isdnhandle=-1; +static int inputhandle=0; +static int outputhandle=1; + +/* The actual "modem" code. + */ +static void test_v21(void) +{ + /* module handles for all used modules. + */ + ifax_modp fskd,fskenc,toisdn,totty,deserial,enserial; + + /* helper for data in-/output + */ + char data; + + /* helper to avoid overflowing the send buffer. + */ + int wait; + + /* The lines below are commented out. They were once used + * for debugging. + */ +#if 0 + ifax_modp toaudio,debug,replicate; + + /* debugger */ + debug=ifax_create_module(IFAX_DEBUG,1); + + /* Replicate the incoming signal. */ + replicate=ifax_create_module(IFAX_REPLICATE); +// ifax_command(replicate,CMD_REPLICATE_ADD,toisdn); +#endif + + /* Output wave to ISDN + */ + toisdn=ifax_create_module(IFAX_TOAUDIO, IsdnSendAudio, isdnhandle); + + /* The FSK modulator. Its output is send to the ISDN line. + */ + fskenc=ifax_create_module(IFAX_FSKMOD,980,1180); + fskenc->sendto=toisdn; + + /* The serializer. Its output is sent to the FSK modulator. + * These three modules make up the sender. + */ + enserial=ifax_create_module(IFAX_ENCODE_SERIAL,300,"8N1"); + enserial->sendto=fskenc; + + /* Now for the receiver. When all is decoded, the text is sent + * to the outputhandle. + */ + totty=ifax_create_module(IFAX_TOAUDIO, write, outputhandle); + + /* The deserializer synchronizes on the startbits and decodes + * from the 0/1 stream from the demodulator to the bytes. + * Its output is sent to the totty module. Seee above. + */ + deserial=ifax_create_module(IFAX_DECODE_SERIAL,300,"8N1"); + deserial->sendto=totty; + + /* The FSK demodulator. Takes the aLaw input stream and sends the + * decoded version to the deserializer. See above. + */ + fskd=ifax_create_module(IFAX_FSKDEMOD,1650,1850,300); + fskd->sendto=deserial; + + /* The first two seconds are reserved to send a steady carrier. + * No output is made until the "wait" variable is down to zero. + */ + wait=2*SAMPLES_PER_SECOND; /* 2s steady carrier ! */ + + /* Run until explicitly terminated. + */ + while(1) { + /* helpers for select()ing on input. + */ + struct timeval tv={0,0}; + fd_set rfds; + + /* Count down wait. + */ + if (wait) wait--; + + /* Prepare for select()ing on input. If wait() is still + * active, don't ask for input. + */ + FD_ZERO(&rfds); + FD_SET(inputhandle,&rfds); + if (!wait && select(inputhandle+1,&rfds,NULL,NULL,&tv)>0) + { + /* Send the received data. + */ + ifax_handle_input(enserial,&data, + read(inputhandle,&data,1)); + + /* Wait for 11 bits (plus a little extra space). + * Avoid overflowing the send buffer. + * FIXME. We should rather check the return code. + */ + wait=11*SAMPLES_PER_SECOND/300+100; + } else + /* Send a dummy packet, to keep the sender going. + */ + ifax_handle_input(enserial,&data,0); + + /* Read data from isdn4linux. + */ + IsdnReadAudio(isdnhandle,&data,1); + + /* Send it to the demodulator. + */ + ifax_handle_input(fskd,&data,1); + } +} + +/* A function that more or less implements the "ATZ" function of a modem. + */ +void setup_isdn(char *sourcemsn) +{ + char cmdbuffer[128]; + + /* Set up the MSN. + */ + sprintf(cmdbuffer,"AT&E%s",sourcemsn); + IsdnCommand(isdnhandle,cmdbuffer,1,1); + + /* Go to VOICE mode. + */ + IsdnCommand(isdnhandle,"AT+FCLASS=8",1,1); + + /* Set the service identifier to "audio". + */ + IsdnCommand(isdnhandle,"ATS18=1",1,1); /* service == audio */ + + /* Set the data format to aLaw, and the device to "phone-line". + */ + IsdnCommand(isdnhandle,"AT+VSM=5+VLS=2",1,1); +} + +/* A function that more or less implements the "ATDxxx" function of a modem. + */ +void dial_isdn(char *number) +{ + char cmdbuffer[128]; + + /* Dial the given number. + */ + sprintf(cmdbuffer,"ATD%s",number); + IsdnCommand(isdnhandle,cmdbuffer,1,1); + + /* Set up the packet size. + */ + IsdnCommand(isdnhandle,"ATS16=48",1,1); /* Sendpacketsize/16 WHY ??? */ + + /* Start full duplex audio transmission. + */ + IsdnCommand(isdnhandle,"AT+VTX+VRX",1,0); +} + +/* A function that more or less implements the "ATA" function of a modem. + */ +void answer_isdn(void) +{ + /* Answer the pending call - hope there is one ... + */ + IsdnCommand(isdnhandle,"ATA",1,1); + + /* Set up the packet size. + */ + IsdnCommand(isdnhandle,"ATS16=48",1,1); /* Sendpacketsize/16 WHY ??? */ + + /* Start full duplex audio transmission. + */ + IsdnCommand(isdnhandle,"AT+VTX+VRX",1,0); +} + +/* Print out how to use this program. + */ +void usage(char *prgnam) +{ + printf("Usage: %s [-i isdndevice] -m MSN\n",prgnam); +} + +/* Main program. Get the arguments and set everything up. + * It _should_ then open a pty and emulate a modem there. + * This is not yet implemented. It just calls out and connects. + */ +void main(int argc,char **argv) +{ + /* Remember the character we get from getopts(). + */ + int optchr; + + /* Defaults for the options. We cannot guess an MSN, so this is + * an error, if it remains unset. + */ + char *isdndevname="/dev/ttyI1"; + char *numbertodial=NULL; + char *sourcemsn=NULL; + + /* Register all the modules. + */ + setup_all_modules(); + + /* Get all options from the commandline. + */ + while(EOF!=(optchr=getopt(argc,argv,"i:m:d:"))) + { + switch(optchr) + { + case 'i': + /* Device name for IsdnOpenDevice. + */ + isdndevname=optarg; + break; + case 'm': + /* The MSN to use as source-MSN. Or for + * incoming calls, the one to listen for. + */ + sourcemsn=optarg; + break; + case 'd': + /* The number to dial. + */ + numbertodial=optarg; + break; + } + } + + /* We cannot guess an MSN. + */ + if (!sourcemsn) { + usage(argv[0]); + exit(1); + } + + /* Open the ISDN device + */ + if (-1==(isdnhandle=IsdnOpenDevice(isdndevname))) + { + fprintf(stderr,"%s: cannot open isdn-device %s.\n",argv[0],isdndevname); + exit(1); + } + + /* Set it up. + */ + setup_isdn(sourcemsn); + + /* Call the remote station. + */ + dial_isdn(numbertodial); + + /* Go to transfer mode. + */ + test_v21(); + + /* Clean up and exit. + */ + close(isdnhandle); +}