iem_utils-0.0.20240903/0000700000000000000000000000000014665566711011202 5ustar00iem_utils-0.0.20240903/DEVELOPER.md0000600000000000000000000000147714665566711013064 0ustar00Developer information for iem_utils =================================== "iem_utils" is META-library that aggragates a number of small (dependency-free) libraries and GUI-plugins for Pd. All libraries are developped separately, and are included here by means of git-submodules. ## Checkout ~~~sh git clone https://git.iem.at/pd/iem_utils cd iem_utils git submodule update --init ~~~ ## Building There is a master Makefile that recursively builds all the libraries (that need building) ~~~sh make ~~~ ## Updating git-submodules are set to a specific commit (each) - rather than tracking a remote ("live") branch. The following brings all submodules up-to-date with their current 'master' branches. ~~~sh git submodule foreach git checkout master git submodule foreach git pull ~~~ ## Pushing changes in submodules TODO iem_utils-0.0.20240903/Makefile0000600000000000000000000000237314665566711012651 0ustar00subprojects = iem_adaptfilt iem_dp iem_roomsim iem_spec2 iem_tab punish all: $(subprojects) .PHONY: all archive release submodule update dummy .PHONY: $(subprojects) library=iem_utils version=0.0.$(shell date +%Y%m%d) archivefile=$(library)-v$(version).tgz IEM_CFLAGS=-DPD $(CPPFLAGS) -fPIC $(CFLAGS) IEM_LDFLAGS=-export-dynamic -fPIC -shared $(LDFLAGS) .PHONY: clean $(subprojects:%=%_clean) clean: $(subprojects:%=%_clean) -find . -name "*.o" -delete -find . -name "*.pd_*" -delete -find . -name "*.dll" -delete -find . -name "*.so" -delete -find . -name "*.tgz" -delete $(subprojects:%=%_clean): make -C $(@:%_clean=%) clean dummy: @echo -n archive: $(archivefile) release: $(archivefile) git tag -m "released iem_utils $(version)" "v$(version)" submodule: .gitmodules git submodule init git submodule update update: git submodule foreach git checkout master git submodule foreach git pull %.tgz: dummy -rm -f $@ tar --transform "s|^|$(@:.tgz=)/|" --exclude-vcs --exclude='.*' --exclude='*.tgz' --exclude $@ -czf $@ * iem_adaptfilt iem_dp iem_roomsim iem_spec2 iem_tab punish: $(MAKE) -C $@ \ $(empty) .PHONY: install $(subprojects:%=%_install) install: $(subprojects:%=%_install) $(subprojects:%=%_install): make -C $(@:%_install=%) install iem_utils-0.0.20240903/README.md0000600000000000000000000000257614665566711012475 0ustar00iem - collection of utility libraries for Pure Data (Pd) ======================================================== This is a collection of (unrelated) external libraries for Pd, developed at the Institute of Electronic Music and Acoustics (iem) at the University of Music and Performing Arts Graz, Austria. # LICENSE Each library comes with their own license, but all are released under an open source license (GPL2+, BSD-3). # CONTENTS ## Pd libraries ### iem_adaptfilt adaptive filtering https://git.iem.at/pd/iem_adaptfilt ### iem_dp double precision https://git.iem.at/pd/iem_dp ### iem_roomsim room simulation https://git.iem.at/pd/iem_roomsim ### iem_spec2 optimized objects for spectral processing https://git.iem.at/pd/iem_spec2 ### iem_tab table maths https://git.iem.at/pd/iem_tab ## Pd GUI plugins ### kiosk-plugin run Pure Data in kiosk mode https://git.iem.at/pd-gui/kiosk-plugin ### patch2svg-plugin save patches as SVG https://git.iem.at/pd-gui/patch2svg-plugin ### tclprompt-plugin pd-gui plugin that (re)adds a wee tcl-prompt to the Pd-console https://git.iem.at/pd-gui/tclprompt-plugin ### punish/triggerize-plugin pd-gui plugin that helps avoiding fan-outs by inserting [trigger] as appropriate. https://git.iem.at/pd-gui/punish ### punish/patcherize-plugin pd-gui plugin that helps refactoring code into abstraction/subpatches. https://git.iem.at/pd-gui/punish iem_utils-0.0.20240903/iem16/0000700000000000000000000000000014665566711012123 5ustar00iem_utils-0.0.20240903/iem16/GnuGPL.LICENSE0000600000000000000000000003574514665566711014243 0ustar00GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS iem_utils-0.0.20240903/iem16/Makefile0000600000000000000000000000213714665566711013570 0ustar00#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) lib.name = iem16 # special file that does not provide a class lib.setup.sources = iem16.c # helper library shared.sources = \ iem16_delay.c \ iem16_table.c \ $(empty) # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(filter-out $(lib.setup.sources) $(shared.sources),$(wildcard *.c)) datafiles = \ $(wildcard *-help.pd) \ GnuGPL.LICENSE datadirs = examples ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, or else from externals # root directory in pd-extended configuration. PDLIBBUILDER_DIR=pd-lib-builder include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder ../Makefile.pdlibbuilder)) iem_utils-0.0.20240903/iem16/build/0000700000000000000000000000000014665566711013222 5ustar00iem_utils-0.0.20240903/iem16/build/win-vs2003/0000700000000000000000000000000014665566711014752 5ustar00iem_utils-0.0.20240903/iem16/build/win-vs2003/iem16.sln0000600000000000000000000000134414665566711016415 0ustar00Microsoft Visual Studio Solution File, Format Version 8.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem16", "iem16.vcproj", "{C8DAED0C-AB39-4D01-976B-7E4E9E0E10DD}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject Global GlobalSection(SolutionConfiguration) = preSolution Release = Release EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {C8DAED0C-AB39-4D01-976B-7E4E9E0E10DD}.Release.ActiveCfg = Release|Win32 {C8DAED0C-AB39-4D01-976B-7E4E9E0E10DD}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem16/build/win-vs2003/iem16.vcproj0000600000000000000000000000737314665566711017134 0ustar00 iem_utils-0.0.20240903/iem16/build/win-vs6/0000700000000000000000000000000014665566711014533 5ustar00iem_utils-0.0.20240903/iem16/build/win-vs6/iem16.dsp0000600000000000000000000000571214665566711016173 0ustar00# Microsoft Developer Studio Project File - Name="iem16" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=IEM16 - WIN32 RELEASE !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem16.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem16.mak" CFG="IEM16 - WIN32 RELEASE" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem16 - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 1 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "" # PROP Intermediate_Dir "obj\" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "IEM16_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /I "..\..\pd\src" /D "WIN32" /D "NT" /D "_WINDOWS" /D "IEM16" /FR /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /win32 # SUBTRACT MTL /mktyplib203 # ADD BASE RSC /l 0xc07 /d "NDEBUG" # ADD RSC /l 0xc07 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib wsock32.lib uuid.lib libc.lib oldnames.lib pd.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\iem16.dll" /libpath:"../../pd/bin" /export:iem16_setup # SUBTRACT LINK32 /pdb:none # Begin Target # Name "iem16 - Win32 Release" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\iem16.c # End Source File # Begin Source File SOURCE=.\iem16_array.c # End Source File # Begin Source File SOURCE=.\iem16_array_tilde.c # End Source File # Begin Source File SOURCE=.\iem16_delay.c # End Source File # Begin Source File SOURCE=.\iem16_table.c # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\iem16.h # End Source File # Begin Source File SOURCE=.\iem16_table.h # End Source File # Begin Source File SOURCE=..\..\pd\src\m_pd.h # End Source File # End Group # End Target # End Project iem_utils-0.0.20240903/iem16/build/win-vs6/iem16.dsw0000600000000000000000000000106114665566711016173 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem16"=.\iem16.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem16/del16read~-help.pd0000600000000000000000000000267514665566711015357 0ustar00#N canvas 24 20 800 531 12; #X text 372 274 1st argument: name of delay line; #X floatatom 116 253 0 0 0 0 - - -; #X text 151 255 float input (delay time in ms); #X text 127 310 signal output (delayed signal); #X floatatom 383 177 0 0 0 0 - - -; #X obj 116 375 snapshot~; #X floatatom 116 399 0 0 0 0 - - -; #X obj 24 246 loadbang; #X obj 24 313 metro 200; #X msg 32 273 \; pd dsp 1; #X text 424 176 input to delay line; #X obj 383 201 sig~; #X text 372 290 2nd argument: (initial) delay time in ms; #X text 36 443 see also:; #X obj 383 226 del16write~ del_example 1000; #X obj 24 16 del16read~; #X obj 126 444 del16write~; #X obj 239 444 vd16~; #X text 133 14 - read a 16bit signal from a 16bit-delay line; #X obj 368 52 delread~; #X text 21 52 This is very similar to the pd-object; #X text 49 82 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 120 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X text 38 490 similar pd-objects:; #X obj 223 489 delread~; #X obj 307 489 delwrite~; #X obj 400 489 vd~; #X text 433 443 updated for iem16 version1.0; #X obj 116 286 del16read~ del_example 1000; #X connect 1 0 28 0; #X connect 4 0 11 0; #X connect 5 0 6 0; #X connect 7 0 8 0; #X connect 7 0 9 0; #X connect 8 0 5 0; #X connect 11 0 14 0; #X connect 28 0 5 0; iem_utils-0.0.20240903/iem16/del16read~.c0000600000000000000000000000640014665566711014236 0ustar00/* copyleft (c) 2003 forum::fÃŒr::umlÀute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* del16read~, del16write~, vd16~ */ #include "iem16_delay.h" /* ----------------------------- del16read~ ----------------------------- */ static t_class *sigdel16read_class; typedef struct _sigdel16read{ t_object x_obj; t_symbol *x_sym; t_float x_deltime; /* delay in msec */ int x_delsamps; /* delay in samples */ t_float x_sr; /* samples per msec */ t_float x_n; /* vector size */ int x_zerodel; /* 0 or vecsize depending on read/write order */ } t_sigdel16read; static void sigdel16read_16bit(t_sigdel16read *x, t_float f); static void *sigdel16read_new(t_symbol *s, t_floatarg f){ t_sigdel16read *x = (t_sigdel16read *)pd_new(sigdel16read_class); x->x_sym = s; x->x_sr = sys_getsr(); x->x_n = sys_getblksize(); x->x_zerodel = 0; sigdel16read_16bit(x, f); outlet_new(&x->x_obj, gensym("signal")); return (x); } static void sigdel16read_16bit(t_sigdel16read *x, t_float f){ t_sigdel16write *delwriter = (t_sigdel16write *)pd_findbyclass(x->x_sym, sigdel16write_class); x->x_deltime = f; if (!delwriter) return; x->x_delsamps = (int)(0.5 + x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if (x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if (x->x_delsamps > delwriter->x_cspace.c_n - x->x_n) x->x_delsamps = delwriter->x_cspace.c_n - x->x_n; } static t_int *sigdel16read_perform(t_int *w){ t_float *out = (t_float *)(w[1]); t_del16writectl *c = (t_del16writectl *)(w[2]); int delsamps = *(int *)(w[3]); int n = (int)(w[4]); int phase = c->c_phase - delsamps, nsamps = c->c_n; t_iem16_16bit *vp = c->c_vec, *bp, *ep = vp + (c->c_n + XTRASAMPS); if (phase < 0) phase += nsamps; bp = vp + phase; while (n--) { *out++ = *bp++*IEM16_SCALE_DOWN; if (bp == ep) bp -= nsamps; } return (w+5); } static void sigdel16read_dsp(t_sigdel16read *x, t_signal **sp){ t_sigdel16write *delwriter = (t_sigdel16write *)pd_findbyclass(x->x_sym, sigdel16write_class); x->x_sr = sp[0]->s_sr * 0.001; x->x_n = sp[0]->s_n; if (delwriter) { sigdel16write_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); sigdel16read_16bit(x, x->x_deltime); dsp_add(sigdel16read_perform, 4, sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps, sp[0]->s_n); } else if (*x->x_sym->s_name) pd_error(x, "delread~: %s: no such del16write~",x->x_sym->s_name); } static void sigdel16read_setup(void){ sigdel16read_class = class_new(gensym("del16read~"), (t_newmethod)sigdel16read_new, 0, sizeof(t_sigdel16read), 0, A_DEFSYM, A_DEFFLOAT, 0); class_addmethod(sigdel16read_class, (t_method)sigdel16read_dsp, gensym("dsp"), A_CANT, 0); class_addfloat(sigdel16read_class, (t_method)sigdel16read_16bit); } // G.Holzmann: for PD-extended build system void del16read_tilde_setup(void) { sigdel16read_setup(); } iem_utils-0.0.20240903/iem16/del16write~-help.pd0000600000000000000000000000174214665566711015570 0ustar00#N canvas 83 192 678 431 12; #X text 88 202 signal input; #X text 136 16 writes a signal in a delay line; #X text 281 235 1st argument: name of delay line; #X obj 24 203 sig~ 0; #X text 304 265 (= max. delay time); #X text 281 251 2nd argument: length of delay line in msec; #X text 24 292 see also:; #X obj 24 16 del16write~; #X obj 112 294 del16read~; #X obj 209 294 vd16~; #X text 16 353 similar pd-objects:; #X obj 201 352 delread~; #X obj 285 352 delwrite~; #X obj 378 352 vd~; #X obj 24 237 del16write~ del_line_xxx 500; #X text 21 51 This is very similar to the pd-object; #X text 49 81 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 119 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 368 51 delwrite~; #X text 411 306 updated for iem16 version1.0; #X connect 3 0 14 0; iem_utils-0.0.20240903/iem16/del16write~.c0000600000000000000000000000512114665566711014454 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* del16read~, del16write~, vd16~ */ #include "iem16_delay.h" /* ----------------------------- del16write~ ----------------------------- */ static void *sigdel16write_new(t_symbol *s, t_floatarg msec){ int nsamps; t_sigdel16write *x = (t_sigdel16write *)pd_new(sigdel16write_class); if (!*s->s_name) s = gensym("del16write~"); pd_bind(&x->x_obj.ob_pd, s); x->x_sym = s; nsamps = ((float)(0.001f) * msec) * sys_getsr(); if (nsamps < sys_getblksize()) nsamps = sys_getblksize(); nsamps += ((- nsamps) & (SAMPBLK - 1)); nsamps += sys_getblksize(); x->x_cspace.c_n = nsamps; x->x_cspace.c_vec = (t_iem16_16bit *)getbytes((nsamps + XTRASAMPS) * sizeof(t_iem16_16bit)); x->x_cspace.c_phase = XTRASAMPS; x->x_sortno = 0; x->x_vecsize = 0; x->x_f = 0; return (x); } static t_int *sigdel16write_perform(t_int *w){ t_float *in = (t_float *)(w[1]); t_del16writectl *c = (t_del16writectl *)(w[2]); int n = (int)(w[3]); int phase = c->c_phase, nsamps = c->c_n; t_iem16_16bit *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS); phase += n; while (n--) { *bp++ = (*in++*IEM16_SCALE_UP); if (bp == ep) { vp[0] = ep[-4]; vp[1] = ep[-3]; vp[2] = ep[-2]; vp[3] = ep[-1]; bp = vp + XTRASAMPS; phase -= nsamps; } } c->c_phase = phase; return (w+4); } static void sigdel16write_dsp(t_sigdel16write *x, t_signal **sp){ dsp_add(sigdel16write_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n); x->x_sortno = ugen_getsortno(); sigdel16write_checkvecsize(x, sp[0]->s_n); } static void sigdel16write_free(t_sigdel16write *x){ pd_unbind(&x->x_obj.ob_pd, x->x_sym); freebytes(x->x_cspace.c_vec, (x->x_cspace.c_n + XTRASAMPS) * sizeof(t_iem16_16bit)); } static void sigdel16write_setup(void){ sigdel16write_class = class_new(gensym("del16write~"), (t_newmethod)sigdel16write_new, (t_method)sigdel16write_free, sizeof(t_sigdel16write), 0, A_DEFSYM, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(sigdel16write_class, t_sigdel16write, x_f); class_addmethod(sigdel16write_class, (t_method)sigdel16write_dsp, gensym("dsp"), A_CANT, 0); } // G.Holzmann: for PD-extended build system void del16write_tilde_setup(void) { sigdel16write_setup(); } iem_utils-0.0.20240903/iem16/examples/0000700000000000000000000000000014665566711013741 5ustar00iem_utils-0.0.20240903/iem16/examples/del16read~.pd0000600000000000000000000000267514665566711016247 0ustar00#N canvas 24 20 800 531 12; #X text 372 274 1st argument: name of delay line; #X floatatom 116 253 0 0 0 0 - - -; #X text 151 255 float input (delay time in ms); #X text 127 310 signal output (delayed signal); #X floatatom 383 177 0 0 0 0 - - -; #X obj 116 375 snapshot~; #X floatatom 116 399 0 0 0 0 - - -; #X obj 24 246 loadbang; #X obj 24 313 metro 200; #X msg 32 273 \; pd dsp 1; #X text 424 176 input to delay line; #X obj 383 201 sig~; #X text 372 290 2nd argument: (initial) delay time in ms; #X text 36 443 see also:; #X obj 116 286 del16read~ del_example 1000; #X obj 383 226 del16write~ del_example 1000; #X obj 24 16 del16read~; #X obj 126 444 del16write~; #X obj 239 444 vd16~; #X text 133 14 - read a 16bit signal from a 16bit-delay line; #X obj 368 52 delread~; #X text 21 52 This is very similar to the pd-object; #X text 49 82 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 120 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X text 38 490 similar pd-objects:; #X obj 223 489 delread~; #X obj 307 489 delwrite~; #X obj 400 489 vd~; #X text 433 443 updated for iem16 version1.0; #X connect 1 0 14 0; #X connect 4 0 11 0; #X connect 5 0 6 0; #X connect 7 0 8 0; #X connect 7 0 9 0; #X connect 8 0 5 0; #X connect 11 0 15 0; #X connect 14 0 5 0; iem_utils-0.0.20240903/iem16/examples/del16write~.pd0000600000000000000000000000174214665566711016460 0ustar00#N canvas 83 192 678 431 12; #X text 88 202 signal input; #X text 136 16 writes a signal in a delay line; #X text 281 235 1st argument: name of delay line; #X obj 24 203 sig~ 0; #X text 304 265 (= max. delay time); #X text 281 251 2nd argument: length of delay line in msec; #X text 24 292 see also:; #X obj 24 16 del16write~; #X obj 112 294 delread16~; #X obj 209 294 vd16~; #X text 16 353 similar pd-objects:; #X obj 201 352 delread~; #X obj 285 352 delwrite~; #X obj 378 352 vd~; #X obj 24 237 del16write~ del_line_xxx 500; #X text 21 51 This is very similar to the pd-object; #X text 49 81 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 50 119 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 368 51 delwrite~; #X text 411 306 updated for iem16 version1.0; #X connect 3 0 14 0; iem_utils-0.0.20240903/iem16/examples/tab16play~.pd0000600000000000000000000000333014665566711016270 0ustar00#N canvas 159 54 804 495 10; #X msg 639 93 \; pd dsp 0; #X floatatom 11 342 0 0 0 0 - - -; #X msg 11 109 set array99; #X text 93 109 "set" message permits you to switch between arrays; #X text 138 228 creation argument initializes array name; #X obj 11 316 env~ 16384; #X obj 87 360 dac~ 1; #X obj 87 323 *~; #X obj 100 304 line~; #X msg 100 263 0.1 100; #X msg 116 284 0 100; #X text 162 264 on; #X text 157 283 off; #X text 148 301 envelope; #X text 148 312 generator; #X text 101 248 amplitude controls:; #X text 131 362 audio output; #X obj 87 342 hip~ 5; #X msg 26 179 0 44100; #X msg 27 158 44100; #X msg 26 138 bang; #X text 80 136 "bang" or 0 plays whole sample; #X text 82 157 play starting at 44100th sample; #X text 93 177 play starting at beginning for 44100 samples; #X msg 25 199 44100 1000; #X text 103 198 play from 44100 through 45099 (1000 samples); #X obj 11 228 tab16play~ array99; #X obj 589 205 table16 array99; #X text 389 444 updated for iem16 version1.0; #X obj 5 439 tab16write~; #X obj 5 458 tab16read4~; #X obj 89 458 tab16read; #X obj 89 439 tab16write; #X obj 166 439 tab16send~; #X obj 166 458 tab16receive~; #X obj 32 13 tab16play~; #X text 29 43 The [tab16play~] object is the same as the [tabplay~] object \, but it refers to 16bit-arrays stored in [table16] instead of floating-point arrays (stored in normal pd-tables/arrays); #X obj 328 444 table16; #X text 11 417 see also:; #X text 108 14 play a 16bit-table as a sample (non-transposing); #X connect 2 0 26 0; #X connect 5 0 1 0; #X connect 7 0 17 0; #X connect 8 0 7 1; #X connect 9 0 8 0; #X connect 10 0 8 0; #X connect 17 0 6 0; #X connect 18 0 26 0; #X connect 19 0 26 0; #X connect 20 0 26 0; #X connect 24 0 26 0; #X connect 26 0 5 0; #X connect 26 0 7 0; iem_utils-0.0.20240903/iem16/examples/tab16read.pd0000600000000000000000000000154214665566711016043 0ustar00#N canvas 245 143 703 316 12; #X text 62 102 index; #X floatatom 25 103 0 0 0 0 - - -; #X floatatom 25 199 0 0 0 0 - - -; #X text 70 197 output = array99[index]; #X text 189 157 creation argument; #X text 185 175 gives array name; #X msg 35 125 set array99; #X text 147 125 change array name; #X obj 25 165 tab16read array99; #X obj 422 131 table16 array99; #X obj 17 13 tab16read; #X text 412 257 updated for iem16 version1.0; #X obj 16 252 tab16write~; #X obj 16 271 tab16read4~; #X obj 120 271 tab16read; #X obj 120 252 tab16write; #X obj 217 252 tab16send~; #X obj 217 271 tab16receive~; #X obj 339 257 table16; #X text 108 15 - read numbers from a 16bit-table; #X text 21 42 since [table16] can only hold 16bit values \, the output of [tab16read] is limited to integer-values between -32768..+32767 ; #X connect 1 0 8 0; #X connect 6 0 8 0; #X connect 8 0 2 0; iem_utils-0.0.20240903/iem16/examples/tab16read4~.pd0000600000000000000000000000253614665566711016331 0ustar00#N canvas 59 33 741 466 10; #X text 21 207 signal input x(n); #X text 127 21 4-point-interpolating table lookup; #X obj 11 316 snapshot~; #X obj 30 290 metro 200; #X obj 11 124 sig~; #X floatatom 11 98 0 0 0 0 - - -; #X obj 30 264 r readout; #X floatatom 11 342 0 0 0 0 - - -; #X text 49 94 incoming signal is index. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful. You can shift-drag the number box to see the effect of interpolation.; #X msg 34 158 set array99; #X text 116 158 "set" message permits you to switch between arrays ; #X text 149 228 creation argument initializes array name; #X obj 10 228 tab16read4~ array99; #X obj 460 301 table16 array99; #X text 395 400 updated for iem16 version1.0; #X obj 11 395 tab16write~; #X obj 11 414 tab16read4~; #X obj 95 414 tab16read; #X obj 95 395 tab16write; #X obj 172 395 tab16send~; #X obj 172 414 tab16receive~; #X obj 334 400 table16; #X obj 47 21 tab16read4~; #X text 7 51 tab16read4~ is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial. ; #X text 185 266 since [table16] can only hold 16bit-values \, the stored integer values -32768..+32767 are converted to floats -1.0..+1.0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 12 0; #X connect 5 0 4 0; #X connect 6 0 3 0; #X connect 9 0 12 0; #X connect 12 0 2 0; iem_utils-0.0.20240903/iem16/examples/tab16receive~.pd0000600000000000000000000000114414665566711016746 0ustar00#N canvas 109 83 646 239 12; #X text 17 53 creation argument: name of array; #X text 16 83 By default a block is 64 samples \; this can be reset using the block~ object.; #X obj 21 18 tab16receive~; #X text 376 199 updated for iem16 version1.0; #X obj 5 176 tab16write~; #X obj 5 195 tab16read4~; #X obj 109 195 tab16read; #X obj 109 176 tab16write; #X obj 204 176 tab16send~; #X obj 204 195 tab16receive~; #X obj 328 181 table16; #X text 17 155 see also:; #X text 129 18 - read a block of a 16bit-signal from an array continuously ; #X text 10 129 16bit-signals are limited to 65536 values between -1.0..+1.0 ; iem_utils-0.0.20240903/iem16/examples/tab16send~.pd0000600000000000000000000000126214665566711016256 0ustar00#N canvas 151 91 705 277 12; #X text 113 26 writes one block of a signal continuously to an array ; #X text 41 60 creation argument: name of array; #X text 29 96 By default a block is 64 samples \; this can be reset using the block~ object.; #X text 376 239 updated for iem16 version1.0; #X obj 5 216 tab16write~; #X obj 5 235 tab16read4~; #X obj 109 235 tab16read; #X obj 109 216 tab16write; #X obj 204 216 tab16send~; #X obj 204 235 tab16receive~; #X obj 328 221 table16; #X text 17 195 see also:; #X text 14 137 16bit-signals are limited to 65536 values between -1.0..+1.0 ; #X text 16 157 if your signal has absolute values >1.0 \, these are wrapped around...; #X obj 11 27 tab16send~; iem_utils-0.0.20240903/iem16/examples/tab16write.pd0000600000000000000000000000162414665566711016263 0ustar00#N canvas 44 17 653 456 12; #X floatatom 39 96 0 0 0 0 - - -; #X floatatom 176 170 0 0 0 0 - - -; #X text 208 192 creation argument; #X text 210 210 is array name; #X text 76 87 set y value; #X text 74 152 right inlet selects x value; #X msg 55 117 set array99; #X text 163 116 change array name; #X obj 39 195 tab16write array99; #X obj 31 27 tab16write; #X text 388 378 updated for iem16 version1.0; #X obj 17 355 tab16write~; #X obj 17 374 tab16read4~; #X obj 121 374 tab16read; #X obj 121 355 tab16write; #X obj 216 355 tab16send~; #X obj 216 374 tab16receive~; #X obj 340 360 table16; #X text 29 334 see also:; #X obj 438 156 table16 array99; #X text 133 28 write numbers to a 16bit-table; #X text 20 256 since [table16] can only hold 16bit-values \, the stored numbers have to be integer (ok \, we take care of this!) values between -32768..+32767.; #X connect 0 0 8 0; #X connect 1 0 8 1; #X connect 6 0 8 0; iem_utils-0.0.20240903/iem16/examples/tab16write~.pd0000600000000000000000000000200114665566711016447 0ustar00#N canvas 119 134 697 433 10; #X msg 43 131 bang; #X obj 23 82 sig~ 3000; #X obj 23 110 phasor~; #X text 158 213 creation argument initializes array name; #X msg 40 181 set array99; #X msg 445 35 \; pd dsp 1; #X msg 524 37 \; pd dsp 0; #X text 85 133 bang to start recording; #X text 126 180 set the destination array; #X msg 43 153 stop; #X text 85 154 stop recording; #X text 385 366 updated for iem16 version1.0; #X obj 14 343 tab16write~; #X obj 14 362 tab16read4~; #X obj 118 362 tab16read; #X obj 118 343 tab16write; #X obj 213 343 tab16send~; #X obj 213 362 tab16receive~; #X obj 337 348 table16; #X text 26 322 see also:; #X obj 22 211 tab16write~ array99; #X obj 492 160 table16 array99; #X obj 31 27 tab16write~; #X text 120 27 object to write a 16bit-signal in an array; #X text 261 261 since [table16] can only hold 16bit-values \, the incoming signal (-1.0..+1.0) is stored as integer values -32768..+32767; #X connect 0 0 20 0; #X connect 1 0 2 0; #X connect 2 0 20 0; #X connect 4 0 20 0; #X connect 9 0 20 0; iem_utils-0.0.20240903/iem16/examples/table16.pd0000600000000000000000000000465514665566711015540 0ustar00#N canvas 37 0 856 640 10; #X obj 30 21 table16; #X text 97 22 16bit-table; #X text 32 51 [table16] stores 16bit values. The normal pd-tables ([table] \, array) store the values as floating-points. While floating points are (often) more precise (this is of course not really true... \, esp. when comparing integer(4byte) to floating-point.) they use a lot of memory (4byte).; #X text 32 121 [table16] uses only 16bit (2bytes) to store the values \, which is half of the memory.; #X text 32 155 However there are 2 major drawbacks; #X text 53 172 a) less precision means less SNR - you can only store 65536 different values \, but this is what CD-quality is (should be good enough for most musical applications); #X text 55 221 b) the 65536 values (-32678..+32767) are mapped to -1.0..+1.0! This means you cannot store signals that exceed this magical limit. Please make sure \, that the signal has correct values (use [clip~]) or the unclipped values will get wrapped!; #X text 20 323 There are several objects to access the data of [table16]: ; #X obj 55 344 tab16write~; #X obj 55 363 tab16read4~; #X obj 279 363 tab16read; #X obj 279 344 tab16write; #X obj 164 344 tab16send~; #X obj 164 363 tab16receive~; #X obj 55 382 tab16read~; #X text 19 410 The message-objects [tab16read]/[tab16write] store the values directly (-32767..+32768) \, while the signal-objects convert the floats -1.0..+1.0 to the correct values or vice-versa.; #X text 270 21 updated for iem16 version1.0; #X msg 496 53 resize 100; #X obj 496 308 table16 array16 99; #N canvas 0 0 450 300 graph6 0; #X array array100 10 float 1; #A 0 1 2 3 4 5 6 7 8 9 0; #X coords 0 10 9 0 200 140 1; #X restore 477 452 graph; #X msg 478 409 \; array100 0 1 2 3 4 5 6 7 8 9; #X text 481 389 click to init float-array; #X msg 502 114 from array100; #X text 21 497 There is no beautiful graphical representation as with pd's arrays.; #X msg 508 139 from array100 resize; #X msg 516 190 from array100 20 30; #X msg 517 213 from array100 20 30 resize; #X msg 527 259 from array100 20 30 95; #X msg 527 279 from array100 20 30 95 resize; #X text 502 95 copy the data from a float-array; #X text 603 117 and resize the 16bit-array; #X text 513 173 copy floats (index20..30); #X text 653 192 and resize to 30-20; #X text 526 241 copy indexed values and insert at index95; #X connect 17 0 18 0; #X connect 22 0 18 0; #X connect 24 0 18 0; #X connect 25 0 18 0; #X connect 26 0 18 0; #X connect 27 0 18 0; #X connect 28 0 18 0; iem_utils-0.0.20240903/iem16/examples/vd16~.pd0000600000000000000000000000240514665566711015247 0ustar00#N canvas 88 40 717 480 12; #X floatatom 50 254 0 0 0 0 - - -; #X obj 50 347 outlet~; #X text 130 346 signal output (delayed signal); #X obj 50 282 sig~; #X text 99 279 signal input (delay time in ms); #X text 218 310 creation argument: name of delay line; #X text 35 400 see also:; #X obj 24 16 vd16~; #X text 77 10 reads a signal from a 16bit delay line at a variable delay time (4-point-interpolation); #X text 31 51 vd16~ implements a 4-point interpolating delay tap from a corresponding delwrite~ object. The delay in milliseconds of the tap is specified by the incoming signal.; #X obj 50 314 vd16~ del_example; #X text 16 433 similar pd-objects:; #X obj 201 432 delread~; #X obj 285 432 delwrite~; #X obj 378 432 vd~; #X obj 123 403 del16write~; #X obj 242 403 del16read~; #X text 411 386 updated for iem16 version1.0; #X text 28 116 This is very similar to the pd-object; #X text 56 137 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 57 175 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 375 112 vd~; #X connect 0 0 3 0; #X connect 3 0 10 0; #X connect 10 0 1 0; iem_utils-0.0.20240903/iem16/iem16.c0000600000000000000000000000357514665566711013224 0ustar00/* ...this is a very IEM16 external ... it allows for 16bit-constructs where float would eat too much memory forum::für::umläute@IEM:2003 */ #include "iem16.h" /* do a little help thing */ typedef struct iem16 { t_object x_obj; } t_iem16; static t_class *iem16_class; static void *iem16_new(void){ t_iem16 *x = (t_iem16 *)pd_new(iem16_class); post("iem16: 16bit objects for low memory usage"); return(x); } /* include some externals */ void del16read_tilde_setup(); void del16write_tilde_setup(); void tab16play_tilde_setup(); void tab16read4_setup(); void tab16read4_tilde_setup(); void tab16read_setup(); void tab16read_tilde_setup(); void tab16receive_tilde_setup(); void tab16send_tilde_setup(); void tab16write_setup(); void tab16write_tilde_setup(); void table16_setup(); void vd16_tilde_setup(); void iem16_setup(void) { static unsigned int setupcount=0; if(setupcount>0) { post("iem16:\tsetup called several times, skipping..."); return; } setupcount++; del16read_tilde_setup(); del16write_tilde_setup(); tab16play_tilde_setup(); tab16read4_setup(); tab16read4_tilde_setup(); tab16read_setup(); tab16read_tilde_setup(); tab16receive_tilde_setup(); tab16send_tilde_setup(); tab16write_setup(); tab16write_tilde_setup(); table16_setup(); vd16_tilde_setup(); /* ************************************** */ post("iem16:\t16bit-objects for low memory usage"); post("iem16:\t(l) forum::für::umläute\t\tIOhannes m zmölnig"); post("iem16:\tInstitute of Electronic Music and Acoustics, Graz - iem"); post("iem16:\tcompiled: "__DATE__); iem16_class = class_new(gensym("iem16"), iem16_new, 0, sizeof(t_iem16), CLASS_NOINLET, 0); class_addcreator((t_newmethod)iem16_new, gensym("IEM16"), 0); } void IEM16_setup(void){ iem16_setup(); } iem_utils-0.0.20240903/iem16/iem16.h0000600000000000000000000000620314665566711013220 0ustar00/* ********************************************** */ /* the IEM16 external */ /* ********************************************** */ /* forum::für::umläute */ /* ********************************************** */ /* the IEM16 external is a runtime-library for miller s. puckette's realtime-computermusic-software "pure data" * therefore you NEED "pure data" to make any use of the IEM16 external * (except if you want to use the code for other things) * download "pure data" at https://puredata.info * if you are looking for the latest release of the IEM16-external you should have another look at https://git.iem.at/pd/iem16 * * IEM16 is published under the GNU GeneralPublicLicense, that must be shipped with IEM16. * if you are using Debian GNU/linux, the GNU-GPL can be found under /usr/share/common-licenses/GPL * if you still haven't found a copy of the GNU-GPL, have a look at http://www.gnu.org * * "pure data" has it's own license, that comes shipped with "pure data". * * there are ABSOLUTELY NO WARRANTIES for anything */ #ifndef INCLUDE_IEM16_H__ #define INCLUDE_IEM16_H__ #include "m_pd.h" typedef short t_iem16_16bit; #define IEM16_SCALE_UP (32767) #define IEM16_SCALE_DOWN (1./32767) #define VERSION "1.2.1" #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ /* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef __irix__ /* big-endian. Most significant byte is at low address in memory */ # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # define int32 long /* a data type that has 32 bits */ #elif defined __WIN32__ /* little-endian; most significant byte is at highest address */ # define HIOFFSET 1 # define LOWOFFSET 0 # define int32 long #elif defined __FreeBSD__ # include # if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 # else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # endif /* BYTE_ORDER */ # include # define int32 int32_t #elif defined __linux__ # include # if !defined(__BYTE_ORDER) || !defined(__LITTLE_ENDIAN) # error No byte order defined # endif # if __BYTE_ORDER == __LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 # else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # endif /* __BYTE_ORDER */ # include # define int32 int32_t #elif defined __APPLE__ # ifdef __BIG_ENDIAN__ # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ # else # define HIOFFSET 1 # define LOWOFFSET 0 # endif # define int32 int /* a data type that has 32 bits */ #endif /* system */ #ifndef IEM16_EXTERN #ifdef _WIN32 #ifdef IEM16_INTERNAL #define IEM16_EXTERN __declspec(dllexport) extern #else #define IEM16_EXTERN __declspec(dllimport) extern #endif /* IEM16_INTERNAL */ #else #define IEM16_EXTERN extern #endif /* _WIN32 */ #endif /* IEM16_EXTERN */ #endif iem_utils-0.0.20240903/iem16/iem16_delay.c0000600000000000000000000000165714665566711014401 0ustar00/* copyleft (c) 2003-2021 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #define IEM16_INTERNAL #include "iem16_delay.h" #ifdef __m_imp_h_ # define HAVE_CLASS_STRUCT #endif t_class *sigdel16write_class; /* routine to check that all del16writes/del16reads/vds have same vecsize */ void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ if (x->x_rsortno != ugen_getsortno()) { x->x_vecsize = vecsize; x->x_rsortno = ugen_getsortno(); } else if (vecsize != x->x_vecsize) { const char*objname="del16read/del16write/vd"; #ifdef HAVE_CLASS_STRUCT t_object*obj=&x->x_obj; objname = obj->te_g.g_pd->c_name->s_name; #endif pd_error(x, "%s vector size mismatch", objname); } } iem_utils-0.0.20240903/iem16/iem16_delay.h0000600000000000000000000000231014665566711014371 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #ifndef INCLUDE_IEM16_DELAY_H__ #define INCLUDE_IEM16_DELAY_H__ /* sampling */ #include "iem16.h" #include #if defined __WIN32 || defined __WIN32__ //# define NO_UGEN_SORTNO #endif #ifdef NO_UGEN_SORTNO static int ugen_getsortno(void){return 0;} #else extern int ugen_getsortno(void); #endif IEM16_EXTERN t_class *sigdel16write_class; typedef struct del16writectl{ int c_n; t_iem16_16bit *c_vec; int c_phase; } t_del16writectl; typedef struct _sigdel16write{ t_object x_obj; t_symbol *x_sym; t_del16writectl x_cspace; int x_sortno; /* DSP sort number at which this was last put on chain */ int x_rsortno; /* DSP sort # for first del16read or write in chain */ int x_vecsize; /* vector size for del16read~ to use */ float x_f; } t_sigdel16write; IEM16_EXTERN void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize); # define XTRASAMPS 4 # define SAMPBLK 4 #endif iem_utils-0.0.20240903/iem16/iem16_table.c0000600000000000000000000000111314665566711014355 0ustar00/* copyleft (c) 2003-2021 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1921 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* shared functions */ #define IEM16_INTERNAL #include "iem16_table.h" t_class *table16_class; void table16_usedindsp(t_table16*x){ x->x_usedindsp=1; } int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ *size=x->x_size; *vec =x->x_table; return 1; } iem_utils-0.0.20240903/iem16/iem16_table.h0000600000000000000000000000170114665566711014365 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #ifndef INCLUDE_IEM16_TABLE_H__ #define INCLUDE_IEM16_TABLE_H__ /* sampling */ #include "iem16.h" #include /* ------------------------- table16 -------------------------- */ /* a 16bit table */ IEM16_EXTERN t_class *table16_class; typedef struct _table16 { t_object x_obj; t_symbol *x_tablename; long x_size; t_iem16_16bit *x_table; /* hold the data */ int x_usedindsp; t_canvas *x_canvas; /* for file i/o */ } t_table16; IEM16_EXTERN int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec); IEM16_EXTERN void table16_usedindsp(t_table16*x); union tabfudge { double tf_d; int32 tf_i[2]; }; #endif iem_utils-0.0.20240903/iem16/pd-lib-builder/0000700000000000000000000000000014665566711014716 5ustar00iem_utils-0.0.20240903/iem16/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711016752 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/iem16/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711021026 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/iem16/pd-lib-builder/README.md0000600000000000000000000001314614665566711016204 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/iem16/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711017512 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/iem16/tab16play~-help.pd0000600000000000000000000000333014665566711015400 0ustar00#N canvas 159 54 804 495 10; #X msg 639 93 \; pd dsp 0; #X floatatom 11 342 0 0 0 0 - - -; #X msg 11 109 set array99; #X text 93 109 "set" message permits you to switch between arrays; #X text 138 228 creation argument initializes array name; #X obj 11 316 env~ 16384; #X obj 87 360 dac~ 1; #X obj 87 323 *~; #X obj 100 304 line~; #X msg 100 263 0.1 100; #X msg 116 284 0 100; #X text 162 264 on; #X text 157 283 off; #X text 148 301 envelope; #X text 148 312 generator; #X text 101 248 amplitude controls:; #X text 131 362 audio output; #X obj 87 342 hip~ 5; #X msg 26 179 0 44100; #X msg 27 158 44100; #X msg 26 138 bang; #X text 80 136 "bang" or 0 plays whole sample; #X text 82 157 play starting at 44100th sample; #X text 93 177 play starting at beginning for 44100 samples; #X msg 25 199 44100 1000; #X text 103 198 play from 44100 through 45099 (1000 samples); #X obj 589 205 table16 array99; #X text 389 444 updated for iem16 version1.0; #X obj 5 439 tab16write~; #X obj 5 458 tab16read4~; #X obj 89 458 tab16read; #X obj 89 439 tab16write; #X obj 166 439 tab16send~; #X obj 166 458 tab16receive~; #X obj 32 13 tab16play~; #X text 29 43 The [tab16play~] object is the same as the [tabplay~] object \, but it refers to 16bit-arrays stored in [table16] instead of floating-point arrays (stored in normal pd-tables/arrays); #X obj 328 444 table16; #X text 11 417 see also:; #X text 108 14 play a 16bit-table as a sample (non-transposing); #X obj 11 228 tab16play~ array99; #X connect 2 0 39 0; #X connect 5 0 1 0; #X connect 7 0 17 0; #X connect 8 0 7 1; #X connect 9 0 8 0; #X connect 10 0 8 0; #X connect 17 0 6 0; #X connect 18 0 39 0; #X connect 19 0 39 0; #X connect 20 0 39 0; #X connect 24 0 39 0; #X connect 39 0 5 0; #X connect 39 0 7 0; iem_utils-0.0.20240903/iem16/tab16play~.c0000600000000000000000000000700414665566711014273 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------ tab16play~ - non-transposing sample playback --------------- */ static t_class *tab16play_tilde_class; typedef struct _tab16play_tilde{ t_object x_obj; t_outlet *x_bangout; int x_phase; int x_nsampsintab; int x_limit; t_iem16_16bit *x_vec; t_symbol *x_arrayname; } t_tab16play_tilde; static void *tab16play_tilde_new(t_symbol *s){ t_tab16play_tilde *x = (t_tab16play_tilde *)pd_new(tab16play_tilde_class); x->x_phase = 0x7fffffff; x->x_limit = 0; x->x_arrayname = s; outlet_new(&x->x_obj, gensym("signal")); x->x_bangout = outlet_new(&x->x_obj, gensym("bang")); return (x); } static t_int *tab16play_tilde_perform(t_int *w){ t_tab16play_tilde *x = (t_tab16play_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); t_iem16_16bit *fp; int n = (int)(w[3]), phase = x->x_phase, endphase = (x->x_nsampsintab < x->x_limit ? x->x_nsampsintab : x->x_limit), nxfer, n3; if (!x->x_vec || phase >= endphase) goto zero; nxfer = endphase - phase; fp = x->x_vec + phase; if (nxfer > n) nxfer = n; n3 = n - nxfer; phase += nxfer; while (nxfer--) *out++ = *fp++*IEM16_SCALE_DOWN; if (phase >= endphase) { x->x_phase = 0x7fffffff; while (n3--) *out++ = 0; } else x->x_phase = phase; return (w+4); zero: while (n--) *out++ = 0; return (w+4); } void tab16play_tilde_set(t_tab16play_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) pd_error(x, "tab16play~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_nsampsintab, &x->x_vec)) { pd_error(x, "%s: bad template for tab16play~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16play_tilde_dsp(t_tab16play_tilde *x, t_signal **sp){ tab16play_tilde_set(x, x->x_arrayname); dsp_add(tab16play_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } static void tab16play_tilde_list(t_tab16play_tilde *x, t_symbol *s, int argc, t_atom *argv){ (void)s; /* unused */ long start = atom_getfloatarg(0, argc, argv); long length = atom_getfloatarg(1, argc, argv); if (start < 0) start = 0; if (length <= 0)x->x_limit = 0x7fffffff; else x->x_limit = start + length; x->x_phase = start; } static void tab16play_tilde_stop(t_tab16play_tilde *x){ x->x_phase = 0x7fffffff; } void tab16play_tilde_setup(void){ tab16play_tilde_class = class_new(gensym("tab16play~"), (t_newmethod)tab16play_tilde_new, 0, sizeof(t_tab16play_tilde), 0, A_DEFSYM, 0); class_addmethod(tab16play_tilde_class, (t_method)tab16play_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tab16play_tilde_class, (t_method)tab16play_tilde_stop, gensym("stop"), 0); class_addmethod(tab16play_tilde_class, (t_method)tab16play_tilde_set, gensym("set"), A_DEFSYM, 0); class_addlist(tab16play_tilde_class, tab16play_tilde_list); } iem_utils-0.0.20240903/iem16/tab16read-help.pd0000600000000000000000000000154514665566711015156 0ustar00#N canvas 245 143 703 316 12; #X text 62 102 index; #X floatatom 25 103 0 0 0 0 - - -; #X floatatom 25 199 0 0 0 0 - - -; #X text 70 197 output = array99[index]; #X text 189 157 creation argument; #X text 185 175 gives array name; #X msg 35 125 set array99; #X text 147 125 change array name; #X obj 422 131 table16 array99; #X obj 17 13 tab16read; #X text 412 257 updated for iem16 version1.0; #X obj 16 252 tab16write~; #X obj 16 271 tab16read4~; #X obj 120 271 tab16read; #X obj 120 252 tab16write; #X obj 217 252 tab16send~; #X obj 217 271 tab16receive~; #X obj 339 257 table16; #X text 108 15 - read numbers from a 16bit-table; #X text 21 42 since [table16] can only hold 16bit values \, the output of [tab16read] is limited to integer-values between -32768..+32767 ; #X obj 25 165 tab16read array99; #X connect 1 0 20 0; #X connect 6 0 20 0; #X connect 20 0 2 0; iem_utils-0.0.20240903/iem16/tab16read.c0000600000000000000000000000326714665566711014052 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16read, tab16read4, tab16write */ #include "iem16_table.h" /* ---------- tab16read: control, non-interpolating ------------------------ */ static t_class *tab16read_class; typedef struct _tab16read{ t_object x_obj; t_symbol *x_arrayname; } t_tab16read; static void tab16read_float(t_tab16read *x, t_float f){ t_table16 *a; int npoints; t_iem16_16bit *vec; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) pd_error(x, "%s: no such table16", x->x_arrayname->s_name); else if (!table16_getarray16(a, &npoints, &vec)) pd_error(x, "%s: bad template for tab16read", x->x_arrayname->s_name); else { int n = f; if (n < 0) n = 0; else if (n >= npoints) n = npoints - 1; outlet_float(x->x_obj.ob_outlet, (npoints ? vec[n] : 0)); } } static void tab16read_set(t_tab16read *x, t_symbol *s){ x->x_arrayname = s; } static void *tab16read_new(t_symbol *s){ t_tab16read *x = (t_tab16read *)pd_new(tab16read_class); x->x_arrayname = s; outlet_new(&x->x_obj, gensym("float")); return (x); } void tab16read_setup(void){ tab16read_class = class_new(gensym("tab16read"), (t_newmethod)tab16read_new, 0, sizeof(t_tab16read), 0, A_DEFSYM, 0); class_addfloat(tab16read_class, (t_method)tab16read_float); class_addmethod(tab16read_class, (t_method)tab16read_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem16/tab16read4.c0000600000000000000000000000433214665566711014130 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16read, tab16read4, tab16write */ #include "iem16_table.h" /* ---------- tab16read4: control, non-interpolating ------------------------ */ static t_class *tab16read4_class; typedef struct _tab16read4{ t_object x_obj; t_symbol *x_arrayname; } t_tab16read4; static void tab16read4_float(t_tab16read4 *x, t_float f){ t_table16 *array; int npoints; t_iem16_16bit *vec; if (!(array = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) pd_error(x, "%s: no such table16", x->x_arrayname->s_name); else if (!table16_getarray16(array, &npoints, &vec)) pd_error(x, "%s: bad template for tab16read4", x->x_arrayname->s_name); else if (npoints < 4) outlet_float(x->x_obj.ob_outlet, 0); else if (f <= 1) outlet_float(x->x_obj.ob_outlet, vec[1]); else if (f >= npoints - 2) outlet_float(x->x_obj.ob_outlet, vec[npoints - 2]); else { int n = f; float a, b, c, d, cminusb, frac; t_iem16_16bit *fp; if (n >= npoints - 2) n = npoints - 3; fp = vec + n; frac = f - n; a = fp[-1]; b = fp[0]; c = fp[1]; d = fp[2]; cminusb = c-b; outlet_float(x->x_obj.ob_outlet, b + frac * (cminusb - 0.5f * (frac-1.) * ((a - d + 3.0f * cminusb) * frac + (b - a - cminusb)))); } } static void tab16read4_set(t_tab16read4 *x, t_symbol *s){ x->x_arrayname = s; } static void *tab16read4_new(t_symbol *s){ t_tab16read4 *x = (t_tab16read4 *)pd_new(tab16read4_class); x->x_arrayname = s; outlet_new(&x->x_obj, gensym("float")); return (x); } void tab16read4_setup(void){ tab16read4_class = class_new(gensym("tab16read4"), (t_newmethod)tab16read4_new, 0, sizeof(t_tab16read4), 0, A_DEFSYM, 0); class_addfloat(tab16read4_class, (t_method)tab16read4_float); class_addmethod(tab16read4_class, (t_method)tab16read4_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem16/tab16read4~-help.pd0000600000000000000000000000253614665566711015441 0ustar00#N canvas 59 33 741 466 10; #X text 21 207 signal input x(n); #X text 127 21 4-point-interpolating table lookup; #X obj 11 316 snapshot~; #X obj 30 290 metro 200; #X obj 11 124 sig~; #X floatatom 11 98 0 0 0 0 - - -; #X obj 30 264 r readout; #X floatatom 11 342 0 0 0 0 - - -; #X text 49 94 incoming signal is index. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful. You can shift-drag the number box to see the effect of interpolation.; #X msg 34 158 set array99; #X text 116 158 "set" message permits you to switch between arrays ; #X text 149 228 creation argument initializes array name; #X obj 460 301 table16 array99; #X text 395 400 updated for iem16 version1.0; #X obj 11 395 tab16write~; #X obj 11 414 tab16read4~; #X obj 95 414 tab16read; #X obj 95 395 tab16write; #X obj 172 395 tab16send~; #X obj 172 414 tab16receive~; #X obj 334 400 table16; #X obj 47 21 tab16read4~; #X text 7 51 tab16read4~ is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial. ; #X text 185 266 since [table16] can only hold 16bit-values \, the stored integer values -32768..+32767 are converted to floats -1.0..+1.0; #X obj 10 228 tab16read4~ array99; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 24 0; #X connect 5 0 4 0; #X connect 6 0 3 0; #X connect 9 0 24 0; #X connect 24 0 2 0; iem_utils-0.0.20240903/iem16/tab16read4~.c0000600000000000000000000000611214665566711014324 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /******************** tab16read4~ ***********************/ static t_class *tab16read4_tilde_class; typedef struct _tab16read4_tilde{ t_object x_obj; int x_npoints; t_iem16_16bit *x_vec; t_symbol *x_arrayname; float x_f; } t_tab16read4_tilde; static void *tab16read4_tilde_new(t_symbol *s){ t_tab16read4_tilde *x = (t_tab16read4_tilde *)pd_new(tab16read4_tilde_class); x->x_arrayname = s; x->x_vec = 0; outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *tab16read4_tilde_perform(t_int *w){ t_tab16read4_tilde *x = (t_tab16read4_tilde *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int maxindex; t_iem16_16bit *buf = x->x_vec; t_iem16_16bit *fp; int i; maxindex = x->x_npoints - 3; if (!buf) goto zero; for (i = 0; i < n; i++) { float findex = *in++; int index = findex; float frac, a, b, c, d, cminusb; if (index < 1) index = 1, frac = 0; else if (index > maxindex) index = maxindex, frac = 1; else frac = findex - index; fp = buf + index; a = fp[-1]*IEM16_SCALE_DOWN; b = fp[0]*IEM16_SCALE_DOWN; c = fp[1]*IEM16_SCALE_DOWN; d = fp[2]*IEM16_SCALE_DOWN; cminusb = c-b; *out++ = b + frac * (cminusb - 0.5f * (frac-1.) * ((a - d + 3.0f * cminusb) * frac + (b - a - cminusb))); } return (w+5); zero: while (n--) *out++ = 0; return (w+5); } void tab16read4_tilde_set(t_tab16read4_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) pd_error(x, "tab16read4~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_npoints, &x->x_vec)) { pd_error(x, "%s: bad template for tab16read4~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16read4_tilde_dsp(t_tab16read4_tilde *x, t_signal **sp){ tab16read4_tilde_set(x, x->x_arrayname); dsp_add(tab16read4_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void tab16read4_tilde_setup(void){ tab16read4_tilde_class = class_new(gensym("tab16read4~"), (t_newmethod)tab16read4_tilde_new, 0, sizeof(t_tab16read4_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16read4_tilde_class, t_tab16read4_tilde, x_f); class_addmethod(tab16read4_tilde_class, (t_method)tab16read4_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tab16read4_tilde_class, (t_method)tab16read4_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem16/tab16read~.c0000600000000000000000000000522714665566711014246 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /******************** tab16read~ ***********************/ static t_class *tab16read_tilde_class; typedef struct _tab16read_tilde{ t_object x_obj; int x_npoints; t_iem16_16bit *x_vec; t_symbol *x_arrayname; float x_f; } t_tab16read_tilde; static void *tab16read_tilde_new(t_symbol *s){ t_tab16read_tilde *x = (t_tab16read_tilde *)pd_new(tab16read_tilde_class); x->x_arrayname = s; x->x_vec = 0; outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *tab16read_tilde_perform(t_int *w){ t_tab16read_tilde *x = (t_tab16read_tilde *)(w[1]); t_float *in = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (int)(w[4]); int maxindex; t_iem16_16bit *buf = x->x_vec; int i; maxindex = x->x_npoints - 1; if (!buf) goto zero; for (i = 0; i < n; i++) { int index = *in++; if (index < 0) index = 0; else if (index > maxindex) index = maxindex; *out++ = buf[index]*IEM16_SCALE_DOWN; } return (w+5); zero: while (n--) *out++ = 0; return (w+5); } void tab16read_tilde_set(t_tab16read_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) pd_error(x, "tab16read~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_npoints, &x->x_vec)) { pd_error(x, "%s: bad template for tab16read~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16read_tilde_dsp(t_tab16read_tilde *x, t_signal **sp){ tab16read_tilde_set(x, x->x_arrayname); dsp_add(tab16read_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void tab16read_tilde_setup(void){ tab16read_tilde_class = class_new(gensym("tab16read~"), (t_newmethod)tab16read_tilde_new, 0, sizeof(t_tab16read_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16read_tilde_class, t_tab16read_tilde, x_f); class_addmethod(tab16read_tilde_class, (t_method)tab16read_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tab16read_tilde_class, (t_method)tab16read_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem16/tab16receive~-help.pd0000600000000000000000000000114414665566711016056 0ustar00#N canvas 109 83 646 239 12; #X obj 328 181 table16; #X text 17 53 creation argument: name of array; #X text 16 83 By default a block is 64 samples \; this can be reset using the block~ object.; #X obj 21 18 tab16receive~; #X text 376 199 updated for iem16 version1.0; #X obj 5 176 tab16write~; #X obj 5 195 tab16read4~; #X obj 109 195 tab16read; #X obj 109 176 tab16write; #X obj 204 176 tab16send~; #X obj 204 195 tab16receive~; #X text 17 155 see also:; #X text 129 18 - read a block of a 16bit-signal from an array continuously ; #X text 10 129 16bit-signals are limited to 65536 values between -1.0..+1.0 ; iem_utils-0.0.20240903/iem16/tab16receive~.c0000600000000000000000000000417214665566711014753 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------------------ tab16receive~ ------------------------- */ static t_class *tab16receive_class; typedef struct _tab16receive{ t_object x_obj; t_iem16_16bit *x_vec; t_symbol *x_arrayname; } t_tab16receive; static t_int *tab16receive_perform(t_int *w){ t_tab16receive *x = (t_tab16receive *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]; t_iem16_16bit *from = x->x_vec; if (from) while (n--) *out++ = *from++*IEM16_SCALE_DOWN; else while (n--) *out++ = 0; return (w+4); } static void tab16receive_dsp(t_tab16receive *x, t_signal **sp){ t_table16 *a; int vecsize; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*x->x_arrayname->s_name) pd_error(x, "tab16send~: %s: no such table16", x->x_arrayname->s_name); } else if (!table16_getarray16(a, &vecsize, &x->x_vec)) pd_error(x, "%s: bad template for tab16receive~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; if (n < vecsize) vecsize = n; table16_usedindsp(a); dsp_add(tab16receive_perform, 3, x, sp[0]->s_vec, vecsize); } } static void *tab16receive_new(t_symbol *s){ t_tab16receive *x = (t_tab16receive *)pd_new(tab16receive_class); x->x_arrayname = s; outlet_new(&x->x_obj, gensym("signal")); return (x); } static void tab16receive_setup(void){ tab16receive_class = class_new(gensym("tab16receive~"), (t_newmethod)tab16receive_new, 0, sizeof(t_tab16receive), 0, A_DEFSYM, 0); class_addmethod(tab16receive_class, (t_method)tab16receive_dsp, gensym("dsp"), A_CANT, 0); } // G.Holzmann: for PD-extended build system void tab16receive_tilde_setup(void) { tab16receive_setup(); } iem_utils-0.0.20240903/iem16/tab16send~-help.pd0000600000000000000000000000126214665566711015366 0ustar00#N canvas 151 91 705 277 12; #X obj 328 221 table16; #X text 113 26 writes one block of a signal continuously to an array ; #X text 41 60 creation argument: name of array; #X text 29 96 By default a block is 64 samples \; this can be reset using the block~ object.; #X text 376 239 updated for iem16 version1.0; #X obj 5 216 tab16write~; #X obj 5 235 tab16read4~; #X obj 109 235 tab16read; #X obj 109 216 tab16write; #X obj 204 216 tab16send~; #X obj 204 235 tab16receive~; #X text 17 195 see also:; #X text 14 137 16bit-signals are limited to 65536 values between -1.0..+1.0 ; #X text 16 157 if your signal has absolute values >1.0 \, these are wrapped around...; #X obj 11 27 tab16send~; iem_utils-0.0.20240903/iem16/tab16send~.c0000600000000000000000000000441414665566711014261 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------------------ tab16send~ ------------------------- */ static t_class *tab16send_class; typedef struct _tab16send{ t_object x_obj; t_iem16_16bit *x_vec; int x_graphperiod; int x_graphcount; t_symbol *x_arrayname; float x_f; } t_tab16send; static void *tab16send_new(t_symbol *s){ t_tab16send *x = (t_tab16send *)pd_new(tab16send_class); x->x_graphcount = 0; x->x_arrayname = s; x->x_f = 0; return (x); } static t_int *tab16send_perform(t_int *w){ t_tab16send *x = (t_tab16send *)(w[1]); t_float *in = (t_float *)(w[2]); int n = w[3]; t_iem16_16bit *dest = x->x_vec; int i = x->x_graphcount; if (!x->x_vec) goto bad; while (n--) *dest = *in++*IEM16_SCALE_UP; if (!i--)i = x->x_graphperiod; x->x_graphcount = i; bad: return (w+4); } static void tab16send_dsp(t_tab16send *x, t_signal **sp){ int vecsize; t_table16 *a; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*x->x_arrayname->s_name) pd_error(x, "tab16send~: %s: no such table16", x->x_arrayname->s_name); } else if (!table16_getarray16(a, &vecsize, &x->x_vec)) pd_error(x, "%s: bad template for tab16send~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; int ticksper = sp[0]->s_sr/n; if (ticksper < 1) ticksper = 1; x->x_graphperiod = ticksper; if (x->x_graphcount > ticksper) x->x_graphcount = ticksper; if (n < vecsize) vecsize = n; table16_usedindsp(a); dsp_add(tab16send_perform, 3, x, sp[0]->s_vec, vecsize); } } void tab16send_tilde_setup(void){ tab16send_class = class_new(gensym("tab16send~"), (t_newmethod)tab16send_new, 0, sizeof(t_tab16send), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16send_class, t_tab16send, x_f); class_addmethod(tab16send_class, (t_method)tab16send_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem16/tab16write-help.pd0000600000000000000000000000162714665566711015376 0ustar00#N canvas 44 17 653 456 12; #X floatatom 39 96 0 0 0 0 - - -; #X floatatom 176 170 0 0 0 0 - - -; #X text 208 192 creation argument; #X text 210 210 is array name; #X text 76 87 set y value; #X text 74 152 right inlet selects x value; #X msg 55 117 set array99; #X text 163 116 change array name; #X text 388 378 updated for iem16 version1.0; #X obj 340 360 table16; #X obj 438 156 table16 array99; #X text 133 28 write numbers to a 16bit-table; #X text 20 256 since [table16] can only hold 16bit-values \, the stored numbers have to be integer (ok \, we take care of this!) values between -32768..+32767.; #X obj 39 195 tab16write array99; #X obj 31 27 tab16write; #X obj 17 355 tab16write~; #X obj 17 374 tab16read4~; #X obj 121 374 tab16read; #X obj 121 355 tab16write; #X obj 216 355 tab16send~; #X obj 216 374 tab16receive~; #X text 29 334 see also:; #X connect 0 0 13 0; #X connect 1 0 13 1; #X connect 6 0 13 0; iem_utils-0.0.20240903/iem16/tab16write.c0000600000000000000000000000332314665566711014262 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16read, tab16read4, tab16write */ #include "iem16_table.h" /* ------------------ tab16write: control ------------------------ */ static t_class *tab16write_class; typedef struct _tab16write { t_object x_obj; t_symbol *x_arrayname; float x_ft1; int x_set; } t_tab16write; static void tab16write_float(t_tab16write *x, t_float f) { int vecsize; t_table16 *a; t_iem16_16bit *vec; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) pd_error(x, "%s: no such table16", x->x_arrayname->s_name); else if (!table16_getarray16(a, &vecsize, &vec)) pd_error(x, "%s: bad template for tab16write", x->x_arrayname->s_name); else { int n = x->x_ft1; if (n < 0) n = 0; else if (n >= vecsize) n = vecsize-1; vec[n] = f; } } static void tab16write_set(t_tab16write *x, t_symbol *s){ x->x_arrayname = s; } static void *tab16write_new(t_symbol *s){ t_tab16write *x = (t_tab16write *)pd_new(tab16write_class); x->x_ft1 = 0; x->x_arrayname = s; floatinlet_new(&x->x_obj, &x->x_ft1); return (x); } void tab16write_setup(void){ tab16write_class = class_new(gensym("tab16write"), (t_newmethod)tab16write_new, 0, sizeof(t_tab16write), 0, A_DEFSYM, 0); class_addfloat(tab16write_class, (t_method)tab16write_float); class_addmethod(tab16write_class, (t_method)tab16write_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem16/tab16write~-help.pd0000600000000000000000000000200114665566711015557 0ustar00#N canvas 119 134 697 433 10; #X msg 43 131 bang; #X obj 23 82 sig~ 3000; #X obj 23 110 phasor~; #X text 158 213 creation argument initializes array name; #X msg 40 181 set array99; #X msg 445 35 \; pd dsp 1; #X msg 524 37 \; pd dsp 0; #X text 85 133 bang to start recording; #X text 126 180 set the destination array; #X msg 43 153 stop; #X text 85 154 stop recording; #X text 385 366 updated for iem16 version1.0; #X obj 337 348 table16; #X text 26 322 see also:; #X obj 22 211 tab16write~ array99; #X obj 492 160 table16 array99; #X obj 31 27 tab16write~; #X text 120 27 object to write a 16bit-signal in an array; #X text 261 261 since [table16] can only hold 16bit-values \, the incoming signal (-1.0..+1.0) is stored as integer values -32768..+32767; #X obj 14 343 tab16write~; #X obj 14 362 tab16read4~; #X obj 118 362 tab16read; #X obj 118 343 tab16write; #X obj 213 343 tab16send~; #X obj 213 362 tab16receive~; #X connect 0 0 14 0; #X connect 1 0 2 0; #X connect 2 0 14 0; #X connect 4 0 14 0; #X connect 9 0 14 0; iem_utils-0.0.20240903/iem16/tab16write~.c0000600000000000000000000000572414665566711014467 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* tab16write~, tab16play~, tab16read~, tab16read4~, tab16send~, tab16receive~ */ #include "iem16_table.h" /* ------------------------- tab16write~ -------------------------- */ static t_class *tab16write_tilde_class; typedef struct _tab16write_tilde { t_object x_obj; int x_phase; int x_nsampsintab; short *x_vec; t_symbol *x_arrayname; float x_f; } t_tab16write_tilde; static void *tab16write_tilde_new(t_symbol *s) { t_tab16write_tilde *x = (t_tab16write_tilde *)pd_new(tab16write_tilde_class); x->x_phase = 0x7fffffff; x->x_arrayname = s; x->x_f = 0; return (x); } static t_int *tab16write_tilde_perform(t_int *w) { t_tab16write_tilde *x = (t_tab16write_tilde *)(w[1]); t_float *in = (t_float *)(w[2]); int n = (int)(w[3]), phase = x->x_phase, endphase = x->x_nsampsintab; if (!x->x_vec) goto bad; if (endphase > phase) { int nxfer = endphase - phase; t_iem16_16bit *fp = x->x_vec + phase; if (nxfer > n) nxfer = n; phase += nxfer; while (nxfer--)*fp++ = *in++*IEM16_SCALE_UP; x->x_phase = phase; } bad: return (w+4); } void tab16write_tilde_set(t_tab16write_tilde *x, t_symbol *s){ t_table16 *a; x->x_arrayname = s; if (!(a = (t_table16 *)pd_findbyclass(x->x_arrayname, table16_class))) { if (*s->s_name) pd_error(x, "tab16write~: %s: no such table16", x->x_arrayname->s_name); x->x_vec = 0; } else if (!table16_getarray16(a, &x->x_nsampsintab, &x->x_vec)) { pd_error(x, "%s: bad template for tab16write~", x->x_arrayname->s_name); x->x_vec = 0; } else table16_usedindsp(a); } static void tab16write_tilde_dsp(t_tab16write_tilde *x, t_signal **sp){ tab16write_tilde_set(x, x->x_arrayname); dsp_add(tab16write_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } static void tab16write_tilde_bang(t_tab16write_tilde *x){ x->x_phase = 0; } static void tab16write_tilde_stop(t_tab16write_tilde *x){ x->x_phase = x->x_nsampsintab; } void tab16write_tilde_setup(void){ tab16write_tilde_class = class_new(gensym("tab16write~"), (t_newmethod)tab16write_tilde_new, 0, sizeof(t_tab16write_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tab16write_tilde_class, t_tab16write_tilde, x_f); class_addmethod(tab16write_tilde_class, (t_method)tab16write_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tab16write_tilde_class, (t_method)tab16write_tilde_set, gensym("set"), A_SYMBOL, 0); class_addmethod(tab16write_tilde_class, (t_method)tab16write_tilde_stop, gensym("stop"), 0); class_addbang(tab16write_tilde_class, tab16write_tilde_bang); } iem_utils-0.0.20240903/iem16/table16-help.pd0000600000000000000000000000465514665566711014650 0ustar00#N canvas 37 0 856 640 10; #X obj 30 21 table16; #X text 97 22 16bit-table; #X text 32 51 [table16] stores 16bit values. The normal pd-tables ([table] \, array) store the values as floating-points. While floating points are (often) more precise (this is of course not really true... \, esp. when comparing integer(4byte) to floating-point.) they use a lot of memory (4byte).; #X text 32 121 [table16] uses only 16bit (2bytes) to store the values \, which is half of the memory.; #X text 32 155 However there are 2 major drawbacks; #X text 53 172 a) less precision means less SNR - you can only store 65536 different values \, but this is what CD-quality is (should be good enough for most musical applications); #X text 55 221 b) the 65536 values (-32678..+32767) are mapped to -1.0..+1.0! This means you cannot store signals that exceed this magical limit. Please make sure \, that the signal has correct values (use [clip~]) or the unclipped values will get wrapped!; #X text 20 323 There are several objects to access the data of [table16]: ; #X obj 55 344 tab16write~; #X obj 55 363 tab16read4~; #X obj 279 363 tab16read; #X obj 279 344 tab16write; #X obj 164 344 tab16send~; #X obj 164 363 tab16receive~; #X obj 55 382 tab16read~; #X text 19 410 The message-objects [tab16read]/[tab16write] store the values directly (-32767..+32768) \, while the signal-objects convert the floats -1.0..+1.0 to the correct values or vice-versa.; #X text 270 21 updated for iem16 version1.0; #X msg 496 53 resize 100; #X obj 496 308 table16 array16 99; #N canvas 0 0 450 300 graph6 0; #X array array100 10 float 1; #A 0 1 2 3 4 5 6 7 8 9 0; #X coords 0 10 9 0 200 140 1; #X restore 477 452 graph; #X msg 478 409 \; array100 0 1 2 3 4 5 6 7 8 9; #X text 481 389 click to init float-array; #X msg 502 114 from array100; #X text 21 497 There is no beautiful graphical representation as with pd's arrays.; #X msg 508 139 from array100 resize; #X msg 516 190 from array100 20 30; #X msg 517 213 from array100 20 30 resize; #X msg 527 259 from array100 20 30 95; #X msg 527 279 from array100 20 30 95 resize; #X text 502 95 copy the data from a float-array; #X text 603 117 and resize the 16bit-array; #X text 513 173 copy floats (index20..30); #X text 653 192 and resize to 30-20; #X text 526 241 copy indexed values and insert at index95; #X connect 17 0 18 0; #X connect 22 0 18 0; #X connect 24 0 18 0; #X connect 25 0 18 0; #X connect 26 0 18 0; #X connect 27 0 18 0; #X connect 28 0 18 0; iem_utils-0.0.20240903/iem16/table16.c0000600000000000000000000001360214665566711013531 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_array.c from pd: * Copyright (c) 1997-1999 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* sampling */ #include "iem16_table.h" #include #include #include /* for read/write to files */ #if (defined(_MSC_VER) && (_MSC_VER > 600)) # define fdopen(fd,type) _fdopen(fd,type) #endif static int am_bigendian(void){ /* actually this should be in m_pd.h */ unsigned short s = 1; unsigned char c = *(char *)(&s); return (c==0); } static void table16_const(t_table16*x, t_float f); static void *table16_new(t_symbol *s, t_float f){ t_table16 *x = (t_table16*)pd_new(table16_class); int i=f; if(i<1)i=100; x->x_tablename=s; x->x_size=i; x->x_table=getbytes(x->x_size*sizeof(t_iem16_16bit)); x->x_usedindsp=0; pd_bind(&x->x_obj.ob_pd, x->x_tablename); x->x_canvas = canvas_getcurrent(); table16_const(x, 0); return(x); } static void table16_free(t_table16 *x){ if(x->x_table)freebytes(x->x_table, x->x_size*sizeof(t_iem16_16bit)); pd_unbind(&x->x_obj.ob_pd, x->x_tablename); } static void table16_resize(t_table16*x, t_float f){ int i=f; int was=x->x_size; if (i<1){ pd_error(x, "can only resize to sizes >0"); return; } x->x_table=resizebytes(x->x_table, was*sizeof(t_iem16_16bit), i*sizeof(t_iem16_16bit)); if(i>was)memset(x->x_table+was, 0, (i-was)*sizeof(t_iem16_16bit)); x->x_size =i; if (x->x_usedindsp) canvas_update_dsp(); } static void table16_const(t_table16*x, t_float f){ t_iem16_16bit s = (t_iem16_16bit)f; int i = x->x_size; t_iem16_16bit*buf=x->x_table; while(i--)*buf++=s; } static void table16_from(t_table16*x, t_symbol*s, int argc, t_atom*argv){ float scale=IEM16_SCALE_UP; int resize=0; int startfrom=0, startto=0, endfrom=0, endto=x->x_size; t_garray *a=0; int npoints; t_word *vec=(0), *src=(0); t_iem16_16bit *dest; int i,length=0; if(argc<1 || argv->a_type!=A_SYMBOL){ pd_error(x, "you have to specify the from-table !"); return; } s=atom_getsymbol(argv); argc--;argv++; if (!(a = (t_garray *)pd_findbyclass(s, garray_class))){ pd_error(x, "%s: no such array", s->s_name); return; } else if (!garray_getfloatwords(a, &npoints, &vec)){ pd_error(x, "%s: bad template for tabread4", s->s_name); return; } if(argc>0 && atom_getsymbol(argv+argc-1)==gensym("resize")){ resize=1; argc--; } endfrom=npoints; switch(argc){ case 0:break; case 4: endto =atom_getfloat(argv+3); /* fallthrough */ case 3: startto =atom_getfloat(argv+2); /* fallthrough */ case 2: endfrom =atom_getfloat(argv+1); /* fallthrough */ case 1: startfrom=atom_getfloat(argv); break; default: pd_error(x, "table16: from [ [ [ []]]] [resize]"); return; } if(startfrom<0)startfrom=0; if (startto<0)startto=0; if(endfrom<=startfrom)return; if(endto <=startto) return; length=endfrom-startfrom; if(resize){ if(x->x_size < (startto+length))table16_resize(x, startto+length); } else{ if(x->x_size < (startto+length))length=x->x_size-startto; } endfrom=startfrom+length; endto =startto+length; dest=x->x_table+startto; src =vec+startfrom; i=length; while(i--)*dest++=(*src++).w_float * scale; //post("from %s (%d, %d) --> (%d, %d)\tresize=%s", s->s_name, startfrom, endfrom, startto, endto, (resize)?"yes":"no"); } #define BINREADMODE "rb" #define BINWRITEMODE "wb" static void table16_read16(t_table16 *x, t_symbol *filename, t_symbol *endian, t_floatarg fskip) { int skip = fskip, filedesc; int i, nelem; t_iem16_16bit *vec; FILE *fd; char buf[MAXPDSTRING], *bufptr; short s; int cpubig = am_bigendian(), swap = 0; char c = endian->s_name[0]; if (c == 'b') { if (!cpubig) swap = 1; } else if (c == 'l') { if (cpubig) swap = 1; } else if (c) { pd_error(x, "array_read16: endianness is 'l' (low byte first ala INTEL)"); pd_error(x, "... or 'b' (high byte first ala MIPS,DEC,PPC)"); } if (!table16_getarray16(x, &nelem, &vec)) { pd_error(x, "%s: not a 16bit array", x->x_tablename->s_name); return; } if ((filedesc = open_via_path( canvas_getdir(x->x_canvas)->s_name, filename->s_name, "", buf, &bufptr, MAXPDSTRING, 1)) < 0 || !(fd = fdopen(filedesc, BINREADMODE)) ) { pd_error(x, "%s: can't open", filename->s_name); return; } if (skip) { long pos = fseek(fd, (long)skip, SEEK_SET); if (pos < 0) { pd_error(x, "%s: can't seek to byte %d", buf, skip); fclose(fd); return; } } for (i = 0; i < nelem; i++) { if (fread(&s, sizeof(s), 1, fd) < 1) { post("%s: read %d elements into table of size %d", filename->s_name, i, nelem); break; } if (swap) s = ((s & 0xff) << 8) | ((s & 0xff00) >> 8); vec[i] = s; } while (i < nelem) vec[i++] = 0; fclose(fd); } void table16_setup(void){ table16_class = class_new(gensym("table16"), (t_newmethod)table16_new, (t_method)table16_free, sizeof(t_table16), 0, A_DEFSYM, A_DEFFLOAT, 0); class_addmethod(table16_class, (t_method)table16_resize, gensym("resize"), A_DEFFLOAT, 0); class_addmethod(table16_class, (t_method)table16_const, gensym("const"), A_DEFFLOAT, 0); class_addmethod(table16_class, (t_method)table16_from, gensym("from"), A_GIMME, 0); class_addmethod(table16_class, (t_method)table16_read16, gensym("read16"), A_SYMBOL, A_DEFFLOAT, A_DEFSYM, 0); } void iem16_table_setup(void) { table16_setup(); } iem_utils-0.0.20240903/iem16/vd16~-help.pd0000600000000000000000000000240514665566711014357 0ustar00#N canvas 88 40 717 480 12; #X floatatom 50 254 0 0 0 0 - - -; #X obj 50 347 outlet~; #X text 130 346 signal output (delayed signal); #X obj 50 282 sig~; #X text 99 279 signal input (delay time in ms); #X text 218 310 creation argument: name of delay line; #X text 35 400 see also:; #X text 77 10 reads a signal from a 16bit delay line at a variable delay time (4-point-interpolation); #X text 31 51 vd16~ implements a 4-point interpolating delay tap from a corresponding delwrite~ object. The delay in milliseconds of the tap is specified by the incoming signal.; #X text 16 433 similar pd-objects:; #X obj 201 432 delread~; #X obj 285 432 delwrite~; #X obj 378 432 vd~; #X obj 123 403 del16write~; #X obj 242 403 del16read~; #X text 411 386 updated for iem16 version1.0; #X text 28 116 This is very similar to the pd-object; #X text 56 137 It uses only 16bit to store the samples \, which will need only half of the memory of pd's floatingpoint-based object.; #X text 57 175 However \, there are 2 drawbacks: there will be some additional noise (because floats are more precise than 16bit) \, and you cannot have values>1 stored in the delay-line; #X obj 375 112 vd~; #X obj 50 314 vd16~ del_example; #X obj 24 16 vd16~; #X connect 0 0 3 0; #X connect 3 0 20 0; #X connect 20 0 1 0; iem_utils-0.0.20240903/iem16/vd16~.c0000600000000000000000000000565014665566711013255 0ustar00/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM * based on d_delay.c from pd: * Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* del16read~, del16write~, vd16~ */ #include "iem16_delay.h" /* ----------------------------- vd~ ----------------------------- */ static t_class *sig16vd_class; typedef struct _sig16vd{ t_object x_obj; t_symbol *x_sym; t_float x_sr; /* samples per msec */ int x_zerodel; /* 0 or vecsize depending on read/write order */ float x_f; } t_sig16vd; static void *sig16vd_new(t_symbol *s){ t_sig16vd *x = (t_sig16vd *)pd_new(sig16vd_class); if (!*s->s_name) s = gensym("vd~"); x->x_sym = s; x->x_sr = 1; x->x_zerodel = 0; outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *sig16vd_perform(t_int *w){ t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_del16writectl *ctl = (t_del16writectl *)(w[3]); t_sig16vd *x = (t_sig16vd *)(w[4]); int n = (int)(w[5]); int nsamps = ctl->c_n; float limit = nsamps - n - 1; float fn = n-4; t_iem16_16bit *vp = ctl->c_vec, *bp, *wp = vp + ctl->c_phase; float zerodel = x->x_zerodel; while (n--) { float delsamps = x->x_sr * *in++ - zerodel, frac; int idelsamps; float a, b, c, d, cminusb; if (delsamps < 1.00001f) delsamps = 1.00001f; if (delsamps > limit) delsamps = limit; delsamps += fn; fn = fn - 1.0f; idelsamps = delsamps; frac = delsamps - (float)idelsamps; bp = wp - (idelsamps + 3); if (bp < vp + 4) bp += nsamps; d = bp[-3]*IEM16_SCALE_DOWN; c = bp[-2]*IEM16_SCALE_DOWN; b = bp[-1]*IEM16_SCALE_DOWN; a = bp[00]*IEM16_SCALE_DOWN; cminusb = c-b; *out++ = b + frac * (cminusb - 0.5f * (frac-1.) * ((a - d + 3.0f * cminusb) * frac + (b - a - cminusb))); } return (w+6); } static void sig16vd_dsp(t_sig16vd *x, t_signal **sp){ t_sigdel16write *delwriter = (t_sigdel16write *)pd_findbyclass(x->x_sym, sigdel16write_class); x->x_sr = sp[0]->s_sr * 0.001; if (delwriter) { sigdel16write_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); dsp_add(sig16vd_perform, 5, sp[0]->s_vec, sp[1]->s_vec, &delwriter->x_cspace, x, sp[0]->s_n); } else pd_error(x, "vd~: %s: no such del16write~",x->x_sym->s_name); } static void sig16vd_setup(void){ sig16vd_class = class_new(gensym("vd16~"), (t_newmethod)sig16vd_new, 0, sizeof(t_sig16vd), 0, A_DEFSYM, 0); class_addmethod(sig16vd_class, (t_method)sig16vd_dsp, gensym("dsp"), A_CANT, 0); CLASS_MAINSIGNALIN(sig16vd_class, t_sig16vd, x_f); } // G.Holzmann: for PD-extended build system void vd16_tilde_setup(void) { sig16vd_setup(); } iem_utils-0.0.20240903/iem_adaptfilt/0000700000000000000000000000000014665566711014004 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/AUTHORS.txt0000600000000000000000000000012114665566711015666 0ustar00markus noisternig thomas musil iem_utils-0.0.20240903/iem_adaptfilt/GnuGPL.txt0000600000000000000000000004311014665566711015642 0ustar00 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-0.0.20240903/iem_adaptfilt/LICENSE.txt0000600000000000000000000000167214665566711015637 0ustar00iem_adaptfilt - pd-objects for adaptive filtering Copyright (C) 2004-2006 markus noisternig (noisternig AT iem DOT at) Copyright (C) 2004-2006 thomas musil (musil AT iem DOT at) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. In the official flext distribution, the GNU General Public License is in the file GnuGPL.txt iem_utils-0.0.20240903/iem_adaptfilt/Makefile0000600000000000000000000000306514665566711015452 0ustar00#!/usr/bin/make -f # Makefile to the 'iem_adaptfilt' library for Pure Data. # Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build # settings and rules (https://github.com/pure-data/pd-lib-builder). lib.name = iem_adaptfilt ## iemlib.h lives in include/ cflags = -Iinclude # special file that does not provide a class lib.setup.sources = src/$(lib.name).c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) # class.sources = $(filter-out $(lib.setup.sources),$(wildcard src/*.c)) class.sources = \ src/NLMS~.c \ src/NLMSerr_in~.c \ src/NLMSCC~.c \ src/n_CNLMS~.c \ src/n_CLNLMS~.c \ src/FXNLMSplus2in~.c \ src/FXNLMSplus3in~.c \ $(empty) datafiles = \ $(wildcard *.txt) \ $(wildcard *.pdf) \ $(wildcard *.pd) \ $(wildcard *.gif) \ $(wildcard *.bat) \ $(wildcard *.sh) \ $(wildcard *.wav) \ $(empty) #cflags = -DVERSION=$(shell cat VERSION.txt) ## build a multi-object library make-lib-executable=yes ## suppress "unused" warnings #suppress-wunused=yes ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # This Makefile is based on the Makefile from pd-lib-builder written by # Katja Vetter. You can get it from: # https://github.com/pure-data/pd-lib-builder PDLIBBUILDER_DIR=pd-lib-builder/ include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder)) iem_utils-0.0.20240903/iem_adaptfilt/VERSION.txt0000600000000000000000000000000514665566711015667 0ustar001.02 iem_utils-0.0.20240903/iem_adaptfilt/doc/0000700000000000000000000000000014665566711014551 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/doc/adapt_filt_lib.pdf0000600000000000000000000301231014665566711020203 0ustar00%PDF-1.3 %Äåòåë§ó ÐÄÆ 2 0 obj << /Length 1 0 R /Filter /FlateDecode >> stream xÚÅ]ÛnG’}ϯ¨G `÷äý2o³ã ½6¤Å¾ `Pd‹äHìnñâ±üõ[]]Y•‘‡]›+ì£XÝÕ•™q9qâħî×îS§tÿÿ+)¥ê\«ä»¨ÂÊÚîvÝýo·éþú;Õßurø¿»óþ¹Òöðßýÿί¼í¬^ÙØÆùM÷_o;wøëñŸ·7Ý_P+Ù©îíûîU÷—îí¿»ïßö_¿gôÊyaÒ*Úþ|§ì*Æ¥_?ÞÞYÓ?³TbÁ÷«Ö÷wôýâ©ß'ßøýâ)¿-€XúÊ™þÑ»Ü*éq¬Ú_‡ ŸúÃ+Ox€þãÇn¸¾ÿG°øex€ò'ÖòÕwÕ%/Ægž\Qi¼çõu})¿ùÕ»ÉÑÿ£¯ÜV÷hïÆ+gÕ# Ý#æWL~ìÏõ=ÁŽWþV?·Uñð>^ý½¾ÔxÓEuÅ)S=œÈW\¾gWß“ò=÷Õ¯ÂøNëçMïù½¾òO]ϯˆ ó:Ô¿4èüi?ÔWèõ O &WR¾ò±º'ª¼@÷ëúR0bºªË6v}²Dcc› Vý¯@»>YâI'«y´Eûdiß[×ã0ž,Ñ8YõK‹32œ“\½Š6;q!Ÿ«»j{h™ï¹ªOœ5í-ÕiÚlÕ¯1*‚ÍVÎâ;‹ý=beS8-Á³^³g‡+É â4z6gÃxåÇÊ‚x™?­¶ˆžÞõk~®F‹Ê-_Hù®óz¹µ­~Q6!Ñå§«ßOL©½ª]«?ítÞD»ßéË7üðvÄ3`<ò"»ó!š Ò•¿Ø™‹“ES>†…ßð"åOŒ7ÇÃ}u%ä½vµ½­.);?¿nxßwÔßž¾Òâ± !Å…?T<=hYbÛûb%—¿iñê§ê¥Y;sÊå‚÷3ADÌïÃÃ]½NϬÇä E&?[½\)¶u{]ݤ­¬”®¸$¦qÁäJ˜äÉ•Êè•íaT~ìMý†,Øeý“LL£Iþ׫çÙQ¯ªVƒáX~~6ý»óå³àÕÅyDU.¤0þœúÅ• •8òW“'—è ^þVŸnMÇñ-[#=šäߨJÖ¸ü“n&Wö[̤¼°¿}Wï{ºé¿ë+1ÑÓÍß©#Wû[}Zœൺ˜Ý¿þrêÀÎ¥Uâ–þSv£™÷iµÜËœÐËeã·ôûßÖÛƒ¢ºíM½³i©Ïñ2¢²q Y?Jjó«)‘bÆTSøÆì"…–+K¦)idÖŠÀÑZM.é+ß°“•{:KŸw]½U«òQ`߆¾£ì·Ú’9ÁÁïwMãàÖOfÿÀ¾§›êƒ¤¯ž.¿Ö`:ø!ZpðCÊáå³~3¾Tö«¼ñÜ;¹²_1º4ýO‡êÊ÷‹/úþüóe\Å8BuC´$ó?Ut¯VÔ¿q³S*Êò"]uí²V”ʇwS_¡„íþ¶¾”ò‘Ú^L.íDû8KAËM†Ò¼óúŠ)g@̯PZv]ßCñÁvS/xÖöèíðŇõé¬ÏËì—öI xÎþ_€ø²ïÃMùûÅ2¿ØÍübeqEˆÀ½P ÅÜ¥²•Ÿ ¤Œ æ|«c0¹Õ¸Û·ïk§¨Qî¡)J½¯\•¦ƒxÅ|lL €6²¼Q9Òü»[–Ðæ×°ýwõN‹'­ý›Õó7ÍÚfáæ$²0±tâ®[¯hýV'Ñ‚;ú­÷UäïèuoYŒ¢ °Syÿ”?íÚÁzãÀ‹ó.ŒîsQUÐ ÄbÁ;°UCHUÀUœ¼W¢ 3tirE£|*ÐÙÕI7½º_ê{}¨wI¢ô¡~­)j”&®(IQK%Ù † HW¯:YYNÅŽg%¹df@ È_óëïÛ–¯–Ìó¼:7½5BÇPÏÇĨ$Pnl<ü@+sI¯ÄD9ÛP§ƒªLR+]{…G ªoO­&·/C,x€1[eûÏ¢|8A~„Á„”Œñ9sW°0E·cx¥Þã MXEÌ€&ozSÙÖ‚°„ÌTæýtጱÄKâ™sæš Âü½ë÷ ”jjN~~5ÿaû& àÄÃÓÑáÕ•Küþ­øõ”×G¯N/Ik~aÇ C ·,³?&ñ˜i„³§oÓ÷ÑÚDjiQÔ¦µ€…6 8CM'þ»z«üã/ÿh€&&§ðï>³pJ¢÷`u˺ˆYØVG %l»†aÛ»Û:6Rhc;ƒB çri…ý"G•²ú{Š™¶›:àôч2€ß4Ä`¢ ¸ t6 qdèëO´ÐÒû4cL}€Z¢÷zË"*P.Éy°´) í•â, ˜F#’¬ÙGæ¡È]ò˜LùÔ\³ÀHÂÀ® W7õ“¨ˆ* ý]¹Q­ÕøïÙ%âgðÇ×qŽŒL/fñ‘aFZÆ `­ŒCÞG_zÏã3:XÚï,@°{£Ù.®X!ÒLhî¦~ §=pë­Q<¢¼­_p©¬zû!g$•ÿÙ%ƒ4h]ÞÔϱ}dx‚‰h””ë‚]K´Ô»Úöù‡fO%úÈßyX!󓜺F<ÆvO \W¼¯½72ãÙ(ëÆmÆŠa ™iÕØ{b°‘èe–¢íå Ö[:‰Tz$VÎ+C#›ª¡ )Á}óêˆì˜‘¾hŸã,9d>J&yËÊ¢aFù›†.=2%ûÁK°dzTÝ=¼ûÈ`¢Þƒ#‹rWG!ôî®dóÇ1,ÈÇŒ=l.Ö°²Ã`‰¼T$Žã ÚA1k ¹ð^›ÂbeV'&ÛêCÞ° âYlßÅdÛÑ&» Í\G<ãû—€!ã÷«£6ñ…x;#Ý<…UðKJzUUV*Pma IÊî¤D|âõú–jz/Ækºrså.M¨ÞýU]õ |âÕÍÝËL—¿Ò—)ŠÚ¨ ý+TE÷á$üòÙ~ª½Å¸;T‡w,Ëvÿuå_”FTEtÙ³<8ê(1U¾o§ä±™›•(—0*ÛvÌj8c.˜…Ùm[ 7þ„ž‘Õo\vÛÌÿ!ØÃ’o®¼p¡8Žhwg H›£ùS©Pò浸ÌôD®;ÛÔûÇF2•\ÿ ó½ùžO,P,iQyXÊÍ™ÃNhC&eªhæ/ªY,‰ˆ9Õ&I ²†$¡×;viŸ]‰vÅÅ¡PHI":þÎ’2…ž>#žõ3L/ù¼º<Ö¸RŠÞ-Ë• Tºæ €DɦvùupT’MžQjÂf9»ŠH6 ¿“%›ƒ-­Ý©,í¥ÔžÅ‘™•zWÃŒ‹gö@-‹¬³ûf°¯™°¯š¹Ðaæ‚E@á!?ñ²‚!ÊxtÕý4õnnÖª2M<…_¬DQr§P™ß.]ÛCnùê¦Îî$š¬Féª%úþÝ©éîÞ AÞ " Ì–A±Yd‚“ApÔ»m5ŽÃÖ‰`u´Ê‘oìT6˜_{ÝÂla‘Žb]˜–‚³àå‰5ßà·Z§×-h(«ü9™¤â´Cäkªƒ\1ÁôßEðzjUx_šBa¼…ÕùÆš†fTRJ*ŸO\ä5VíÔádá"¯y1Òš±C³Òôh?Þ€ÌL¢m,ÎÜ=Xø‘ÝÀ??f ¹KÈCƒœ7Àö¼:½ê]±X_YôqŠ6û5‡ÔAÍO%Pèš<Ìå-ïËÉçà‚»8^Æ:dÆ N”¨‚À²8k¬F[}êZŒ¶®b´]ݰü*¼«sÒïé«/êêj@T(i!ÜŽÜSñv/„¨h³Œå^7"(T3(ó%/÷Ÿ×…%‚‚/Ö-Ú‰hæLTìg5øRR}¨kÜÖ¸µ‡·Q œ|CN“Ñë aˆwup _„¥q¹a„ˆPÆ*ºŒ.…A\Zg3ùo{ÎŽ#ª{¶ÑH Ø'Þ¡×ûŒìp–B0(ÒDkÚí>Öv]¡03Ltt…z!xM¡yZ ÂÂYI¯usÇ8 vV‰˜rdw’1yÃYv(*•_n¸"ZÒ{^ ˆh®¬BN.{Æq=æ*&óJJk ™¶' BŒ‡Dˆ eÁ6å(ôf˜'‘o.%» ¡g¼WÌ$ä¶,Y²+TõmÀžÁ!KFu†z˜uÓ™0“t›Ù$Ø1!¶‰Z!<¡ÂÛw DYUÐHg¤4ÓÃò£¹NÞ´z£æ{å„·8´%5v¾hŒ[ ¼oÄ¢¹rˆœ"2)]´g›ó/hU9°‡ž‹Ì&¹Ð5½T¯ŒYÖÿÿ?mß[÷hÔt šˆ‹±zØœcÕ(êh ÐPm5@ÿ Ýô33pTÆì@ÌÕ™éˆ^Õ)¢= †ª#,æ"nà #Ú–nÚ0;)Ákp°ÐM:ÐçáœR…`ßä7Ü+¯x£@rçm<`æ` –ZȆ0…Hydš.—öÖÆB•æåÈÀUMİœì†1(w•Ì’‘t˜n" 0¥„ZdRE”¨`ªÑǬp3î™.›u²‚Í:Ö‰•{©DÓ[uå·ªØj ¸aО‘9;«m*Ì •Dí\j¢&j, ‘—<"«˜€=Õ›0ο¶H–©´<ý‡n„€ç®&ÁÞtéf‰ªi¶zεÐx%- ëSkNf=‡ÜÆíæ÷šÃøHd ;Éš]Ö Y±©,*òU%à„ê.rP];œq,ö`­)˜–¤±èk¦C²­7¼þ’Š÷rÚ¾é³U³ˆ¶Ïj7Gñe%hÉoÐ!¨F° ³º0*½È ëÒI)ú¿¬éÝgZ§æ$HZÖ UÞ,ŒÈÈùpí¶«3v~a+Ú#¢/ÔMÉ2廄Z¡¼F6ÄÛ‰ aT>›qf–?¹¹©˜õì0SAÍÃ…1 4,‘¤;W(°¨¼œ|9D‰c®Ò*Ì+‰`þšÇUBЧ|ÃÒLË?j²ÔH#z‰†à„Ì2* CA¥‘.mQp£Êï¬y8<Í".†L°CÌÄM"€ ª o\SâHãQeZÒ’±;µnˆT°¯f ûí‰)eV (ÅtmÄ£°¨Ì#¦ežs$\ÂŒV@í…èÀJtu *pv9¡kÔ•X Bt2Ý‘©_º;Ò^¥ïèî¨!¤©ƒJ6"(·5rÖ 2H•k-TŒÝóZ¹Åãñ— o*­‘Ï5*zÔ~³¨}oxÂ%QU!È?0tKÁ–iXñ×6·ÆsÕ¿ à­»Ý`“k z^†"Ø‘7”Á±pÎZÔ‚ma'¼°«¾ôX±Ò¥; OµÆM.’I áŠ3,¦Å”µ2¤ÀXŽ·Zˆ‰%”DEˆ· ˆ+.@Ù!F iTÈïNÜǹ¯öw-<äxÍ/- Æ°g5ß¿ÄkãJà®N×ÍLZö„Òvò\}eâH Æ,O`h“Ï"òóˆj6™d$@ÐÆ‹9®N¬‘kìÀó?òÆ^ZBÙ¸}ÿ¿x¢t{£ÑK,iôÊK¶áïÙgjÛ DûXæ¯yKäˆäXD±ÔþÉ6Z@堄ɽ½fÞ*ÃlÞ‡F=·–õéR@9,Äßå„\9 m:ú=Ô¸a€T–„Bq¯j}ÖHÎÕS2ô™k… ‘#AÂä=@íÓP¡¡Œ?:c½ÏЧ¾Â1¡¤P‚™LiLr ÎyÛÐ(Ç=tEƒ,×ÖcìÀ& `ÃQ‚,õõ ž6P¹è5Ó+óŠjd@Ähcœ€ü+ ¢”š;·­D•Oe•ƒze‰ã)K!Û7Œê‹%½ øSOp}9 8 †‰rô£™{PÞX<£È! QŸÄ“ħùˆË+Æ+缡rŽŒšŠ¦°ô9I8ÁI=¥"»ýÈËèwäœÞ™ÀôJnZf/·qƒ•«GúãKØp†à«Dk‚‘ÜD‰|€à&C·Ô¤¦ $*Æï BµeM æ¸)›—ê…:c$zqño „*ócàéµ1”Ó°zX0>)ÌHPSÊ›„ (ã¼Ë61 tí2®r ̃¥…ñϼ=%Í,BðPŽ>pŒ¨:‚þäâ((B0d3ÉÂvyz¶í†32 ™—˜w,-jèCØ"a|¥”2Hz¤¨Ñß4Ä葚{уà½Le,/¨8ƒ¼Mär¬ vÚ”™¼½ÈHØØi-²‰¥»ˆ³™úAÍ 1k‚š±Op*³†BnimçÉõ3¨M̽ÀH¯vTNÐÛãlN¢•1|;æÁqcY”°ÚmP;Wa v ¨ÝP¦— ŠWºJŶðXДlô›ëMð¶oý² ªF‡•ÒK ¹ ö{Ð0Ø­2íwöQ$÷Ž“‹ÌÌšqÜÓÄ$£oý èÛñ×ó¢ªAF™Eƒ%ö‚^¢]ý¸¸ÀÁͶˆ¼Wó B°D1eí—>Ó~©¹ƒQÞ=lÏÚv¬¬‰jü†¶M² °’B¬s°IjÃÄÁ&TÙtpŽciéz‡(Á\‘ÉAb¢§ýϺÊ—z%ø|DØU„B·A£òf°y¯² Á»dçLƒ3f°Éë¡dü,¶äãb(?ø×"WCoš³Ë4äš’Ëç]ºp015Þ7:šP¶¨=,æ“Ë¿æM0hD1Ûá@Á‰Ø‰TðM¬å6 *4Mÿýû_3ÂEjÃlÂ,û’ô;\÷¬Ï‡˜q9A[NH“ÀIç†Rƒ:½Ë˜ Z§"laÏÄ~Áù£Òñ0 { ž–g¼L„ ˜´kŸÃY4ÑHɘâLûé°Ïï&pü‰¢†D§´P¸ñ³i‡,í9Н6׌ÿ›—âÓÃzi¯·(ÌŒFS7ôR7ˆÁUH 3‚¡?Ê¡œíÙÃ?÷:fâØJ”X:5ŠY7P~ÛN“ašËõ©…SÜßµtÉ%<ôì€þ°GÖ"BlÚš>°7”´_®Ÿ0*W5Y¦]ÆÖr›D:¹†J\w, ­khl÷†÷3ÎrårËúÜ`ë¯F›ö“0Ä©ƒCœ®ù M·‡V=°e*­¿ˆó, M2Û‡—6 ÙçLØd.TDÈvä¿.N ɰï#žžÈÇõ ¿=u#³R{ņI3ps¡!€Õq]4VÚ)Ešš‡§™‡Ñâ4Ò!þ¼h¬LD·1%$´féÙ™xV@²ç!r§óvCØ!tt Gû %½ÉâKH°§x96¤M,:nvg¹²ÀÝlêfAwlu üØre8Ù®ZÛ€œ‹ƒ%$§2ɺrœ‡rµ¡.ô FfagÓ/äêo8†µ¥Ð$/‰™zÚ—PÖ[Äë®™\e§éF1æºÈæ’U¤f"'o13'R'À›”ø²Ù¥JTFYñlÆÁz Ù,7¦¹•ñ,!È3$b>O:–x>²vp2ù”†@ݼ N4©) ºçåYÇ~«"}εæ¦ã-ëæáEMFª@ ¼ðçCqÉÉ$ M.+º)\ÙË!Ý{¡Š@ƒf'TÇ"Ë ®"ÀY&dW.?3mÙ2“ëÃQÏðæ1.É‹äìaéÀ˜³7:·€5L jÉKš-ÍÙ9LAçe ì„Éq;$9p<¹(å9¨?µ;ʘší7'öÞ¶_˜þC–»o¦ÚóäQ0ÝD¤¹.chL!@â@BEYL!𨩗šÿËè~h÷ÿ±@žòö)÷/>|dïÔ¡yn ’ ûÀ[´³Ê¢8zvOÃ5$Í4 )ÚÛ;ö€†Ø·g\& :0˜¨ÑÚ5äDÜÖhÀQ(rôž Giè–D‹ëçVfÖ ˆªŸ¾ô«r,Úƒµ-§œ€tX y{jƒU«>bƧ¥=E­Q›¹F툵°pŒ:(Á°+aÙ´G˜‰ˆÀP˜‰\€vÔÅÃyµ?tÐ0ãÈ;çbuêHú ë&žÓù…%„ÑÊZ;•_Ü9a›"Q³¹bGªŒ1€õu2Ëø`bö3ïîÜŽWÔ:†Eºò œTÆu’ ªSGÔÿRÆ!0n‡°ªZ¶qK»÷À혎rˆã nâ¨ÂÌF—HH-k0ˆ\ÌT žo ™qaŒ–¸êg€ùX7 °!BD#Òc_°qìÖÉon؉@@ÒP ’ì劉ƒ‚[ˆÈç™J“C6«yÒå(Õ8´©É0„¢(Ãé¬9^¡Jtcî*‘MøsjÚÒÖR"þ Uç6^<7«ëLˆ¢2°ÿï]ïZ§=Úõ5LÚÏF?|ÿ³<Oùýj¸—ý~±lJùa¯)å‹eýƒ—Hò†ç ¹B­9ôqï¡R@=XNÃxûˆR€h'ÛÈréÓÀtßP þ¨$ºÝÔõP:ÝÊÜ{^]5¢"xsÆõœeõ[kø[Coy„DEÃ'*0`¾BŠœüO0çx5mjOUÄœÿÎ0~O4Ô¸c›ÙùÔ€}GŒ‰Ã¾¥uíŸDÓœ‚÷Tl\b.À|Ûýxq5¨™Vî3`&Q9 u Ú›Fr‹F2Ç\'UvئCªŽ)!I @Þ0S†¸&ôýèó'Ïr }úÒÄñ—vò6q•Z³3ųÝSæK©8@È €Å™\KÞFÌ39>ãÎ?×)/´{©C½‡Ðä57hbEêó68°~5J¯89S:¨™‘J›-îì sáJ¤ÅÓai76íÀkPäµTÚ¬¡(›Éê…ñ‹ÅI ¢ûnø~ñ–?À ª‡Bº ‡¥ÄC]Éž¯¡’ÊE×šÑ ÚJ^PŒË-ëzG•Ïa\COtϺÞ-šñYz Vlع|Ñ®wå‡Ép Öûûúç?xÞHâ‡Å¹jð QxCë-Cª£…É:Jð5E,T1H­^;¤ó°¤-…‡7ó>^1Ý:ù‹.Ù~£=Ïz·¬ @¹ÎÒÉ»âüTu 1R”Ör6¸¬(ûñ¸Ì[¤ï¡2¶‡J>!*r F’Ífì,.+¤çw¬ÚrÅ1N> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F2.0 7 0 R /F3.0 8 0 R /F1.0 9 0 R >> /XObject << /Im1 10 0 R /Fm1 11 0 R /Fm2 12 0 R >> >> endobj 11 0 obj << /Length 13 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1416 152 ] /Resources 14 0 R /Filter /FlateDecode >> stream xÚ­Õ±nÂ0àÝOqíÔb|¶ïœ ]ZµC7¤HJ—¢v¨åý¥šâ lÈ©!¢|±ÿ‹Ï˜ÃLü G$ ¿_ðk˜=m-,·Ý¶Ëxv‡ÓÝÏîÂå [hXug†©«=chW0{ñãí7T7hà¹ížuA«)p‚H›=g!ÕAp€ÐÆoGpO|Jv‰=±¨$FÓ$£îµh&d²ã˜Hky¤H$†3œ›Œ(SGWÕÕÿOÕûBª÷eE^×^!c„‘d ¤‘dÚ #95˜0iýÞJŒ€˜› Š ºFijÌ*Z룆 )-`”T¸`P=¾Âê¸3:Éø — 4<¾ÄE]v$¯2¤ ¹†t'B,ÛŠˆ38²¿ª)jL\jË×ÞòÉÄÞ÷šŽé¼s¶yNU7UÚC´ƒ8îÌt\0UµÉ˜ÿ2à¦^ endstream endobj 13 0 obj 353 endobj 14 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 15 0 R >> /Font << /F7.0 16 0 R /F5.0 17 0 R /F6.0 18 0 R /F8.0 19 0 R /F4.1 20 0 R >> >> endobj 12 0 obj << /Length 21 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 2400 128 ] /Resources 22 0 R /Filter /FlateDecode >> stream xÚ­–=OÃ0†wÿŠƒ©êúüí ,•"±°ÐhF”øõ$¡#ÕMu„$’óá<9¿ïÙ—5Ì` ¢Ú¥Pzx€[(`zQ*ÈËæ™€2¯ºas:©›ºc¾‚ó ‚eÍÝ`a¢¼ƒ²L¯ÇêìF'cÈžá2k¾u‚’g#[ô’XC‚ m}õ‹Àñ}a¶ˆª­”bñB #` C¶ˆ»i(Ò¥ÆRÎ'S R‰‰¾œQ Ej0_c”ñÃQA·FË0Ø¢½qÚœRÆ&ø¡ˆj¥êˆ‘”@¬ ÃÓ̉Á‚8gbªcAÄ+üc–u!ÕÜ5j‘QãÝ?djHÏ;R¦‹ÃÝ AòÐÍ×hÏü0‡íJE\Ñ„&Ë’¢xª. *²0)Šu) ÔÛçr³hN:Dv šF¢qÉÊ3˜,ÉBªMߪÏzêz§üˆä€œóšÃúÿ"Çˤ]×4ˆ×\¨¤ÖËâícåò©¸-Çl§õìrµåä endstream endobj 21 0 obj 399 endobj 22 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs3 23 0 R >> /Font << /F9.1 24 0 R /F12.0 25 0 R /F11.0 26 0 R /F13.0 27 0 R /F10.0 28 0 R >> >> endobj 10 0 obj << /Length 29 0 R /Type /XObject /Subtype /Image /Width 284 /Height 238 /ColorSpace 30 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xÚí=Žã¸ÇWÀ€R¡CBÙ;BCiÃЬPy' p¢Œ©à¨Ã—p8±‚Í(zÀè œ-fž?d‰U¶È’,Ïôî1à¨-‹?–Ȫ?‹œß¹Œ”ßÿà2R¾ÿãÀåna6̆Ù,ÍæofÃvÃl˜ ³a6ٰ̆ÃvÃl˜ ³a6̆Ù0öoØn˜ ³áÂl˜ ³a6ìß°Ý0fÃl˜ fÃlØ¿a»a6̆Ù0fÃl¸°ÃvÃl˜ ³a6ٰ̆ÃvÃ…Ù0fÃl˜ ³aÿ†í†Ù0.̆Ù0fÃþ Û ³a6̆Ùpa6̆ý¶fÃl˜ ³a6̆ û7l7̆Ù0fÃlxg»a6\˜ ³a6ٰ̆ÃvÃl˜ ³áÂl˜ ³aÿ†í†Ùü»Ù„Ìæn ²©M3››’Tõ±˜ºÞE³hL}-UÄl@Ñ›úý»ˆÚ.¯l7VQ€MÃl¬R6ŠÙØlŒÍ¦`6V)ø-kÀ&b6vÙýfÃÍ6Qգѿ‰_L×o¢«åÈß#àœkÆro´Zs¬ùÛfÃl˜ ³a6ÿ,ÿ†í† ³ù4l¢¸ÉÒ! EÓ¼XGª>tÙ&¿#›ÕE3¬²ŽLq‘ÉòŽNt•‹I!lŠ4rÔŸÌ&É¥Tbxb!µ.óÕÄïX÷Š¡<“Ú÷á|t‰ïûëß&X¢<ê ¬—×ú*×Õ×2ë3*`ýA6aן•¸Ô_uׄ|k]ë¤ûº†Z‡-D·Ô›¦*¸Þšúü/U·umNÿ`^a³êûÓd¨Û)llM¬N9’VžhˆýšXŸˆÿ©®`ÕtX¿±ú·NQ=›0Ø õ‰Ê®êÃa ®×Ú?¬œYmþ&kiÇêMýQ»Éj«/>NuûyèlbÐvÕHwfE|]Sð™ì¦nw£Éa·Ò—HÆÙÀõ¨ª§d6-ø\›q|Çô 6ðž×ðšVìýãl*°%{Ô7Ô’yìFÎXÛk¬;TÿxUƒ–«ëàa6M½ãÄ„õ©Ä5ÞûpƒìˆRÀx^—¸ŽX`6_fó½Cp\3ç©¶ã8g¶JÚ-ac[TÏawT\˜Bsk;g®Åþͱí¡õrîàšÔ{âVÈÖPý+{÷³–òÇÙ$èþ‘™…‚ %UÕSy|V­úúÛ©¾WSuF¥)œUÒªRËv~6iZì>ÊÖûUS Ðd=õq&é7aû_c*åó‰{=&ŸG&êFãÒsqJ–úhGù¤ùûÖ!—ë\ª‘ ðo2¢ÏjfŒ5àó#o•„:‡Ë7Óßm<—ˆ¾>•ýî?çÆwãÈûSnäùŽÒúÉš¢5ÒíF5ŠšôŤWj쥂šÄÖîÃV?ÎÆíaŽ3šŽQŠÃ±_†âp·4V/ÀÆÐ´K9Sç™òyŸ^ƒ®‡?íj̵ÝöMdîù´vÏÉÒvÓÇb Ìpp(zNäî§ÀÔÎgð]ŸÌ´Ùõª¼XzÌœ„Ò”°OK9ÇZ8§¦žëëŸèû ñºž·;è9£;‘¬À{üBí–²¾hJ[¦äߤQ9‹ÔYiæ¦!_â}·žs¹îóïCŠ‘¦û®Ï‰5wÆìEǖíýŸO•®´£zîH=êkø®þÕù7‰‘ûúzµœFqÖeÊœ`7‘hâÔ³x˜ƒÍ{¹ÛZù‡$Îì†$Rï?&çk,]¦°9ë*§qVyT¢Õe0¨:1虯1·ªë ".oÿ5?$ÜuËÍÎq-ÅVeÑøû¼i%Çý°4—ª]J¿±tÒùƒC¾ÍŸÈ“Ð+ír X·~ípÿêW»s¥të7rýF×Ûíõ¨ÓϽÂú+v›-GÚà| åÖËÀÙ=÷ûqX3YD¿ºŠ·½±ó$<Ùõ±.‘»¡˜YPb›КîHvw-¡ß´%-¨®ëäεå‘W¦r¯¡·}miý¦$h·±¢ÆõçQ”(Á¸cìs‰=ü^ÓÍPÏ­CáÝÿlÒ‹þÇíVïgø7å‚À d•sbüÞâ³9nrb¡#ʳÖïYÓ4)jÜnà¹%/7qxKÈ“ÁÝésÚuvÄ1øi øŒ§ôõý¦FûßpþMNÈ“9àáã80í—eü,ÄñÆ>•qX-i•ÈÁfXºížY¢7¨­ ¾ýYØ}8#óbˆë9…}Îÿø a¨ÝSðà²ßßCô°~vwècÄëzxŒ4ÿfÞtÓÆÖ°ª8{s#µþ¶ ì@°ÍœÚb€Ÿ  «7ï#Niw$LÕ̎ãF);/&Ì£XªˆÍÿdex¶›îh•c+Èi«ˆ*>ƒ~óÏ,̆Ù0fÃl>þÿØn˜ ³a6̆Ù0öoØn¸0fÃl˜ ³ùlž[‚î÷å{—Я›?&Üqä§í?íßžòýZþæ¿ñß?þÐÔ(ð endstream endobj 29 0 obj 3088 endobj 30 0 obj [ /Indexed 3 0 R 255 <1f316d1f3476233a7f223a7f22397f243b7e263d7d273d7d273e7c253c7e243c7e253c7d293f7b283f7c3e516f3f526e3d516f2b417a2a407b29407b2d43792c42792e43792c427a2c417a2f4478314677324776304577374b73334875344975354a74364a74374c733b4e71394d723a4d723c4f703045783d50705a695f5b6a5e59685f5d6b5d5c6a5e5e6d5c5d6c5d747f4f606e5b626f5a6b77556875566a76566f7a536c79546d79536b785562705a637159657258667358647159677457737e50717d51747f50707b524b5c674f5f654c5d674d5e664e5f6645576b40536e41536d41546d42556d43566c44566c46586a46586b495a694a5b684859694b5c68424d73424e784f60655363635766605464625565615061645262645463625867605868605f657d75804f76814e7d864a7e874a79834d77824e7a844c7b854b7f88497e884a90973f979d3b92993e92993e949a3d969b3c969c3c999e3a999e3a9ea3379fa4369ba0399ca1389da238acaf2faeb12ebbbb27bdbd25bebe25bcbc26bebd25bbbc26b3b42bb4b52ab5b62ab6b729b1b22cb2b32cb2b42cb7b829b8b928b9ba27a3a735a0a536a1a535a4a734a5a933a7aa32a6a933a4a834a8ab31a9ac31aaad30abae30c0bf24c9c71fcfcc1bcbc91dcac81ecdca1ccdca1ccecb1bd2cf19d0cd1ad1ce1ad1ce19d6d217d5d117dcd713d9d515dbd614d8d416dad515dbd614ddd813ded912dfda11d3d018d4d118e3dd0fe4de0fe6df0ee0db11e2dc10e1dc10e7e00de6e00eeae30bebe40bede609eee709ece50aede60ae9e20ce9e20cefe808f1e907f3ea06f2e907f4eb06f5ec05f6ed04f7ee04f4ec06f6ee04f8ef03f9ef03f8ef04f0e808fbf201f9f003faf102fbf202fdf300fcf201fcf301fef400fff500fdf400c1c023c2c123c3c222c4c321c4c222c5c421c7c520c7c61f828b47838c47868f45848d46858e46808949818a48828b48888f448b92428991438c93428d94418e95408f96408c94428890449096401f37811f3782203781213980203881203880223980717483717584717482878991a3a2a6> ] endobj 32 0 obj << /Length 31 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 31 0 obj 706 endobj 15 0 obj [ /ICCBased 32 0 R ] endobj 34 0 obj << /Length 33 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 33 0 obj 706 endobj 3 0 obj [ /ICCBased 34 0 R ] endobj 36 0 obj << /Length 35 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 35 0 obj 706 endobj 23 0 obj [ /ICCBased 36 0 R ] endobj 38 0 obj << /Length 37 0 R /Filter /FlateDecode >> stream xÚÅ\[o7~ׯ˜GØLt¿ì[7ÝÚl‹5°/ Çqìt}‹]g·ûëw43âŒÈ¡Ï{NŒHSII‘)q¾4¿6_¥»[)¥j\mòMT¡µ¶¹;kþÕ\7¯ßÜ«æô¾‘ý?÷§ÝÙj;ü½ûá|ëmcukc7ÇéUó·ãÆ ¿ÿ8¾j^¿U­lTsü©9j¾kŽoþ~Ü-ŸpF·Î “Úh» |£lãÚåÇá5ÏR‰ëë¥õX_ì»~œ­?ì_ì³Nb5½B°ù/hÿbaý÷G=* ?:Ò-¢8×H‘)Ò¼ÿnÛ‹‚ lG×&Ͱ½,6ñäõ'± ,6/[£÷3[±á¹ ¶ÿcÅú j¨­§H»Smb?¶‹Új¶Å³­½[_ìcíÝ¡ jÏXö/V¬¯R+W›xòú›q}éZ¥_îØø¤ò }ÌV¬ò6ƒÙ:ÞlÅ“NÛh¶Ûbÿ õìc3Š-„Öé—;6Þ›.ʽܱñ6e5¬86{©Álü`6â¹ÖÞ dn6»Ù^›Ø,HxãWÉm͸¾Ö]O R•ÚÄ’ÚÂ^ØB¬;í>Žl/‰MØÚÕx%TTK Vœx½DÍ€¶¶•ë%°áÉ5Òg„°'â;#sFQ3`UOÿèÐÀÀ÷=ÓOÌè–> ‚3Í2!ø‘ÐAô„X ‘ A#‚‚ƒÛn Œí÷z¹¨Q1â×mVc]kü üŸ ñ,: ÄÎ4Å.°iΕ3êæM¯›™ÉÄ‘pƒM&„3l2aÌð>aË(k`‚’Åf>Ï(¢²™S<Æ,é)6gõ^”/â‰e̘’¢X6t-È Q€·"4Q(.0èP})ÉöAx3²ìçSô¨ó£“š" (ËÍØÄðf‚šsëÐÌ+‹K9ǔާ.IÔËðf-ÕÜà‡¬ç‘ EÖØ :Y(‘…8—åÖ8[Ö¹Å_²f¬³—Š~¾" ñpñ¹òF2;õVŽòS¼a8ð¡HôYˆ׎÷ãSäμòsKœYH®1Á*Æv‚×£…œ?CZZ›¡Ïu~ò ¹® æºúÀ%"S«÷[~Kðï‚ê—»–'‰8/Ó ˜sƒ†Ä2ägœG˜2ä¡WòŒ§æ’äuœ˜Q’s;ßxw°ÓyÚN½ÚØd•’s¥í\ÿ$#úŸè".p–]Ǩ‰,8¤Y‡›¹2eåšf§£L:æj.Žû23­ŠÑÜÜmá“+9»å<&xW›'x&ƒØ—³³Øÿ|õúoM  GL´šÛS„ãŒ,M×ÐjFxyò“¢Ëæ©•eÌsб©y˘§/ôûGeF$ð¦~Á~ФâíþYS„ÕŠá`BjßcŠOóý̪36ànI½M2nuWXØ.æ¾b™z@q8J¤ÔŒHi6¦Æ¸sJt£L±ñ)1lOxñ&„0lXÁKFÚ!·7ÃfB 111BêôÛL %§Áö“ÀN±ý$0ûŸ‘LS²Ëö“Ý50¾uõÝvH.®G‡¹!u®*¾?rCz˜â·³²µqM5ðG®ˆzÍQ›ük(nâ‚ø=¥9k&‚¬-çàŠxÑÂÛ>pZ{±|à´­ÓŒí4­ºŸ{FÒKš~µ5,Ð}Ýu½ªO‰ÐŠÞNˆÿ*Fp}†¯Ô 9#¨É95éÑQ.ƲÒíQÝt‘câìÊ(Î[Ü×ç—ÈæLLL¶ŠtºøÊ¹þ讜«Àåü–¹Ú˜Ê8H{SÒ |’½SŒûõ€bÿ“%@±£_ž£¹(4žXAñz(l'Bs@W¨Î+SÚÜ“Ä;n*wÈ“é)ÃÄc|b6¤£)Bb%Ɇ¦œÐ1®ÌøÂ©¸TÖŽ%ˆ,¸B L FXð³çX*w7ÿ!Ô3½WEÞ ¡Å]Þ Ø!|â’ð$A°¡Ðì-±T퓊W>%±ØÆªˆ€â?!LAàŸH•Äp§EN·p(èjÎ “5Œ™LA—ú2)-[ªÑf~-ªàÊò$ÜlÓZ¢ÌMCÖKO‰ËכϘ *ùØÐ8i¹ŒG'ÃT9”‘Í­“x 0ùñw2lʯh-|Å,¢4 ¥¥+’EDÇ–eacÔ œõpž³Ò.êÖIí\1.Dïil-6üpJhaäb!Ûa3ØàëvÎI”,‹zgûÔjIê«%cH»®¼ÚºZ"e~¿ –rè½SX1Ka'»Ôl »}¶{\çºIb\óBˆØpqI y²’\ˆPºòšî-cþ¼gË,™H%˜b5øà+‚LêT}»·5Ýæò³¯õ2% Šüa<ÉBiªÏ¾‰IiÏ9ºÙl‚Ñ‘3<-¹¦…®È„ŠIÔƒ!2 =Ë1alžƒŸÿý'©—8FKáŠb@‰é ¤_Ÿ‘\§ì ³à%[äWޱyoØ8å—ùzHnIM$¦ÄÆ|%–¸ˆ†»ˆ ÕÑZAB÷äNœCµIrRM—]SDWäðÉUtˆŽÍ’¥â LIÈõ>\’;àÈ^õN÷Ã-æC)¶l9=%;¦Õ’Y•ß*ËúcHP®ñå‹PÒüw´ºÁ]¿t¨ÍAiWÒ„“ ¶ì!” ‘“~®ÙÈ ›Îe'3gÅb³Ä˜Pœ-;y6-RSf†-U9°4[õxæÌ>ôwYë£/kVT=p˜ˆ†M4§A[pÄ-2q*‚êÆÿ0ŠOlœ®IºS^:ÒË õ*r÷ddb*,"Ä—‡–½À&Á°öû#$U P†<2² #‘±:("¹Ó\…ÑÙêv»jX°ÕCÑy ãŠ6._±x}àÁî5 bÔ1ŠñF¼¨]z5Ž–Ô8Ê£ÔÍŸù›þÌꃴõ+ÿ±ù8ºVÇ—ëϱAµþ`=œñ@=œ5×ß¼­‹vùªôÅzѬµkDKjD³ö ]`â¹V^¢¥‘9·{±.4«|k×DV¨L`•)ù”w±â”\¿P£°•z×K„ƒ>ž61¶qO×(Öž3¥Ô'\¸Ïm~ÚK%ìBùäÛ½T2^µëÒUú@Îq7×Ɔ'€íܣ領A›Ui!œoõýu¨ï,³ý ý£ô/a²:åwr:é'Ft»¨"R~ì&s£\Ìyg<0ðËÙÝéÙí'—ÍÝçn„î/êeùÙ0A3N;Ë_ÿx¥›n¶JL¬ö³^B¿ƒˆ£i%|èñ6ÓfëZ|ê¿ZÐI:Æu¬ï@¶\rb:“bÚá¦* iA†›ù­[õðɧ=$£7Ö6Ù8ö``ëdm»`)v2°³YýB:SG­ý@Ú—M@ÀMðîAæ:<Ô¹D™J¦óSAÇ,ÙŠ+o%I¯3T¿nH§±ZîæZ:f©éšíAþ udjxàDú–¡Æük@•°ùѪž¬Î»†cU–žõ좛ÌYÏ®2Lÿ­… îÙµNscà)ÖœMŠëÙ•\ÇìTúÆ=»Ó{$lUS¯!]Ú±¸Îv†¸gסN”ÙQ’ë'»¾ÛúCÉõß*©\Á>_ÊH6·çæ/ru‹kó¦çdd!¯¨´‰ýk/ÙÿÅF“†b˜!ÀÛ+3A€dò®¬‹mwصÕÆÎx¥šVë¾ç˜Öåöûjà0­­¦¹!%æÇ"h™7Ö®FV“›Xõ³!ÃlÏfJƒI†ÍÊåÿUo½¯ÖKøïjÔ0§¯æô"túÈýNR}$¯æTÁØIœýœ¾G Sdé­é¤Îwæä²l»Ò²õ¶»03 fŒ3&u›?'Õq­ˆšè¦S¹ ­Óêþ26L™fSŸ¬ä§toA‹Ê1—óQÜÝ!‚IMg‰ù30¦ÿð—V9ET®W< Uûõ`uøa=Ç€Uç†jû@v£2ß?‹S¹^ÉÂÊñ0÷låE5nä\Ó ýÇJòËÔnyl&:ÆoóâjÔ8©Æ‡Jçr},=¬¯'^ŽZ«‡Œ3–ÝÿPv\Ú endstream endobj 37 0 obj 3345 endobj 39 0 obj << /Type /Page /Parent 5 0 R /Resources 40 0 R /Contents 38 0 R /MediaBox [ 0 0 595 842 ] >> endobj 40 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F2.0 7 0 R /F1.0 9 0 R >> /XObject << /Im3 41 0 R /Im2 42 0 R /Fm5 43 0 R /Fm6 44 0 R /Fm7 45 0 R /Fm9 46 0 R /Fm12 47 0 R /Fm3 48 0 R /Fm13 49 0 R /Fm8 50 0 R /Fm4 51 0 R /Fm10 52 0 R /Fm11 53 0 R >> >> endobj 43 0 obj << /Length 54 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1456 160 ] /Resources 55 0 R /Filter /FlateDecode >> stream xÚ­Ö±NÃ0àÝOq0µu}¶ï, Ø*Eb¦ P+•¼>Ihbì&ÔJ©Úä«ãÿz׬`ªy %dïÏp[X^ïÖûî3ûusv/í¡=q½«<‹î]ϰ0•²ê ,oÑJl.©_`v6‡únêîËRŠh® jIŽ#‰¤:H—D¿žAÂæ‰ú`ð`|Œt0šcU>n0ÞŠÖ¡M´j@gE ùH KÙ– Uz)ó"…u¤„t.KãTò~Šâ±æ·ùÄS„„M¹(B*L"ªdOÝ?T ‘þ{¥°²™JÉl‹ˆ{B`ØMOYÄ%Ú[ghzÊY„Íô”³ˆK§Œ£H´'•ÒSS?ºmPÚÒŸ²H´ì€T~BÊ"ÓùÆÛ4#¥ì±ÊOÐã™|¹ˆ$©0S/âô:VÚ›JL‘ÂéÚ½+S¼‹”0YÏ‹­)S½cÊÑ4#Εoãs]ªD1ÖäZ‚‘†,r3Æ‚WRùf^£M|y©øi£ÞßGåÓØ_¢£à¬r@=¶ªÈêFFC endstream endobj 54 0 obj 429 endobj 55 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs6 56 0 R >> /Font << /F15.0 57 0 R /F16.0 58 0 R /F18.0 59 0 R /F14.1 60 0 R /F17.0 61 0 R >> >> endobj 44 0 obj << /Length 62 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 448 128 ] /Resources 63 0 R /Filter /FlateDecode >> stream xڥн‚0à§8ê¢Ð[Jî$M|¢ƒdðõ- ‚Q i m ÷ë¹·FÌ=Bh×xœqÂé¾Q(ÿ‹¡)Ý)òÛ¸]Úƒe……‘‘ÿj$âL äÄa+¤G2 ¹{Áz±½â`ý]cJ䪅x’+9Hœ%¬“ð_ŠÞyzÉÕ»÷w˜eÁDo|ÄØš õÆ3ÄàBõ²š4òÎp+W®Œ³.ïƒÜ‚©g?† i{ ™–³"ˆM ¤x:"¤÷ endstream endobj 62 0 obj 206 endobj 63 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs7 64 0 R >> /Font << /F22.0 65 0 R /F21.0 66 0 R /F19.1 67 0 R /F20.0 68 0 R >> >> endobj 45 0 obj << /Length 69 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1384 160 ] /Resources 70 0 R /Filter /FlateDecode >> stream xÚ­ÖÍNÃ0 à{žÂpËâ8?Í Ü&Uâœ&mÒØûK¤ÝÚ¤´  iê´µß<Ûµ·‡5ìAøR¥€Ïx€¬nlíg¶/—Í¡9q³…ëœaí»ÎÀ²!´RPoau'‰£¿¤~…ÅÙÔïp[·_–R˜¿:((¹¶&’' òëâé%”€þy4to¼Múdø£©|fÌÉ0½ñQ‡ (Û#O‹"…\¤„PvEˆéP.J©â̆ê\• ¤Eò÷•‡œûe}"DI!!)—Eˆ¢$"Jr¢lõ¢Qý½S´Ñ™Nɤ…Å3¡gŒtó«ÌâÁß„¶ Ê9Ä 3¿ÊY¤ImÁI$ʉUfn•Ùi” gU™%FvTD3ªÌ2“?0.ÍpÎ;‡­ó¤wœ³£Ý’G¢¡P&ß.ld «2ýÂÆ—ÙPin"–û"¥Œ”°XÏË-2Í;¥Ä}7èÞF¢Í´o‘bªÜ>K0œ´B“ÃÈßÛNpá$…ÍÆŽÞcêþç„è<ö}S>Oý#ŽH‚îª: ë/ñAÄ endstream endobj 69 0 obj 434 endobj 70 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs8 71 0 R >> /Font << /F27.0 72 0 R /F26.0 73 0 R /F25.0 74 0 R /F24.0 75 0 R /F23.1 76 0 R >> >> endobj 46 0 obj << /Length 77 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1480 416 ] /Resources 78 0 R /Filter /FlateDecode >> stream xÚ—ËnÛ0E÷óÓ¦M¾D‘@ÛEvÄ@7ÝúJ€Ä‹þ~II!k$ql/dØÖÑåhæ^ñoðExKãiñé€ßñ¯·Gûc÷›Àã>üMv¯â!þq_vè-tßz‹WÚtBà)·‘á”Ý®^­q÷¿îº‹QggŠT›¦µÉoÄ@Âi<ëI$©PiÕ3´HŒŸ‹Œf`„£u¨Â¡gÈÄøÃÒ!t!D%È‹¢}AÉR8%Ú )êúi%¹Éh)袬Y«Èõ|Ê®‘··C#ßnAm´0øÃYOÓ].a¼@çNzV¯óÄ ¨h¥¦q(eqa±—Æj瓚XµqÉaX%)Æ×¯»îÀÁy%cÌF+£0Ž‹EFQ_ï›X_`Ì*R³*òjêf•¢X ©ÄU³J@¤6 R7«Ä;(oöò¬¥[ 27«Åyj=Ÿ3¤n$Aj+Ç3‰œ™„¾g¤QþåPŽ›fJœø„³…eQofDÁ¤QT‡Ì寗Ht BXÔZÅ\$C­WP…¾X„œ˜Å\¡Ú,¦“n1íÀ³‹‰lž_L„;ð c*Ýçä’>fJeŠËhN»–Æ“niââÊÞ9'ÈS¨[›GΈÍ&Üò‰‹‚3r3Úy~Ö>û¹Äëb9ù¡‚—›6¸q¦d)¬Ü´¾-Šâ„•›mHj=¬ÜŒ;²(kÖ󚳆Ätö{ø{<à‹W†.ÔqÇ6²Ò·,†“£ NÕvm¼ñ3鑘w,È &ƒÎÜ> /Font << /F28.1 80 0 R /F30.0 81 0 R /F31.0 82 0 R /F29.0 83 0 R /F32.0 84 0 R >> >> endobj 47 0 obj << /Length 85 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1744 256 ] /Resources 86 0 R /Filter /FlateDecode >> stream xÚ­–AOã0…ïó+X"xlíöBµ{¯‰ · °­Äö€Ø_¿N§qÚ¸­Z)U›~y~ó<ãœã ÿ"«5J6ø÷Ÿp³ \n¶? Ü,ý}´ýx_]ª;—+|,¡0õ·þz¯œF£–+|ø­TNþ/å+Þ^dX¾á¯rû´KìQHælM@Ò¹hH'A«'$‘ûUÕ nŸ) §F·¢Ëƒ nþJÂz-®˜VÈ{ ¹ýÅ„J:G~¦@¤âb[Èóí€ý:÷(\D)´ݰ„Euöªaâjˆ¹Ì5j¤H?ÌGÂ;DiWuÁžï,M;w9ËS0¬ÜH~A‚ì¿‹ãÙKPbôhlR(ŽJ'e±JŽx›Dq"º™î¦AÂÄ8–»‰0|“ôIFXµž¯ƒ°Íõû@¸å=IŠE'ŶH‹ØKñ–D´NƒTþF¤d)”Â'F’ë¶QCù—âmá#µ<ÑZá'R'åhoS€9Ö\*.&K ]Õ1-Ä”ibœ9½H$•>C•¤稒|†*)¶ÇV)ÄèžÝbî¦Q†GÚ~z3ò¦ciülN³Es‚\Ì¢O(¤ßrp…Ä’ªîƒp1mQ¬¾ç,ôdZhØq5!aÒélT‹‘Û‰NV{1l >#S(VX’-fþƒwE endstream endobj 85 0 obj 535 endobj 86 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs10 87 0 R >> /Font << /F36.0 88 0 R /F33.1 89 0 R /F35.0 90 0 R /F34.0 91 0 R /F37.0 92 0 R >> >> endobj 48 0 obj << /Length 93 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1848 248 ] /Resources 94 0 R /Filter /FlateDecode >> stream xÚ­–MoÛ0 †ïüìº5Šº¢¾uè¥Áv/b —œlÖ5@—CþúʉfK±[Aûñ+’/Å7|Ä7dþCVZäþûï'>áï["\ow2Ü®ý}´[Þ¶—öÎõ+>4àôþW½V¢›W¼û!lMþ‘æ^_TØüÁïÍîm <4˜Pˆ×ÊèˆäjH˜'A§'&G’rϬcü.ahÑ3¢}™d¨ÀðWk´ :¨ÓñR¶—Hˆädu£@”¡„¢lDé¥lJ œë(&}nnŠ Že÷C%!òU5 @Z¶ Åòì~î pXû1D*9'?0tPB1f2*³a Q"_³—ò^ÞC8«%Sjr&‹úzUÁG2̤©.Â(=âç)HìŶ)dÍX ¤í•#É.¡X1bƈjÌ%”XJbéY¸dˆ)JkBÍ=íÎYæ>6ò1 ‰rMBø<1; ¼IFôRxÉwÞQŠô&ÈlhSÑ,+¥*¢¯N¶7RÀ<—Q¬Ž('Ç…saN ÷9ÊŠ©Ê †y75Ó”Œgˆ¯dòñ•’!¾ÒÑ©ñMÆázLÛgàÈè0Ñg43ÉÙô­gI|ƒìbÙå"ûï ß§8C¿Ôþ íò/.çíJëÿ§$$SY¾ íNI˜7ác”„Ù#Þ(Å2 S“Õã'+\„R endstream endobj 93 0 obj 541 endobj 94 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs11 95 0 R >> /Font << /F41.0 96 0 R /F42.0 97 0 R /F40.0 98 0 R /F39.0 99 0 R /F38.1 100 0 R >> >> endobj 49 0 obj << /Length 101 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1400 384 ] /Resources 102 0 R /Filter /FlateDecode >> stream xÚ•–MoÛ0 †ïü\÷Õbk*RŸ>l‡Û½ˆ]v ’ÖthsèßŸäØ–)q” áˆ_Ñ/%¿à¾ ð_RB t _7ø Ÿñay Æõ¡ûSàaíçQÞ‡!Ì\ïñ±…Ưúñ>\µÆa»Ç‡ŸJ.ȧ´[¼}w‡íüÑvwË(ðØâ„B¼ÐÖ$$µ= Ë$õ¤$2Èþwdè‘ñ6ËÐ=ÃÎ!+Ñ3ÌÈø[¥ƒe"ÄŽß·% $ÕPt“P¢”ç³M ±®_ª ×C5)E¹(w¦–›P×óí§¾M!Úy£e¶½™@ 7ÿbµwŠÎ ï#DÁ[ßWËUßW«e±¯´õéÊâ>F;\y‚fì çg°Â펛Q(i"aÒÈûo‡ÛÝåìA³²•w–ä1¢I7D!ƒ›c¶‘(÷66D°ë#5ÍV<‰¸Ë.®ÒH`ê¬Ý¯±¼Ï¤¥ÓÉRll¸ØØeˆõ%‹ÿ¼zȇYH²;Xí ×èØ“pq{8£Ä{8*±#äk Ä‘*B0|¶ÿ^»±HäŸð¤@¹¡¯ °¶ %6è÷*Šä¦¨å¦†bœ9îå³çÁ™‡¥U‰Jêlc„¶¹òT9÷ÄE¢$n u¶Q\„àðÙì›+€0•VèdVž5 -h¡8áÌžÿå÷‘ …Éfb>Õ@1t•ÈJÔÊKó¹2¨‰ 5çŽß Fê¼£ ï$ŽßAN$•åÀœ;9¤.æÍ<ªA'j Sóô+y=µ endstream endobj 101 0 obj 587 endobj 102 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs12 103 0 R >> /Font << /F45.0 104 0 R /F43.1 105 0 R /F46.0 106 0 R /F47.0 107 0 R /F44.0 108 0 R >> >> endobj 50 0 obj << /Length 109 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 944 160 ] /Resources 110 0 R /Filter /FlateDecode >> stream xÚ¥ÕÏOÂ0ð{ÿŠ'^0òÚ×¾¶/=x#4ñ žˆ4˜ÿ}ËhXÑ!”eY¶t맯ßîÇ f°L[0#¬ßà ¾`2Ý(‚Ŧ¹†°Y¤ÛTs:Þ¶w.–p!°hZؼ›œ¸„ɃñR¥.ñ†W7?à>6ƒu)"õn¥¥u\HAb– •vNç¹ÂùThIhà4Äõñr÷) *í‡ÅŠá ÿl†ÒѧvâdQ¢ØÕúyjÖÅn«±j¼3TAT@Ûä2t[¥h ‡ádep)r!¤ ƒ)RÒ3ªBŒëD°&r¾s‰F5ˆAî¬qØ?X|ÿ`-r'¢j2±Dýƒµ¬:)e•Ã¥sé9mû/³Ô‡ÎJkÅ;Xdr]…èpþ£"ÉÅG¿Nè!¤¹Mâ÷⹚>5fîÏçõ¬)Š<Å ÓÃÜfسÖ.…¡ endstream endobj 109 0 obj 359 endobj 110 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs13 111 0 R >> /Font << /F50.0 112 0 R /F51.0 113 0 R /F49.0 114 0 R /F48.1 115 0 R >> >> endobj 51 0 obj << /Length 116 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1984 272 ] /Resources 117 0 R /Filter /FlateDecode >> stream xÚ­ÖKOÛ@àûüŠ¡\³³ÙÝC/ ¸Ð ’¥^8µj‹@¢©„à׳6!;ÄëxWjr°åÄ_æ±;ñÞàªô¦,j¯ñïüŽxv±!‹ëÍø¡ÂÍ:}ÆÓÓá0|sý€ç=D~¿šŽ§&ìû<»rº£tKÿWG'ØÿÁË~üµ‰ç=~RHwγL§¶–%ØÅ#%îbµ5ìÎxi1H™"òXB:íU0 Ê#)öH&%úIZ·«=2‡39;ï ÌU|R'9fåkâC±Pw-ˆaš¯v-buH^…_Z§Ê‘|[DÜIGgSËÓžxGÜ¡r¸ÛFó´Û0³z*<çã‡åÕƒ••bí‡JA±ÜµHPá](Ï‹ˆ(wr ö{v߆8$ò¤oI'º Ò©š3D­ëÇÆŒŸšŠ s£œ%f£ub“䮽.*¢à¤¢»¤ªm…XˆíÿÔD:ÔÖj6ir‡jõË“cDͺP¬ħ-›9ð[–Hnª57Íæº)k²!çO‹á)rP/díör:á˜Úìí^(°:n™¤­|äƒñÙgx=ÿþ÷k> /Font << /F56.0 119 0 R /F54.0 120 0 R /F52.1 121 0 R /F55.0 122 0 R /F53.0 123 0 R >> >> endobj 52 0 obj << /Length 124 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 976 160 ] /Resources 125 0 R /Filter /FlateDecode >> stream xÚ¥Õ?O1ð½ŸâL ômûöÏà"ÑÁÐĈL€Á¯oï¨ôÀC¨ $G¸»_Ÿ>åèf°_Þ@#`ó Oð “é –Ûöœ€í2^†íÇqsh®\®à.€7¬ýÖ+§´†°‚ÉYŽñ–ðëïpÚÁúïÎ JN1M–I‚,íNç)á|Ê$WBÃH›Óq÷a|£< ˆƒ<„ø¢Å£s€Ê$ÈsÁvY?ÎÍú éœÆˆ=ò¬Œ"Hw ¦¹Ý)’𰜤 Î"^úÓE´ÍH§˜QbT/"J:Q¾‰F%ˆ–¦¾XÝ$©-–¤¬/–”èE°¤"[_,9êE8çEŽq¾~,Ùú²ÍŒjÈ ìMòX„¨ÎãÓéäº1xùO…+ÒhNþ;ÅS> ^*v¼C,Š9æ¼üá~m8/M‘í¦èeÜÿTî:!³o7ª…û endstream endobj 124 0 obj 358 endobj 125 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs15 126 0 R >> /Font << /F60.0 127 0 R /F57.1 128 0 R /F59.0 129 0 R /F58.0 130 0 R >> >> endobj 53 0 obj << /Length 131 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1544 152 ] /Resources 132 0 R /Filter /FlateDecode >> stream xÚ­–?OÃ0Å÷ûS+¨ëó¿ÄK l•,1S¨•J7>=n%Žk'P¥&j“_ÞÝ{>gkÜ#÷ÒJù/Ÿ¯øˆ;\ÞÈàæÐüÉñ°ñ×Qsº ær›-®XsúÕ²V¨¥A·Åå½!Fþ÷†³‹9ºw¼sÍÓÎ(°r8 `º2I0Þ’0M‚NOHò‰–!;Æ×$C· 4¾+Õ1>JtXèÐãy–‚@ÐÜA1R”^É®R›´”ù†>‡!ë€Ò›sA K‘Ê$ëºç‰ Ý‘Çz&ìTlC%JД?ÿ€¢«Q`ÓÍëŒ?×G ä–PŒ©D¾·£0ùííO•Uåz ##!¦Ô2ÓÛH¥C›ûátY©)*‚hžu¹c)aŒqˆ“ÊÄeŠÄ…¸ÎÊ"-–ÿC`ÅV1%LPœxO©½mGÊïØ-â^½Œ¾‡ÄVÇIª!¶Íõõ7¤·æ– endstream endobj 131 0 obj 425 endobj 132 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs16 133 0 R >> /Font << /F64.0 134 0 R /F61.1 135 0 R /F63.0 136 0 R /F62.0 137 0 R /F65.0 138 0 R >> >> endobj 41 0 obj << /Length 139 0 R /Type /XObject /Subtype /Image /Width 964 /Height 590 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xÚìwxUEþÆ ½…zo*U@ 6)Ѝ€€Ò{‡PBI 4C ½I•^‘.  5¡„@%¡…"ÖÝuÝu÷þ>Ï}æ9¿„Dˆá&yÿ¸Ï9çΙ3gÎÌû}§}Çå²°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°HEøÏþóË/¿üë_ÿr^üý÷ßcûí·ßnß¾m³ËÂÂÂÂc€xÿùÏþÏ Ž¡kÃÛÿøÇ?~þùç¿ÿýïüe3ÊÂÂÂ"yñÃ?ÄÄÄܸqãúõëQQQááá¡¡¡ü^ºtéÇDfÿ÷¿ÿ™Û¼²°°°ð<~ùå—Û·o£œacN%­ýõW®maaaa‘,ø÷¿ÿ KCÈñøã?þ}6»,,,,<‰ßÿýÚµkW®\ùÇ?þἎ„þç?ÿ u«¿ÚöuXXXX$#Qÿúë¯+äX]І«ao”6¿iõ‡XXXXXxááá—/_މ‰á×L±3½ÐüñÇ¿þõ/ÉiÁ昅………ç„–NVç3ZšßX#†blˆQmsÌÂÂÂÂ3øé§ŸÌñ¯¿þzëÖ-”3Dz¸HN«?Äæ˜…………çcÆ ‘ÐpõŋϞ=«™Ò±XýÊ•+6Ç,,,,<†èèè­[·Îš5«gÏž|ðÁðáÃwíÚuýúuÍV7ÔýÛo¿ÅšbaaaaáÀÃ:@EñŽzõª[·n™2eÊ–-Û¨Q£I“&…††ÊÅÇÿûß_ýÕæ˜…………gõÉ'Ÿx{{CÈuêÔ)\¸pÖ¬YK•*uæÌþBN‡Kÿûßÿì D ‹äÅõë×,XðÖ[oeÊ”éon,X°gÏžûöí3mµ´…………Çðã?¾ñÆY²d™8q"§GŽ©W¯ä‚œ†´cù2µ°°°°H.@È¿ýö¤9sæÐÐP-ryê©§ mNÿýïKEÿñÇÛ¶m‹‰‰1!?ýô§ÎI}žOù÷ߟ€ƒ‘_~ùE'yc+ä›fÎȦÀu÷7oÞ4ÇZjzÍ”Yn)–)g=¬FØõeãºgO!¸xñ¢IYG3™c.þ/8ï•×*”껚Ø&Xâ:EOq®zvÚÌZ"Àíænܸe=DäüÉ'Ÿ<÷Üs†â†ž?þþýûsÌ»h ‹2端¾š1cÆøñã;uê4vìØ¹sçNž<™ß!C†ŒŽ=ÝèÝ»wß¾}‰Ó××wРAƒîÚµk¯^½8Ô 8åb¿xà¸kæÌ™cÆŒáY¤œ+$¯K—.ñ…§É0nܸ€€€anpÀ)ãK'ñóv&L˜áœr1¾t¶iÓ¦mÛ¶;w& ‘Œ1‚„ñˆ… Λ7OO 9r$Ï≤™d'ynŸ>}¸Ø£GîUβ[·näyûöí ÌE“ÎîÝ»s±]»vüq¿ûÇ”)SˆÙÏÏ$é\°`#3;vìÈë“NŽykr)¾üŒï»Ç÷Ðøò9¾xȨÏ>ûlÚ´iÁÁÁ£F"‹HU|é‰/?yoÊ¿ä)óï¼ó‚$¾ç6kÖì½÷Þ#L£F4hP¿~ý×^{íÕW_ýàƒ¸—Äó>ýôÓI“&‘K” ñÑG!iøúM›6­Y³f‡*UªT @âÅ‹W¨P¡²pÊÅgŸ}¶Zµj%K–Ì•+WƌӥK—!CÔQš$ÊŠòc=–5kVu]ò)R¤T©R,{öì„I“|H›6mîܹsäÈ¡ÎUr†ŸD¼oúôé³eËÆkòF^^^¼¸··7™,Zûù矡2Œ4Öìâ‡2^¢b l‰>‘* (’ocàÌÑ„¿»‘Œé'ÿ±Œ¤™´ñ°•ÙJ£WùL\Äî$¯–Ö–ýað@ñÃ?8Å¿Ëí2ñ¡èûÒòØdÿ¾Zÿ¥”¤@¿7—/_Vò¨¶´.ÕF¦ŒáááaaaÇŽ;|øðþýû÷ìÙ³k×®;v,]ºôÒ¥K)ã€S.þâÁéÓ§—,YròäIªçòåËwïÞM`ž²hÑ¢¯¿þš8IäÙ³g¥±Ô#ï @&!{öíÛçí ?“ÿ.\€ÕÈ]µjÕ+¯¼-“E.÷ÄÁs¥[xÏrFõÄO6ôýÆ—Ÿñ}îøž›@>Ǿ¬LI#âKO|ù)¥Ê¼ï½”XS¹‹ãÆ&iÊB­'‘Äú¬Ü¥×A'#MS979F¡E1¡›ä’$+4 €2ƒ°×_O?ý4Jž4“’M0“Nσ EÄ%Š‚Z–Ë âÔõråʉ¾~úé'yΩ?"irDDÄñãǹ‚ £Îò²X7Þ£f´4‹V!DM²EÄ•\ßZÕŸÚt× Hû‚õvCøoɾ“|L‰J9  ;SÅ÷-V¬˜’•á›RI¡MH)ÛárX¨P!õ'˜bf¦K¥(˜â§š[¹re¬F|eûâS_ œ&‰¹!KBÂëþ‘/_¾Š+roݺu7nÜH â·ß~KÆq´ûM3Ú;00rZd+ˆùÓ£] S½zu>nçΧL™ràÀÝH8~xžæ3¢-ˆJBÌÚFõ–pÀ)Ž¿ÅZIW¯^=uêv¤yóæ’úõëÓPŠ/ûì³½{÷ž9s†'’±¾1þRä{PW´WÁhÔ9D¥M*¹Hbˆ3&&æÊ•+|¬_ïêÿ!ÍDrñâÅ­[·ò}Ñx´jI0YªôüÃøò3½»"¾|Ž/ž£G†×_¶lÙk¯½¦Âùá‡Æ—žøò“ãWã_ÊÀûí”$sŽ‘©j iüüü „N:É»ÁÈF^Ù9æ¥!03—U§„$‡I^ö€9›óTrõU¥J•Fñ}ä‘8¹ø‡|£6Q¾üòKˆ´L™2Û¶m#÷î7)L2S…ùÛo¿åsÔ¬Y3þüÒÕž€fôðaÔÒZ-*¤ÎRZ(xçΛ4i ŠJD!3õ¹E¼üB´éø÷ã?îÑ£G—.]8$™ Q¶ÁƒóÛ³gϾ}û¶nÝš2Iòh×÷îÝ{ĈüÅu*8’+íÛ·ïׯ߀ÚµkDZFOÚ¶m;$…¼êСŒM~ðÁi>|xJK§H›ÌìÕ«É 9rd2¦§{÷î~ntìØ‘ï«NŠbJË7„)”œ¦FôéÓGÃâþñ`ܸqcÇŽ%{¨J¦ºqª{¹Á§\úÄj•Ô„!rNÕõŠú%fÍ÷ÕX<Ç÷û¾AAAiµk¦OŸþîf‚­‰ŠŠš?þÛo¿­’ÏG‘ÑùÉ (eÉ’¹…Òà—`ŰÅX7L˜œ83G{ÝÆ²þ‰Ÿ2ã\<KAÊ»vízbÙ€øÒ)ëîÑ7 æ.’B À­_¿žäaßc%ã7”“rW[²N Ç-Fîþ÷>7µÇŽSs5::Ú9²ÉS¡ñâ{n|ù.\¸`†ª}}}•¦øÝõ¹÷’ŸE£:‡ŸÌ'ИNÆŒ!j§RÕ¶¡j2m/mÚ)Òùʤ‚áÔÕ‘‘‘ä^³fÍh%©ühæ­„ýÿ’ &£øÐb‰ÀûGÔAª‘ˆ†Ä” /ù"ä- †–~Ø—NSrô‚êýà hŒNÑ¢EÕ-¹aòBÝ ¼2/N>äÌ™3oÞ¼aaajô¥¨7‚W¯^]°`Á-Z¨ñ®^ÚVɸv’Œ¢‘Û¤‡ævíÚµ«U«–} ’N¸ºyóæ45Múúõë)°/Ož<… ¦Élú. ûíÇHBÈ.ߺu‹¼¢Ý]¡BÚ›T”–oTÚů¿þz¾|ùø²|î_~ùÅž{‡j½1‚:pn D¥vºË1WΜ94„ÑϤÐ2q6—НA«Q£F=t;·Š1œ6wùòåØ Zâ ¥¶êŠÖ€ÈîÝ»rB¯ŸvÒnq…“z¤ce¾„½íKá HÐZ$›Ó=0§e‰/÷«ï*툙’&»V¦L=×LD$Òâ>]1Mh"ÔÌO£ÇÑÇÌ’~Ï;'1£%PMæÃŸæsñH‹r×ĉ5w"÷ýÓü¼Çô« ©I¶@Æ97@ŸÀÙ?¿`Á‰ÕXùLj¹×ÄãÏ÷žžD´•x„4<ÍdN?Nò4hpôèQ5fõR2¾ÿM&˜âG2rçÎM µyßýÆc>ÊWƯ¶!±¡Ï‰ß†;öO¹Ú8S‚–ÏŸ?¯6È7ZµjÅ›vîÜ™—=}ú´“ZÒ… ’4…ÃSÔZHfÞ¼y¤üí·ß†LHF¡Wx{{§OŸ>e®Pƒyš4iB…“ç—fÊ”)[¶lNò¤'ïòRCÔM=JöôÄgžžþyó}Imâ¸K½=ÿqÜ&À3w…‘d¸422rôèÑÈÂÁƒs AJTjßÞ'\îųÒÒC† ÁøBÚ—?¢¦M›.Z´È´5È1i*õ¾^¾|YùÄ*^¼x† ÔB×»ÓJ‚ŸÕhº+¤âvEj¯X*KßèOר:a­pïðáÃiÁ :ôO_Ù ÓŽˆ/ ô ܯ‡âO¬»òºA–ò e¯„_ÜÇÅê»s¶M ~wà?÷ =QÛñ*éÞ½{5kQ6šÂ@†`²1Ö ôÉÄ—ñ=7¾|N໓6 jO˜0ASÈÔsž€–¾ëçSw“¦”üésU»•N’}×1¾²èE«+V¤)GP,PŠÓŸ¤>™sÇçûÊÏû…z0Ô‰!«ÁG|òÉ'_|ñÅ]»v©¾˜¦Š2$Y`,,•±Zµj>>>$Œ¼½ßxL'ü÷ß/&×r<ñùàää‡tO@³¢Ÿ_$¨ŸŸŸù !ª©’?þø#ÅLÂ@y‚m"W Ë%£Ö2Ýéä¿ÌeRŸéÝwß5ú™j /%€zªR”bK (“¼”¹™šºæîZ˜“PM ÿ¾È3“<§$Ž ),uX™n%±Ÿéö‘O•?âAZWzÉhr¤‚& 6LrNÏ%òÄ­ïæ^ÍcŸ5kÖÃÈÏ=zô ñk×®…Íx—úõëg̘±eË–N±ª&R6ˆri­â›¨ÏìŸKX:u¬S߯÷}ã‹ß˜ER5jÔ¨2eÊ 8P=« ¨hãJI|éŒ%râöÆ‚sCܶa:uzõꥆYªžO3¡×è@I/S)Œ–V©V¥PšMõ}AT&7YG=qâÄöíÛ«T©òÌ3ÏlذáäÉ“\ç;Ò™ˆ6{|ÏýÓ|Žû½”ŸHSšÀê—>vìX|áãËO›Z»ˆŠ„Gü•½qU´FOÐf´Á©/ùúëÈ‘#•+W6Ã"$@³)ŒQv>1Vùר}"ÆïÈ7M WÑ¥œ>|¸I“&_|ñ…PmiCñ. Lz÷NŸ>­ÂLyÃjÔ®]›†y"ô^DD„J5ô®/²uëV-·Ô†Ú¦+†œy¸ü,ÅÙá÷ý÷ß/^¼¸ü]ð}5dS«V-®DEE©Ì«¢µºº—/Nuþ#™`¦Ù˜ZC ’–¦djŒXû9ò5àØ g¯8¹­FJ2¦'›HÅÑS(š:®òÒÒ©e†P®¦ 8$ 4N§zÄ·6Zú”RõñÇ«C[,Ÿ–vÊY.õ*\‚ÜvC<°fNx°Æ€œlÓ¦<%‰Í¢§6-ëûƒ{óæMåùcšrdjµ´…ŃëÃAE˜Ö«ëŽ#ÐøÆû4CE¸Kå[ÆcÊDú$,Nç‹ÒjiOB^²5ŸGŠš/®¹ýrˬ]øâ¦›š0Ú«…"¤5¹)öídhÌæJɘÔûrŽšŒxë¬Ó-UjË·»úÙHà¹ã÷5£9‰n¶?ìZ:.l¿´……çqãÆ í²aè2IÄþ ±”@ÜiiHjÖÒN#ëœKo,µÌ:?4ù uñÓf£)V"jxTŽeŒÓÎdÔÒee·Å]IíýXS•R4Âéö‘,c¦Ë=µi鸞 LËÂ\1í´ßºÕÒZ°`V„EEEÅ·ðÐØ)ãZDrÌUF¢ƒüÞ?,só¬–Ž¥OL{G30d΋ÿüóÏL„ÃÕk2÷©‘‡pM¼LöœsãT3`×|=D 3EPq÷N=ÐëSÈå!JËX-}/{¢¥-­1AcnäÁ8V?˜V^ðõå(Òji ‹êšSKPÏŸ?ìØ±ñ 44tçÎ . ôucøðácÆŒéÙ³ç¬Y³öîÝ»oß¾¥K—úûûó—swXxXÖŒ§f-}ûöíXÅCZÚ4¬bm&‹ ¤ü)RDÞ}53$ejiíâ„Òp6$“ fæ'e‰ôªÄùØ·Ìž4çù}FíyÓ¥8i™^ò¾$!öC›z´ô­[·ø¸f!œÆÚ?Z›ðòûÈ÷óXX$»ÝqžbzN:µÿþ¿ÅƒÞ½{¿ÿþûUªTÉœ9s¬¿ .Ü Aƒ¦M›V«VÍüßs_¦©YK'®ËˆO¼»0 ‹ãÇçÈ‘#{öì>>>Y³fq-0àêÕ«+V¬Ð¤Y)S&ÃÛeÊ”™;wî¹sçž}öY]éÙ³'§ÚeLšÜuÇ'¿Ë½a £ÝŽLkZ­fÕ÷Xû£É«Qøf¯=­©Ñ—^hQ³ÚVÃåÞáëÈ‘#‘‘‘Úbš5)ê ÷^»vM‘s#­'µÌ蟎:=zó¥ÕãA«œL0_M;×[-mañ€`v‰5W8:t¨öY^·nÝÚµk.\ÈÁ‚ ÆGÝ„–¿ûî»5kÖ,^¼xåʕ۶mãt×®]põùóç!aø0 @´¸Eœ)r3uyâĉðùk¯½öÁT­ZµR¥J"X“ù×Çšîm§%>7¼öÜsϽõÖ[†ð1έ.ÌV,¤ðwÞ1L˽2zý“'O*˜Ù‡Å¬kذa‘"E”<¥3ECìÆ ³ZÚji ‹dÊ–ª—;wn~‹/îííݽ{÷|ùòÕ«WoÙ²e6lظq#lœ'Ož²eË6iÒ¤U«V£Gž{ölèîÈ‘#J@hhè¬Y³ÚµkŸ={6¤s@´ü{àÀ‚uêÔiĈ\C¢ó „i ]°~ýúQ£F¢´‰Ÿdûí·‹-Â@H‡Œ6B=hYdÈбåÃ$––&sÆŽkµ´ÕÒ†fþß¼y3{öìèguÀºÞÕ«WMG±Y¬]3¡ÎPÌÿÒK/A¤ê1ÚÙM ¥ûøøÀÞ‚àà`„w¹råx >}ú´Ë¦ËÑ­î­FçºNbX @x˜¿H­¡Í'N8'8q—$7,­]’1%IèË—/c¼d)t…_9oùòË/ *Ô»wo«¥­–¶°ð YD¦– R ‘¦o½õõ®W¯^±V–™ Sg‡Oì믿v9†x{{É´iÓ ;(] %À¡C‡J–,IÕv9ÆQ¿bà_|1K–,ÕªUC¾Ö¨Q#$$„H2fÌØ¹sgøëÂ… ­ZµJ›6mûöíK—.ÍS6nܘ+W.þýüóϵSêã?Þ­[·7ÞxŒ,÷òòjÓ¦ ‘7iÒ$_¾|aaaiÒ¤!XýúõsçÎ]°`Á;wÒ4м”Œn`,ôèçŸþÕW_ßÊ 16övÎæ}1 ¨}«¥­–¶°ð0$ÿ ØlÙ²ùùù5nÜØåÞÜSÂ2((m,å¼{÷îo¿ýVw!€¡ýï¾ûÞ60Äuýúõ“À†è¨ÑÒº£Fâ¯ÀÀ@g7¼yóˆù«¯¾ªP¡Ü‹‡{¿ùæ› &À±œÂóÐïŠ+0¯½öš~ضmÛ;ï¼£ÓvíÚé T©Rl©>Žk×® Ûó"ÄÃÓ‡ EçÏŸŸóäɳÿ~”9ä_±bEÝNjyJ£FòæÍ++½÷éÓÇji«¥-,}úäÉ“Zk†0Öæ¼Z®Y¸EīΠp€ %Ø[ËP¡ür ìM¥^ºt©œ«B“7à|Ô2q¼råJ˜V'ðÛo¿Í¸ÍŒî—®[·îâÅ‹“'Oæ/È;B2ræÌI  ò±cÇ`/¤´ öä“OJæi óÊ•+:uÒ_bxb %ÃøÖõõõÕpäÕ«W§ˆÞ½{—,YRNö°ÆqqRå[´hs†‡‡s UjÇj8)S¦Ö­[CªíÛ·ç–ºuëN:ûR¸páž={¾÷Þ{„ɘ1ãæÍ›öhoþjÙ²e‰%`ò¹sçU›6mHÝ»w‡9 *—/_žÖ‰yñÅ¡tÒ@ú¿üòKÞ·aÆÄÙ±cG«¥­–¶°xÐp.÷3½ÐÐWÿþýÏŸ?/müÅ_ÀZÈHªgXX˜fDk ô?þÈñ¥K—\wQݰ7D½víZ„®t51XÝÚP7t×£Gb“º¥óïøñã ,hz¿©þZ#³jÕ*N‡ ÂñôéÓÕyâííýÄOŒ1IÌ)*š0éÒ¥3B&÷ññ)UªTÚ´isçÎÍ(¤–§øùùñP~ ÿÍ7ßð Ç\ûŒ€9r É;wîìrwÈ¿ð 2dàÈ%O”+jâ ÒúСC<Ýji«¥-,< 3Fæïï²~ýz¢9â=~üxdd$!5¥ Ò Õ¼bx˜ÓM›6q »¢ZÀ²ÎÍ"ßÿ}ùºŒõt¤,×èrOaNÓ} (ÍîÛ·Ž…xÒ7oÞèèèáÇCÑ;vì£9²zõê2ZzæÌ™DÕªU+-H!žëׯgÍš•0Èi®Ô®]{À€eÊ”á8ƒp/;nÜ8® 4Èji«¥-,4Œ? §–Þ²eËþýûõêÒÓ¢ôó÷ß6Þ–#'½ˆIMrƒÄÉO?ý“a¬ÝÅÏ:t@NËI5W~ôÑGÕªU+\¸°I\b"ƒ×­[Ç)$ÌéîÝ»9þøã»wï®åêhfØ»B… $IĨ‡ÖªU‹c8þüð9W¦L™’1cFÌ O'6T}ß¾}  «7lØpÖ¬YË—/ǬL›6­y󿄹à†4ö­[·d†\w–·ˆ©È"Œ±Iù[-mµ´……‡µ4| 7;vŒÓƒBÚß}÷z* êknÀ`š¡ñ~óÍ7çÎ3Ë«µÖ[³>ÌÊng-îÖ­UÓ ‰\Ù¹sçØ±c±¬YÉ‚žG0ÃÆFKgË– =Œ†'Z‹Õ!p43Û¶m&LШ%jÍÌsɨ^††‡fÏž}Μ9VK[-mañ !ÚÑ„ £«—-[5:ttvD@¿Fè³q ÅAàrq©0ÈQ´+š\§Îx`<êõ{ï½wæÌn×)¢¶ä@·DDDpüôÓOCªÒÏšï©Î›7oëÖ­hZ`æ ”/_åŒ!€„¡Yž¥NŒ7ß|sÅŠšB P®:¨¡nu¤,Z´’áM‹-š+W.d6éA`c84‹OJžxâ Ži,ܼySìd–RºÜ=íòº,moµ´ÕÒC\/îP¿çÏŸ×uˆKí}g˜³gÏšez®;[æ™NCbÆ ‘Pµ›5k¦È1 O=õW Dè´{÷î.w¿t•*UÒ¦M«9ÌÒùLž<ë0räH’A®øøølܸ1cÆŒh]´4¼­9„Õ«Wç_yåÊ•D;`À€Õ«Ws¢æ|”Öro¬ W¾þúkŽ9íÙ ¢%«¥­–¶°ð@½s¹×¡À«Ê2QpË–-‘µš¤árÏšž;w®Ž¿ÿþ{dð©S§._¾,±ý®_¿ÞÔ\*²——‘¨[€ëâ(­%çªÔT D,ê·råÊ¢ý&Mš¯§U«V…ðüñ%K–`Nœ8ÁõãÇ?ù䓨V #‚“'O¢~yœF!Ÿ{î9¥!%Kè´nݺ0É!C|}} @8…i¥êK”(Á‹‡……iók½¸Ë=‘¨8%€ºÇ¡¹té’œéÉÊÈfA_*ç+Lg¹råÒ¥K§Ìyˆ6²´°xH¡Å&jÆ"b?þøcHR#ÐÚ„ ¾úê+±+¼ ‡ÿðÃ:…©`9nçºÍi]Æ Mu&0ôxìØ1ÂÀ–5jÔÈ”)SÙ²e!í ,X°€G,\¸°fÍš"ϼyób5ºtéR¸páŸÜà€S.Âçо¨ãåË—gÈæ'ÍPúŽ;bbbüýýaQÂ@ÝO<ñDÓ¦M·óˆ5kÖ,Xpß¾}.÷¼‘ñãÇs€öΓ'OŸ>}àätdddëÖ­‰ö™gžÁ‚@þ<:µii5‹øšücôÒK/Y-mañ ñóÏ?ΰ+l AÈTÉÛ·o;—ÚÉk($ Íj{;ñOtt´Ö¹èX5uêÔ»¡Ž\n¤¦‡Ï÷Äù?þ¨™É΋ɕcv¯«¥-,RP¹={öܳgú4`rãïІuá^X”‹°ºú-¹®ÍÖ Ì]ÚY‘¬¹Â_f2Ÿ#n'Mš4zôèÓÓòí·ßŽ9røðáZTŽêž9s¦þâ€S..[¶Œø9E0˻ݨQ£æÍ›§Í D¤ÄÓ£G‰'Κ5kíÚµ[¶l!ÙÓ¦MÓ°æÊ•+ç¶mÛ:DÂNœ81Ý%K–ˆmh8øúú.^¼xÆŒ©Ð¿´Œ¬ó yKkÅji )C—Ûg³fͲdÉ2hÐ ñ4«Îgt2DýÅ_¸îLóàʘ1c >Ý(*s¹—ãUªT‰Ê;~üxØÉôK fEÌ}ÿËQ¿Ù-Ëji«¥-,R-´ ÄùŒ;õ+ª4~ít`\ç¹Ü3îbbb¾ÿþ{ãII»úùùÉY¨QefA)~íÚ5.Ê+ˆó/íÛ.oN±6+7§ÒÞfø’[D¤ÎEŽš[(Q—»bÇ}k#øå[À:\¼xQ³÷ÒÙòèiie™¦ÝÃuE~n­–¶°x@0»¯½þæ›oÊ•¨á+‚!€¡_‰j3 V,Í]°ßéÓ§"³@D2|øp*µº¦ÍCÍV÷¨––›¦”Öú°ZÚji ‹d×NüæÎ{úôéF@ÊQžþ2ºT”Îé?ü€®†Q5h(9 ]Ã`¯¾úª1êÓ¾ëC5"©N³Læ¦ÆL˜©è¸„@2Œ{U]‘cR)m¾&lsQ+Ê¥95{И¨xqì×ÿtßðG[KÇjã| «¥-,Deâ[ê 'Nœ¨_¿¾z'6mÚ„„_EGGÏš5ËugfÜKóŸðHhH »sçN×Þi¨5C† iÒ¤ñóóƒýø×ÙS¡^ÿT?k²ö‚?ž'&/-X-mµ´…EŠj×çÊ•«wïÞòngpæÌ™XÃŽœJmÊiLL ­N‘ØK/½dH˜±R°ªãÜ"6Fyª£[æC$Ï#¸Åth˪žK z<©¢{Ïž=‹‰!Ý%zǦ˜½e•x.J®ó‹ÝÑž(mL‰º  €IB„ë¹RԤLjüÔ£¥õúäÚŒ)¿òÊ+VK[X<8ܼy4m|ôOdddóæÍµû•:“å0âÒ»ji(H^>Ô¥pîÜ9qÔ˜1cOv6–ï:f·q­ôó¯n˜ë<‚DÞ‹ ·ZÚji ‹GÚ®N“&Í;ï¼å¢T5Ó#$$„Ó 6H"BÚ3fÌ0S;\îN`)R]ñ÷÷×f¯N3«Ë±ü¢x¡ß?Õ¨¦óÄ n5[[6Ålù- %Z3v)n×αH%Ò$>®“XsKîz%5hir[Ýû9sæ´ZÚÂâji-EQÛŸcHxÈ!eʔٲe‹á[ÈYŒßˆˆ‚qj–1>ñÄ™3gž7ožB:}âý)+fžh‘#á믿6T ÖVK[-maa!øøø9rDÛJ¬ªúU/ÔMÅ$€VÛÑB°â䀀¬N:Î)y†iuáåc_¿®;½Óâ='·í†3…¦KÄÉÞz–“+Ä®fÁ#EæÃìVëÞ{¹˜ª´49@ªÁ¢]ÕäDÅji ‹±ÌFßL´[¸paË–-µ„¼xñbí'›ÀÚCuY¬]»V4ÈÁŒ36oÞlú̬éXëYâcQ4„€àoӦͲeËL µ)¹ÕÒVK[XXÀs–,Y,X ™‡ G9kRô•+WŽ=*Y%i uköèKsóF¥½ÁŽt¹ûxµ'—"!fãÄIuŸcÍôÐìèÝPòäÈšd¨‡Ä9íäüùóJ§ëN7udd$éùN“ažExì6ENHDÂfö/®ÝÄîeìò‘ÔÒšœC¶Ïä¶[{ßX-mañ€ E AYFânݺլŒ†ÖNž<)êñÆçÏåÞÌE+]wœu˜½Z Sm’x/ZZKQ4ÑŽí¡¡¡sýòåË_~ù%ºúÀ÷¢Ém-M‘}4cúF|”èèhÓÜà©WêAw†yóæM“& OäÃ97 °°°xpó:Ó†=xðàúõë©€ò‰Aeܾ};!/áv~×®]ËEM¢ƒV­ZåúÿËÖNœ8a6±œÒÆ3´/匈+B>(ù¸·ÈÿR¬dÃíÎ0¦·ä~×§']KCø°6”××^ÀD"aÏ1y¨—"«±¤š7.›k:ç ð§sQîq}⑞ÇÜji (jíܧÓE‹i|a|ñâE]¤y c؊ػw/\-B€NÏŸ?Ÿ›¹Ð~~~Hë;wR‘5ÎTð¾}ûfÏžª]¯^½9sæp/_>9ГҮ]»¶–À¤K—Žƒ 6.\XʹbÅŠÙ²e{þùç¹Þºukx˜Ä{ì±—_~Ù3¾>ÌkJ»òjAAAz©dá+³ðG6‹S¾&ÒØ&õ;=h-Í£ù”|,EÈ8æ²°°xÐØµkשS§ÂÃÃEPÔ>èÑLÏsjTQ±äÜßÝà˜‹aaaHè3gΈäQŦsCÍdöƒ>ضmʮ˔)T,ÃÕ{{{Sý V¡B…Í›7תUkÈ!üuàÀIÖ|øphh(ÿBÝjw_½zöƒº¹"ïyªÌ™3¯[·N{¬ ´T‘9èÝ»7õºmÛ¶GM›6-ÇD?gÉ’eÍš5M›6åʾ}û wéäÏ>û –æ^’”#GŽcÇŽýþûïr6¢}lW®\‰n,P ’û^6&I/SKóKÚ<¼‡8TL†“¨RÎT9-“ fM‰ôŒžç»øøøðM5,m«˜…ŃìªV^ýõ¾}ûÎ;Ð$‡ãÇ7oÞv¹ç`ÀÔ"qŸ»<èïïo\O÷ïßæoРfýÁäè^È_;žHvvêÔiΜ9ÔqD5† cÆŒ;vܲe‹v3$Ø;3-[¶-ZÔ¨QcúôéÄ^§NžÒ¥K‚•-[ªäFÌ„ö¢õóó3Œjºk-}W$]îZà/çT`#.\¸€I•ºv.&²ZÚÂâaÄïnˆ@¤¥‘dP"õnܸqªãÚýÊHª¿¤ß¤Ó >Úלž={VÝ ð'‘Ìœ9JqjižÒ§Oþ‚‡‰¿`Á‚s¥^½zèäñãÇgÈU,MØ®]»ªU«¶iÓ†0¿üòKµjÕòæÍ+‡H£GFf‹ í´iÓŠ-ª5:ßÌô Ía +ÆŒƒuð$_ñÊØ)r^Ù Èêððp®8 ¼ê™$i’4]ºt*Lù]Gu-,,’¶3D¼téÒmÛ¶Ý»w/ÕPW dhÖ9_Bƒ(äD$ÖµkW//¯R¥Ji\Rƒ•²„Ì—/_åÊ•À#GŽ„èz÷îT®]»öäÉ“»uëÆ„7äÂqçÎsæÌÉõàà`!,,LÓÿàp‘6I9pL„Z[¡u‘®{[S“¢´4y¥î}s…6K¯^½FŒ![f¼üéxóæÍóæÍ;zô(Ö*i×Ñ[-maáy@§òoïºã#**êÝwßMŸ>= ©‰gΜ‰ˆˆÐHÖåË—¯^½ª‹œÂgÜ€~p:•´CK?öØc„‡‡µOבX~~~оP¸paŽ·nÝŠêΕ+>õÔSUªTáÍ*UªT¬X1âA*—+WNúPKε¤BM{øC`úc(Ì|“uþþþ¼¯'ùÊIûØ>>$ôŋ͂wÝà³zFNóAiSð(Zv²´……´´ É>}úÀ„ò>§‹F§Iæ™Àò-«½Å94h$–?þXÝÂÜ“<ÿüó¾¾¾œöë×/sæÌÍš5ƒÉ+T¨0nܸž={fÈÁlhëããƒ,GBøá‡£FÊ”)“I nܸèèh3¡Î4«Í‘YŒLõÔÊDõŠèâŒ3à 5î’ለ˜dÒ¤IÚ¦ö;§iÓ¦­]»¶˜|ëÖ­Ù²eË;·¸¨ÿþPšìÝ»ÒÖv!O?ýô† ø÷7Þp¹wõª_¿>|¥±K“·h¾´Ò˜Å 4¨B… ÄùØcñEÒ§OÏ1Ø,=‹\®aãºuëfîMÂáT«¥-,<¨"•Z£BŒŸ|ò ¢줗°°0(‘êõÕt‚~ø»à8PýÏš]@uo˜îPšÞf:˜Û÷zôèìÙ³ÉüêÕ«óÜ2eÊòÕøÐ=z >|èСK—.…ºÑï½Ó8™ר™oËê‘™3gv¹çXªs‰O¯Ž2Œ±Qr<ãWÄÂ"5@µìÌ™3°e‹-\îÝO¨§Îå{0WœBQS !.~E¤Û¶mƒlEb6lPÍMØÅ(ŒMu5hЀäÏŸênܸñ¼yóŒO{"‰ÕâyÈK'4èÌIéÆÝk.ñˆŒŒœ1cü š…õPõùM´ãP­I¹~ýºº¶œ&"j3è€/Q¢„DQѱÇ\ùäý¦áïÿ;†`ÇŽKÜà€S3.™r  ¹ ";iD(‹<Ùö—BÞ¹s'-r[‹ôÕl1ޝí$0Ö‹¨ …ʪ)‚œšö‘1Xr²-ë ŸŸýСC¦¯ƒzlÎF\h£é:–sIMæããCŒ1Âug·)ϤÊ9¡%ÑöÚÙ¡¤Øä‚5{SªÏ‡Ïííí­>(ùÚÒbÏ,Õ·H=øßhÒBêyqçøµ’VCTTrZ¾‹Oœ8 7n\``àСC;vìHó¶ÿþ°®ná€S.Ž;vüøñ„9rä¾}ûôï®]»‘$8 ~Ñ ÍIù& ‰,T/ëÕ«WÔî𘖖¯oÓA$*Ú/ÒÙ÷‚‘5ˉ |#¤õ^ÔÓML?ì­^íà`–’34ÐŒçn>I¢U7ƒƒƒ¿þúkj\:u4¿+cÆŒ¦—ãé§Ÿ^¸p!5±B… ÅŠCYÉ·¿———fðnذæ?pà@HHˆbNx¢ÿ"¡MuF-‡‡‡#‰„c'oËËSrå)tnY.s_ÁK‘‘‘¼;™@CÀuÇËk>𬨴i–Ñ×××ÏÏïÓO?íÚµkïÞ½?þøãV­Za+ù^eö6ëÖ¢E‹víÚAõä¿fæHKëëhÊe¾|ù´‘¥e`‹$„–Ë©oM-Du3¢$MÙV'he„{reÿhäƒö—Ã:ù‹v®)V^ø‹|ˆÕrçTƒø ìË{„ÇL&˜ƒÅ‹—+WΓZšìÕp¡ Ù²eËhÑ|öÙgìܹó€ ðáÇ÷êÕËßß?q6ˆ:B{A>X8F“9m¥Ý»wÃÛÒÆJ)QVT«V-wîÜZÓ$§]fºP4Ìj7C´°H*PõÄ9šnár;‘¦–ÁÆÚD¾ïbñ’\FJ'Ì‘#GbÅœp§å}­,NÞeÈp‘¦Ch¯#˜ÉŸ’%KÒö×çæ¼døo¼¡†ŒV Ò~Ñ(€.V®\yÒ¤Ie‡G>ßСCi.åÏŸ¿D‰yóæ}ú4nܸG]»v={¶¯¯/Œ€?x𠞘 y]±b…Tú¢E‹6nܨ1ˆÀÀ@óD+² æ¯jÕªuìØ±_¿~2dÈÒ¥K-[$ $ÿäœS ÙIégÂüó´XOý´@×ôßï@r:î™±{hG›ÆÄÄ\½zõ²Ú.œ‹fLŸuS“E‰½Ò¬uôÛ-7Ôm‹äS(0Я<…:R=¬¥ùpäϦM›*W®,åœ={ö‰'>|äÈ‘np¼páÂD´GÔk¡™“p~¾|ù0 ={ölÛ¶-¯\´hÑ%K–˜cÚ•¯¼ò ê½N:$ Aƒ£GîÔ©Ó¬Y³NŸ>mf‰ædóµ°xÄ`œcHDi8ÕéfÿæÍ›pµsú"5÷?nh_T£¾4‰ËðpýEÚ‘g ]g:9o¸Az´yAJÐÒ²qjnÌ›7eÛ·o_˜ªsçÎN?¬$œ? éAÈ0axx¸­± èèèK—.™VÏŸNM ¾T›6müñùóçëÊÉ“'5ÅNÝ â[íS,†NçNÚý!ÚV‹TE\L Tk‚‚ä´|G'GyF/i­$i*>œ:sCÞ©«?qþöaM5f?©¨¥çÎûî»ï6iÒ¤eË–/¾ø¢q걫c<22R{¾çÈ‘cΜ9Z«)LêáS&ΜÉò?O!æ²eËN™2E¡ÑÕ7Ö¥ÓFLùP @~in¼úê«~~~Pé’ó;gÏÂ"©x@Ò×ÙM-sl@S4{Žß•{5!ÄtYÿé¾WͤF_wCsÍÜ3mò.{á]²0áªU« #$îc=V¤H‘·ß~[d5yòd±e®‘D±s•*Uœ}J:–3UòJ›;Û‰ÐÒܸ|ùr„´±¿ÇŽƒ~1ÆòŠù±¤~ø¡··w»víX›>ð¾vºÅ_ áâÅ‹Ú×ÏI0µéôéÓN÷έô`¤¯¿þzóæÍžÙ”Ù3Ð^*š_¡ÚGæPÁáUµöÆJà•aª˜˜ÉlBþÅ{q¯sÇ”Ò9sú"¯BCCûöí«¥ñK3ià¹çΛ8q"Ö¶4:ßó57\î5€÷¿³‹fÆ #FŒ0ÛÚn2cÆŒrÓ¡,Eºté .<{ölJ YAÁ€Ø%5Û[XX$•–6Æ »aÚÎêvê%ÂÄš×§I}T^gß²îMØWÑ"žl3O‰{ Æ%yýEðtãOã~øða³&¨V­Zùóç‡Üœsö’»wïF±gÊ”Éì¤àrwË]¡æfÇšQy¿Àñŵ´üÔ©SìÞ½»Màš°Ú©S§lz¹ŽÒ3f ÕçÅ_Dp±S§NiÒ¤iÒ¤‰Ë½{5%íÚµ”Æ™3gJo«°Qé¸Hë’vå¨Q£øK;ŸÊZåêÕ«š– Q-?{ˆmµ ¹H1öÀÞÖž™Þ&äw„ ÚêÑ“óR(uèÛ;wV¬XQ›E–*U*88®FÛ#kýýýal³“û}AbØ,ôÞ¸qc½zõ2eÊD ´C‡ÇŽ3&I«t­–¶°°°ZÚ dÉ’f­_±bÅòçϯÏ2dÈ>}ú²eËĄ̂…_~ù%®CÂ{áçãÇ?ûì³pþSO=µfͧ<Ž5h>vìXR²oß>ãL@)îƒf‘¼ç4e«PÒ´e¡éXÃÖ‡„„tîÜ9mڴ΢›Å ¬?"™r®‹hƒ:uêPòÏœ9C ~~~ÚÚµkSéž{î9jßÏ?ÿ¬±êà3Ï}áòEc?Ó#çzµîýýýµc¯Ç´´™övèÐ!¸ºK—.”í^½z 0`ôèÑÝ»wç uëÖüR’71†!…œ{·mÛV³fÍ&MšÄz;çZB«¥-,,¬–vv¹ LÌ90ëk\n÷fö]"üœ@°¨h9ÁëÖ­[çÎÑí;vD±³vç1]( äöíÛµ0Êhië_Ú".ÏT§ÿ­–EöÐj;zô¨)®ZH+E4eÊÍØ¿|ù2*TP áØ±cóäÉÓ´iÓ·ß~›wýúuäúôéÓ%™4ß"Z¥J•Ù³gs¼eËdy:u8þðà £ë€ø9µßè‘Êt$.¢´øùùyÞ¿4„Ia¾ëX³a%ÇQQQ‰è—æ^*lýbkôvTŠ &´k×®C‡k×®U[Uã†VK[XXX-«Ëz}zÕªU5ËbðàÁ—.]Ú»wï“O>ÉÅFWoM›6}íµ×(~ÚÜðÓO?%@Á‚ÕÜCD»Ñ¬Y34öèÑ£¹…jˆxΕ+WÞ¼y *¤í„ŒÆ6 ûðà f?Ð#Ihùt¹çBôïßßÃZúúõë$K“ †óQBCC›5kF€ž={nÛ¶MÃ|zùÑ¥Œ=õÔSèp>Ê–-[–+W.‚M:5S¦LãÆã͘1ƒ–,ÅrذaÜ‹ü&Xž=[¶l™3g¦  ŠÑÕ*lÅÝÈ;·ôµ@ÅUÜ©S'㎌F.1èYíÛ·GÃTsÃŒïDEE}ú駤áðáÃ’ú˜¸í/ «¥ïù$sæÌÏ?ÿ<iÇŽšp¸gÏþÕ~8sæLÉ’%9FM™vTÁräÈÁ_ê‚VÓFÖÞ9ÜÉÔ5ºK‹ßoݺ%ïUvš{e#”üêÕ«“ó4v7nÌ72}ûQQQ*¥|&2Ü”r1lʘëÎ\k§J7ÿ¿sÁ8#Rùرc΢è€h×®fêÔ©.÷îáeÊ”y饗®_¿Î?¸a—eY-ý×!ª‘kkÚ€W®ÀÒY³fáÐv£àÑÌ7Ã%Ô6Qª!m¬Æ©S§~wà ‹+§5j<|øp'Ÿ' :$‹°k×.NK•*•={vÍPýæ›o²eˆ¸Õf…h’$ìMMÆ9r,\¥JseàÀ\éÖ­ÛùóçsåÊÕ£G-–\¿~}þüù›7oîrOÐ 7n\÷îÝåð¨_ˆìš6mZÅŠû÷ï?`ÀÓƒ¥[²dIÇŽ1»£FâÆµk×JŠ£¥y/»Çô½@[ªœ”/_ÞËË ÕJá¤ab&;‘“j³˜[œeFFßhŽÉΡžgÊF,íDH>½3°¾ IºvíÚ¹sçÌÄOCIëh¦Õ¯_?_¾|6l Œ¹‘[4O›‹šedaµtâ€!Ïs -§ÚHÄ;wrLQ4=”mrƒ| aKJþº¯' ‹ õÅ9ÒXó$Œ¨NÚí?»téÒàààZµjåÉ“§L™2ê×|Ô‡]Kÿæ Ýkü>!wyñ‰'’ž4iÒ,\¸PkI׋/þÝwß5jÔˆã>úèé§ŸÆT)RDjœ[ø.œbPLNR~HôÕêի׸qcî*X°àСC±w³õƒ-Û µkøj5jÔzùì³ÏLEpª\s7cÉsí.Á_ÃΑâ|kyÆN­Kጭº¾ÕHxD8ZbñâÅ9ú=z4×5i„f©f™íx„ÕÒ‰€)B”7xr~î¹çŽ9¢12ŠÙ¼yó¸(gþH<ãP࣢¢’Ü0YXXX$-¤"üýý ‰%¡¦]±b…æ #ö$^~ùålÙ²•+W.oÞ¼›6mRȤÝÈ;û¥y®T­ƒ¿»Á+“û÷ïß¶mÇçÏŸ7“ äcjذar±{÷î7ß|x&ÀñãÇK–,ùÌ3ÏhBlÑ¢E Icä›o¾á€–² MõÆo™ýúõãÑ\‰ë?Ä"¾¶´.eC+Òä!k®°ð5Ú㎦•ÑwN¼¹víÚÅ‹åØœÈ¹…ùLÄùÓO?™u¦g§´¡h)û¬ÜÉ!鉉‰)Y²¤——ט1c–.]JžL«$þüÜrôèQ#*Tà1| $ ZýòåË;wæ¸{÷î’Üò Ê–-;kÖ,£'u„ûK>, [Ô ÇG×ÀuëÖU¬X1_¾|”Õ .˜Þ{»%„Å£­¥µªÂðÿ™3g¶oß.·¨ðÕš5kræÌi¸Z;yåÉ“G“=@}úºuëxbéÒ¥ù²¯¼òЧZ/yNÿÏ*óZ æÌ™£bðÃ?P$(3Ö^[<ÚZú®s{öìíÛ·É@Ó±-Ó^áêÊW¿49Ì÷ÒS.]º„&”§n„ô”)SŒ7BžÈ;šÄðe öÔSOÉ7l*Ü[Üù‰·nݪ™äÚÙx÷"Çdx’ÏÛ·°HiZ:.äg‰@,ZoøØcùûûË™$d’7o^M™5yP_=x¢¦¨%<ÿJÚ[•=>ÏŸªÚr× š^…¨¨(ç1/Ë'pNt¨¹.'šM±-n•¥“'O’i¤üâÅ‹ˆäŠ3 6ˆ/Χä@– ’Ê4ÖߘEg¯áo»aYÂYÔ%–(¢|gæðÑ5®M 'Lîb‘0Èp¾…ZöNrÞ>}ú´\v¼óÎ;¡¡¡0ßúܹs[¶lÑf‹%K–T×4¥‚ëIût‘D!ùúÉ'ŸðDSðD ÚôùQý¾²Aˆm-Q\±b…lо59sáÂѯ™~sW3AvÙ«†ŠTe‹ùËiÈRñD¨[ å¼hV› 6&6}8A_tCüo GŽ¹ë·“Ws¨›"§) æ/žXªT)²bÚ´i©¼â“Éä0´lr³hjG¬OÌ_äj*Ñð˜ht6÷ø"3fÌÐJmii¾8"1uêÔüùóóh___Їj=õèðáÃÈé äÎ{óæÍ)MK;]^chDb{÷î…ñüüü‚ƒƒÃÂÂäg^”hŠúºuëªT©"b §¨ëq’åÎ b€V¼råJJ^Ê-Êå5ÈÃwß}wذa“'Ov¹÷Ò5jÔüùóÇ7qâÄ™3gbúÉ¢ñãÇŸ={Úœ={6`ñâÅcÇŽ}¸‚'ÿ)„ â:74h̘1&L !òmÛ¶ç”)S ؾ}û9¥hîܹwhÕªU|þåÞÞ½{'åü³Ï>sîýÊ·#ñBÕ>Y’Ó–%œÌ¬IY?¸¡ò7‹œ^.-v-=|øðŒ3¦OŸþË/¿T§~©,T(m†èïïov—{@ZZÓ³å/UiiMáMwïÞ-?!õêÕ3›å©¨F–£iÃ×Ñ®.°P(Ç-Z´0®W0©/½ôvªyóæÚz[½XiÓ¦•㬪U«ò飢¢*T¨ WÈølÙ²åË—O^J¨æ°%÷z{{sª¿ä7à¹çžCr8p€»´#$¿\Wiá§NB*ëAeÊ”)R¤ÅŠ#<Í%ÓÝaŠ“éî  ÀùØÍJ•*ÉÇ ÕÒ’ ^^^|²1S¦LÒQƃ6ñúõëv¿òGUK‹ùEQ›jÕª¥GÓ 5³©QDXŠ9rh™sŠÒÒNe+Ÿ<°ß|={öÌ™3künåÊ•f5Ф2¼‡4[Ó*~nç•Í4ýôÓÆ‹*Tˆ§óuNœ8ñ7Èd¾5)‡«Lžj=P%lÙÍŠªX½\§]œä›ßY$£–~çwÐÒ0sÜFõ¥fÍšÔß–-[Š”’°í©Q<ãR˜cšo:tHmZšÕà`ÇŽåË—G|6mÚÔ¹RkBe#®]»fÌ„É(+ë`àjÕª=óÌ3]ºt™4išö»ï¾Cô¢`[·n½fÍš%K–p0}útHUËÿ×®];uêÔÏ>ûlãÆ[·n]·nÝ矾aÃÅüÅ_ ¹¹¥ÿþÜB`õT¨®vcÙ²e4¾ùæbX°`¶€‡@°æü5þüU«V-_¾£©o8†xIŸUlŒ5ÔÁâÅ‹Ñöhu5ßÝô>Y-­F $€¢Æ,'ðš #PlTBœƒ³Œ–vÝ”9r$Ï ÐEÄ îP`$DÚ)JKÇššÅ½ˆFšêh¼°°° ÙF­>®¸îÌ k×®ÁPÔêÈ5r:::Zœc[àvø'Åzé'Ùò¢ß¾}{ÕÜ®]»®_¿(9L hذaºè™mﬖö°–ÖÆ¬ÔP-¯ %«sƒJD1ÐømÛØ/-éevz¥eM Qƒžd)­ƒ\¹rQì–ràLSÝHl<ÿË¥Û¶m92C† •*UrvºÒŠO±>‘¾%K–„ZѽꟄÇŽ«Jͧ$z÷î Oª«¬¦šËŠù1—fi6-ˆW~]`uLg³f;ûî;J‹¦h"§M—8­ Ã!¸A>ŸF€’CÓ<@RÂ_˜Ž‘| ™õ‡¤ZW®ñá‹/¾Ð@°ÑÒN!mðæ›o¦ÂµQª–†šh=yyy!½¨zTR‘ÏáÇ›4i¢ MfTd÷¤z®¶ÌÖ³ôKõïÞ½{jÓÒbQ¹zÓÔª^Z·n}áÂõ?“]ä?$‰¼äW"±ÊGùöÛo1IÏ>û,!95ÕÔŒ,²Z ”œDzÂX×I€v?ÇÒ!¹*ƒŸ• (Zœ¢ávTº1ô*«2š¤Á9ê7{öì‘#G¶hÑ¢X±b™3g&µDHÛ8$0OÃhb¤sv¥ÕÒ2Xñ­¨"ÌüùóÍ{Ëœ¤–¦‚S³4N!9ÂPLSÉ;ï¼Ó‡NÛ±žj)wãÆ“_)˜FŒð D-Ê4Ñô1gÎývxàöíÛßxã è«7Ç“Ü0zôèÕ¨äf~âì¢ÎãÇwà uÆï¢>5kÖ4DžÁ¯F%Œheâ_nÑ"…tMR…~¿9åÙgŸ5‡'ÁÝß/_¾<#›æŒ!ö"Æ…‘*Ìqs˜6}•½òé§Ÿz6ÿˆ³îâu9޵Væü#Üæ»ï¾ uR´{÷î‚9p\P7­óÁÏÔ^# „ñHNls_wÝuÍ›7Ю½öÚË/¿<~¨ýù•W^Y±bÅ)§œÒ¯_¿ˆÑWi8Z”`ˆ@ƒsòj®›ü×ô"@§ÍÔð믿zÚ˜Õz€^°qãFgÔ¦M›ì¾‚–O<ñ_ÿ·lá_U{ï¿f‹=ÌEt(úS>Àý[¶l‰ýM~µ`Á‚°Añ_Þègf ×§OŸtn¯Zµ áD Ù GO»;Õ©¿€<ê­·Þ*Y²¤Þ8¼Éb Öjp9Ch:ÙŠ{î4Î6{öìôÀ&*ÏÃ? 3 Å‘ ¯×BÁwŒsiÑŸ³ÖL«„¨u!›S›…/¹rdYîÅÏ G!—þ»å›o¾A{½øâ‹áŸ¬G×øÌ|€÷JA[·nýí·ßz?#DÇþôÓO Ÿ= ʱœù/£©¢´xñbžc•À£§¿þúkfˆv nþøãAoEö[Õ«W3¯@ZÍã@ºSE‹Dÿþýyò%—\B+¨°Á«‘¡TŸ¬_¿yáWþ'1™¡–ˆ768^Ñ¢E q`hÙ>ø ¸\³ÚCž&8L¼BüI-ìR–›6Ò#Þ±¹îJ8”O>ù$4Ò 9Ó¦MS'寇 Ï9çVV¹råÔ³n»í¶]»v€ÙeÞ£GÞ¹k"ž¤ aˆCÜŒ;¶aÆ<ðÀÚµk=xÞ¥KžÙ¤IÁ¢E‹ Öz}¼öÚk`]ƒ Š;wò4Ó——-[–q™0aŸ;tèeÕÁ#`ÂWኀ¡{s ¥²¯dwäNŠ“õŒAxjrq*œŠåHØÔx"äx&û|š#[ÛÓ½ &\qêI‹"þœÏ¡€§¼ŽÑLŸÆÛS§N½é¦›îºë®tËØ¶ð+ÍÑzžœœæhƒoÓ|Vb˜>´ç—*UŠ¿Ÿ}ö™ùß´“C9ÉÞË\Ú½x zså•W¶iÓfïÞ½°µÛo¿Ýpñ*T@ߥ£€uK–,q3èîréÄ6EÿxB)éqé?ÿùÏÀ¦GÎ?ÿ|H”7§;t ª’"ü:øÀù9wÂÃ…nµª˜NZ3ò“®ÈÀxpM£wjë0%™_ÛµkG+`ÔÔœ:Eg²‘@¨˜R¦xñâPš§Iõ$älû])ŠªW^y…®K—˜ÌBNÝiw‘fË/ ¢Ï…¡«§—vÉÀëŽRñàÒŒ— n÷êÕ 0gÎÒS‡QÎ=÷\%5ôÊ}Ï=÷¤ ©g`vA_-¨y û,›ž`³wüøñpcä2ŽFmݺ•¹Š²P¯^=…HrK ý‘;™ù°bnŽü#W_}õ‚ 2Ùö@‰%êÖ­ë < BnvëÖíÓO?…½xæš^=‚v¡ƒ' 3dîܹ&´jݺµ|بw‚'=© ´vÝuÙÂï4«``©VŽH5ȺְO£ ¸¡°6êl&蠟&k>k{ñÕÔá‡~p¿ “ ÞEÉäE/ä9nbjѸ‘ÚÖb(y‘D%Ä9ÅNNB˜.Ô §"Ú|¾•+Wf>3dÆ9´Êá+4}³\:Ý:th:u:wîìToÒ¤‰:;uêÔªU«‡z¨Q£F|¸ûî»[¶lÉKA!¥ù!¼ú ré¿[\SL¾ñÆ5þ4mÚ´L™2õë×G¬|ýõ×mèhˆi8ÂeòvùÃW§éËÁDâžyóæiа‡ðíÛ·‡ß5w®_¿žþË ƒ(’3I>ÿüóØ={öL˜0Á‰´'ƒh 3yàÀÿ™-âÉ믿np¦å?þH%™™€üIÅȵ”ñºw`¼Ä?þñ“'OÖ6È×G ¿D‡žžWæ€I!¢Z‹èäXY[¶l9JviT¾ÒÏ›7ož4i’ã¡Ó+V¬`AuïÞõjøðáÏAƒ=ÿüóüåúo¼!):Ú…º!5Ð‚ÕærÎYä—ALïиµ|‚`Ï=÷\—.]{ì±;wFL'P¥_¿~<ÜÜÙ´ˆ¶KÛ¾úê«>}ú °Ó§O—³>üðC¤Õ¸qã¸n¶>i$«fÈ!è«sýõ×{F±ÂhÚñ[Ç͵£<„` 1B¬E¢G™ý#òŸ(Ü;v¬X±bd¨§9M›6-Q¢Ä¤I““/¾øbÙ²ež§?~|Ù²ei&ZÃÊ•+Óä2'OñD|º|X‰¿üò‹ƒÝôçoz¢ÇIÂõaÆ!©S§ú‹&»‚ÙÎ>á‹9=–Éæ=J\š¥Ï”KàÜR¥J™Í…Êyß}÷mß¾=‡M1â,ÿãÒ¼÷å—_.m¸‰ƒÜõô„ZN€&„*M€„üÝÐÐ978!L.¼ðBtI½›ö›IüÐdÙ!”§Ÿ~š*=ùä“ZÈÓuëÖaƒ¹´víZ4Ý/íÀÆka ð¯™¼³'ß~ûí†lჇ™¢¨i\`hFÃc@ozãÃ?ä«Að¦M›ÆópÑWõë××4m”§1cÆ„í¡Ó` ÐÁy7 Д6>|¸––-[¾ñÆqηŸ„@á)Q4N3!íôI$wàƒþÒ|îÚµkÏž=#K{!ÞË\:¤3˜ ÚÀg2ÙÀD—_~9’÷›o¾QL Ž]¡|5;a˜Óþ”B.}ðbNm7×@?¸Zµjºµ»3¸mÛ6ldfaød¤ ®a7<|ñ ô—f:É$·¡ÇêvD¶ìv³9°d?ÿ·û·`kqÈEHñÅ™i |p¼Ù³g—.]ú”SN1 Á'Ÿ|Ò°aóÏ>›IÈ•wß}·B… çf M‹ëIEØÒCÜ,†A ÒîÙ³Ç:ñ_‡QÈð-Z´èÞ{ïÕ%•ë—]vY‹-¼¡wïÞ:ur‹¼°rѯ†åÀ_ ð(qéԸDzl·nÝZ³fMÞ#b2<öØc|fÉ0èÎ#CF´iÓÍ«ÀÒ”03Y¿î}¤P¿D¢LÞù8'³Q©™·?üðCj©“%Y´‘z8ä<Ó÷^ñsƒíï×:]t; `)ÿ±Ý»wù®»îÒ5+vˆÜïK¡8“wÒP‰oÃã4bŽuׯ AdøòúòåË ¸eË–n¸!ð“þŒ(£/±±E¯Fü.„ëȃ`¯êLø ¥À0MwÜqÇ‚ Ü>;i£ÜÓö5kÖ,Y²„þ‰Ý Ç ™ãÎ_8˜®æè,•+W¾æškP¦Daú›c–K3:±ƒ“qÚ¿öÚkøÃ"5üرcÇ7lØ0ôÐ7ß|³OŸ>Ý»wŸ:uª†PÃGBý÷[ ¹ôß-fw§`àÀõêÕÓ4]·nÝpޝ>û쳫¯¾š9²L•™3gòÃXÈ<áÇÔ #¢vg’=ÁHb%J§^…âðÿw€’JÆÌßóiРAñâÅ!öañp¯vÈ!—^zé„ øïÅ_lÄ~ýú9K™xÂòE]tÆ&M…Á4𘛇‚ÑM˜qô,’H¢}Üxã!:¡^¬h~Ý¢íÂô7‡S\hóÐ1“MNz4¸´ù›=—oüñÇb–6«¦D‰Æo1? ÒAÃ`ÖŽ§’Á$žnyP‡Å‹“5¼°rÏ8ã Dª1ýÃNi˜ç^ ÆQœI¨ˆãoªøÇ`ñsͼ(MÀdX§çŸ>K-ìg %Pœ¾%¿wï^Øoýö(ŠUåâûï¿ÿÕW_…aS˜ ëÇŠ+˜Š@tÿþý™ˆ ³ç€¢íÚµá#ÛýC5B˜š¬<SÞË–øÊhòX¾¬ž¯šwh­Ø°aƒÚQßÄí¢E‹†vÀ¸Ÿ„¤šŽÝµkW§NÒúȯ`üºë®£2&aiÁY=€i`dé+®¸"¦BÁ øW«VÍØAÑ'Ô$Œ!'¶Mc¿…î2 ´E±‘ ‘îÖ­Ûúõë…•åiÓ¦±  mÇÉP˜œEŸ¶mÛ%.Í‹X•¾Ë˜f|`q¡„^ýõ¨Ÿ\p:Ôi§Æß‡z¨wïÞ½zõjÔ¨s E‹­[·6Ôü!ý XË̘áøñã]†±o˜Ž÷4høðáo¼ñFûöígÏž„ÊcÎ|îÕðË` }òóÏ?Çöz¬²#Hð€Äœ€À\¡7èºråʉқ6m‚-{X›î…Aù“z‚Ìß|ó P,çâ¾l±†\ܾ}û¶mÛ Óh%b‚ƒÒ2[žlÞp4nÈRÙÍ{‘LöH87èæñÏÿüÏÌ®zÆßz8]ü×€£™š"Áÿ{¶ð¯Íu*F•¨<÷óœŽ;V­ZµyóæÜ@åÃÙƒöêþwò`ŬY³"`© ÎW™†Õ‹1ŠÐÜUªTAbf²Ge¯¼òÊÂC.GÄEÇnÞ¼ƒ[‚Øà˜¨3fdò¶½[˜ö¾‚Õ=sæÌ=z`¡|ùòÈbhϳÏ> öíÛdöC÷îÝ!ð,óCŽÓó¡9Àï2ü)ØËJLm¤6‡¿ã¿=üðôšæSI4åøü‚)±ÌmgI½ 3Yân¸n9ï¼ó5zƸO|f’0¦5!]¤HXiê]wݳÊäÿ × -]Ÿ}öY;æž¡Åã¥i@-~»gÏ÷a=ßÄØOÏéÄÍÆÜóÈ 3 ?øàƒK—.ÕHõïÿþïªrüdÑ¢EæÖ XºtiHuº9Ë”CƒH4ŸíܹÓíuŸpÇ÷8—cWzs|epÿœ-†ÏUû®]»6èݦM›ýþ¶°üÖòÎ;ï\sÍ5NZflì »t&9-.‘y ¾ì²ËXbïe9h„‘}Eì¾C(êÑÌ7gD€G0Î¥¨r‡—Î:ë¬[n¹¥ÿþ!Ôíàg`ÜÌrÂëÆŽëö Ñ $*ŸßWä0KNF’©S§j"˜3gN&/y±À‡Î<ý§/´éJù¯ƒñFøÊEî‰ \N®ó@0_ï—Àà &T¨PÁ 4ÞÂ(ÀÊøI„11©–6>ûF]Þài&«mèã(žŒŽÐÜ«íð …ÄΈ‘úÂêÎóOl^4œ6mR8 \ \ÀŸÃR¬X1®@ŠB®!ß¡Ðéµk×âíáì E‹@šTëÒK/5µwX#5êNÆç@6ˆM¥J•n»í6MÁ¬÷4€¤3_intâCx/dï‘G‰<Ç=ŒÒ£|÷$UêСÃgœQ¼xqÔ7­¬ «òÎ$X‰–ÐÎ4&§€ïèW¯^Ý|¸h¢eÅŠ›5köñÇÓ“±é7®ß}÷݈Z>°–Ó<îf²ÇäyQÏž=Ýeâ}÷ÝwÏ=÷\&qÕxë­·"…P‰>“ç§Ÿ~‚Z;>‡üÜ‹_~ùeÇŽ©ÀUW]µoß>TBX´ó Üfzøá‡­Zµbz_rÉ%5èM¿üò œÙgR%Äß‚ ˆMš4Y·nTœùéÿ“Kç$ËïBÉC¢›0Fuã7¸¾ÿþû€x‡SèXx©¹IûÃQâÒq˜4“ç#¡q/@›•ûí·ßzŠÁDóò+n–xhtEZÎ\b½³x‡ =>—Vå2dÒ§OŸ7¢¡C¨æÍ›ÇB¦’²5]A `Í2Ãu÷õ+PóÔSO™pÜè͆GœØK)ݽEÞéÜ>bÄNo„o$ ¹˜!†^"sY˜F4µc‘’|ý"[øÀר3ðrnÞ¼™_¹«øÀ¤JÁ† LÜ£Ù³V­Z³fÍŠn÷Ýwá´6ÜE¦£,‹føx£yùÀW.*x×—Ùb ¹8sæL_ÐÃ;vì@Xx†]/_@[êRªT)è4¯HMC–ä„GŒðl ¿#³Nà4“ÝsWM´ëÔ©hÓoÝ»wgŽ`.“­0» pIƒ™.½óÎ; .tôíÛW»å!ìOÅè¸úX§²##´ôïß?µ~°4Ð= a¤ùñIÚP,Y²dðàÁ—_~¹°4@1dÀ°Åx-[¶dá2TÉ ©[‡bLé"÷ÎRmáH'¸¾~þùgû .]£FH$½xñ⸟ŽòÀ‘ dçÎË ‡Ë4ÒÍí< ?Œp¼wÅŠ)¾ñ•9‰šŠZ17R#'XºtéR÷¤¸ŽÆCäÜFY½zµxî —M›61«©bâ /´è ±Cá{ÝOß¶m[×®]ѪÎ:ë,&*s‰™sbûüÜ.IR·x³ö¢€Òò/ÄÙÕW_É £{3…ÁÿÄÐH 5µ=ÿüózÝŽÕ$˜É;þÏêàu×\s 1uصk×c=V¯^=íÒ¬ Vº©¸Ì²‘ùÛ ¨¿•ÆG=âÒFyzùå—Q+æÏŸŸNÑj :JqÁp§üt”sû1šÚ.”zd_­ß²e ÍKSßcިߎ‹7|•p&Ï ÞŽ†kn Ãÿò—¿ÀЀ_z2 ÈK_¹î„Ô—À¼Wümß¾= ‘‰ÝÝ|ŒÃžŒ,RÞC‹qp5ÞèE%¯½)‘ù…Ù¨YÆ¿1¸Ú«÷ìÙƒ,èСƒ–ÀœˆpT€†Ÿðz}N\Ó­5ɘ)毽öZtR´WhšËÉKðHY?t7Í÷Ä¡(‡l¡5P¤¤úì³Ï†œL›6×Á‚Ða¯»î:¹´:”gH‹R+·‘H_|ñÅœ)—åǎ‹t^Ìå*Þ Y\S9~ 4&Éú\ 7˜É“'«õ[FŒ‘Éîl¦T]¼ô-ÄU¿Ù;v0© l¨™Ë¤„` ® &ƒâ¶cg@QÃGó_`ß™É<T¡çü¶U«VÕªU{î¹çr¦P‡Q•ÓsŒ¿¾æîè Í5²jÞ¢E a9@éä´Kç¿ó@(MÿÐc7ß|³î1+V|òÉ' f“ýD-Rǘxƨ9JvéLžW@&ÏÁzÓ AÞ…¥&ºU+VÌX=¬ÐT·5áY?X×édУÄ¥uÞ€Ây晋-Š_éæZÖZ^0\:•5¾ÁááúŽ;ºñª[Eš´åˆHm?’qÒ'Ås!×-q‘›uíõ'“/OG|5øUü089øá+0xðà¢E‹"Ê–-‹vS¤H‘x€ÛöîÝkYÅíà•‡ÈxåV5^çŽyŠ6ÈL –ÇrÚ b뱉¾ös'çIµG¦oLNÏëÕ™®é«&Mš R|ðÁúõëBîá(¶'¼;w.%>T©R…e2f̘C~¾îRÒ­šðóÔ©SG‰Ð®]»… N™2eøðá3fÌ@çE—!7lØðÍ7ßxVâ0}-&NœÈ‹Ì3r n˜7oU…›E|¤û 0c𣠅¸ìÒ¥‹Ç7Ö¬YqÕñ4îÚµ«]” gžyô®U«*-¼Zµe[¶l)S¦Ì©§žúú믻ÙÊ «V­ ™Ègç˜!‹áÞ›7oxõ‹ã]<œÑ7Ø©–m eL§Ý»wsCHæ¼gÏSÍ;—+lšóm¶H ¸mÙ²e]tuƒ˜WKY,’ßµ#9îàðK/½T©R%”‚8H~riÞ…½ÑxÕ('a"}¥’¿`;\pAá¦á¡¸r$ÀŠ5¥›ÇQ2ø‡ó3|xã7<AÀK•*Åò9í´ÓXø ®¼ÅSçœsέ·Þ9›~Sa.1ǘW‘tT9ˆ¿4S®ÿþð7óô§ kŒûnníÑù—ùª§•N³ª ŠäW\Á*€¨ð_dµ:²ôžgŽ?¾e¶,_¾Ü‹&à ƒ„ðÏ9sæ¸mä^­Å\3±a*ÿoÙâ¼â"`ûý÷߃¥zy™4<Âò€ØÓ§Oߺuk½zõ©I“&žÈóì³Ïáù—„J¸›—†'Ï×_MÝT´?ʧ7ù ²€ûµ·ó¯\¤LTã½÷Þ3ýO£™L’4[3°U«VTéñÇŸ}ú@]Š/Ž„: ¹´çîY‰ z¬‘àÕš1íFµT%µ½ê^C!ÆN MÄ™ÉT2dÈQÊ!žcí”̰(`ï¨Ø¬šòåËvéöÛo €Í‘#G‚«Ï=÷Üðáß~úiî<´¹Ç 5䂌ô—_~›ˆK‹Æ +W®\z¿ýࣘº¬ÊñÆØªQiº¿)_ÓxžG¤,]ºT‰ Beí  ûøã£íö×ÝæˆÅë9ÄLž»ÅOÙ_­- £ÖÐáV'\»¥Û¤IÅ4o¼é¦›"È÷@Qß›6œÛ"¶^&9ó_yZÌC7ÍÓSLøœÆ3çuã‡Õ[±Õ«WÛdí6'°}Œ.Òj”Ⳃ•±ópS²¢–Á­Y³æm·ÝæÅÁƒG$®Ârýï,eæ€ Ê ñ—_~™ÿ¦é0þñÂÉ[´=ºS§NÆñ¸òÊ+Ë–- >ƒÉãK/½4mÚ4T]^÷ì³Ï"2 k–ÉwÜé)ûöícAQa@lܸq—\rIïÞ½YkЉGeŒ6Ï:5Àʼníà¡ÅØ!YhcÆŒ¹á†t{kÔ¨£¯5LÛ”÷ñ‰¾b¹Ò£G ¬\¹ÒÃ#<¨ýßõK—Þwß}Õ«Wï½÷ òŒÌÕÇ’¯à3ã®[?™7o^ÄvføfΜkß‹„|:t¨{—o¾ù¦aaRãC(€‚ âþ‡~à½L t·»îºË)Í÷îÝ;uêÔ?þñÑ3/¾ø"ÿ¥i2"ÉÚü-°<Ç—þõ×_W­ZÕªU+(Á<`¬øÅ–þ69èiâ }<§Ø{ô­œ‡é _u‘˜#º±ÝX¤¬ ÚaÇPÆMÙìçà å‘:‡€ü“'OÖ½Ðõ«Ÿ˜ûûN×^½zuÖY~U~kc†!êŒ3Π9Ú…2¿ÝU,œm¸=ô6lÈó«U«6{öl:„~ã¢Lø±ÇƒY©³цÀOshòuРAq’È\ã¨x”˜¯f+æN0–ßnÞ¼Y7fæáܹsEé+V[fΜ9îkó@¤­ô~À€¥¿ËϪ¿ÿþû[™3t]ÀùCUÁT'nÐÞÅ=ãLJÆ;©¨ µZ¾|9Í‘ŠP+ä‹{(©yNÑÝiU»vmºë©§ž¢ói&òú¤Í,ö{­ÓX€|5TiAré¨ËNå¢`=¦´Cd2—N-“`È’%K ˆ¬b&¡1ÐB;s9wïÞ½H‘"`Ç ó¡Vt×5×\S¦L™J•*l9“·ì›gxÿ® q¿8m)8Ó¡C ìÒK/Zµ!ä´‡•üêxÅÌ1Û©_C/v|åÆ +È@ÍV):uŽm¾¦M›V­ZÁªK?÷p3 úÄO@°ù׺u뼨òŸÙ“sòaQ ®ð ­ú¾ËÐaÜl+\×uGÑcä•Ï:iiìØ8¬{þüùt "ÀCˆæXäæTšh»v;㸓þv)øÉ'ŸT¨P¡J•*<òHa¥žK;ô>6²oß¾ˆœÎÅå ¹¤TZY8è³µjÕêß¿¿kö@\Z§_þ¹JOà'¸ß‚T:ÿüó‹+6jÔ(Ïßé>÷sQ{2="q[ß¾}Q~ãi:ä… q«V­x~ÇŽÀ/¿ü2“u·ÓèÍàþéOB4»êƒ*KDÕ²Ó‰ÇfŽ¢{õêå¾³òB·:·^ãþÎHHÀdpæùçŸÏüí¹!E[|uzÈ™Ÿ;wî\³fÍ AƒV¯^ÍÛ݈Ìä A` Ôüôà/:fxª+ì`_|ñzh5jÖ¬IÛeJÚó ±ñ¤âÒ‘-:“~§K—.ÌŠx€Ù2vìØ>}ú¤Ù÷Á(ñÙTxQo_ýu³ë8gM¹‰/õ:f•;ˆå–-[€V”ý–-[zQo(ê FÑR½©nŠ€œÜo8‹æÍ›{2úÌ3ÏKƒøÁXcåíØ±é&#݈nòùçŸÛ<M™u¦ªmÙ•d Á:“ϲêwíÚõ¯ÙâÀž={R8›Q©˜Ñ]œ¥çž{n©R¥h2ÀËsº‹ëöóÏ?/X° ä˦M›6lØ ä" ¸Çc,Îð­[·"D¤»îO™2…Whç{ÇÝ´°3fÐ4Ÿ©õ¬³ÎBʯ_¿>;ú:úŽJô´W7É9 rŒê¬ø;ï¼óhríÚµOlÿðB.ãžÉ¦ñzíµ×5jÄ[n¼ñFûÒ¥KGíŠÖ¡‹‹i¾Ñ߄ϾhåÊ•h¦F *äÒÁý~ýúöÿu×]ðB5Ý&cÜ¿ûî»èŠ÷߳롧vê‰qZø;$[âë¼yó@iPß ¾._¾:ÊO~üñÇ9sæ€ô¼2š‹0yšIU:tèðõ×_ƒçܰvíÚ%K–„?Gv¸ËüÊ+¯ §@Kˆ4óä£>Z¼x1õQuÞ`§OŸ®àg&Ož œ2% +V„Æ£geòÎh,[¶ J`|Z."ªÂ÷ƒG™¢xñâh´.Eüʰ0ÑÃÇW[SŒ¥¶,„¦p.¾øâ¹sçæ÷Bl<©¸t˜"AÑ«®ºê¢‹.2(…Uèi0f̘CÓ…‚˜|eú±Ò]Aæ àòƒÁäÅcs¡9dÀèç¡¿§£tÀ| ”¬©·¡¸¾•)S¦dÉ’ ôôó,¡ ¤àùa×Íd3p¥ô믿êÕŒ, ¿dKبjYî›o¾‰zòÙ°NO?ý´BS˰(Í+@lì¬Y³2y.dÑvîüðÃSÃNëKß+’§ÿ¥Úq%+¯ÈÑéÀD›ÉJÀü§žz HOɳÎ'QSZH§-ÇV AÜ{ï½N6s–žK³š>þøcóyy5–I>|øp ¤aúí½‘J °úì³Ï\æ…>9¦û]»v»iÓ¦éÉ0äË/¿ ojŠÃÅÃN:A±ëÁ¬©¸tØ-Yfå€ÅuîܹAƒ*V[ ¯\¹ò¡åórÏ=r±eþvO'b¦e’À›Úuœ86sp¤›ta¦ôïß?…þ”\0xú+¾¢Ë;VpŒõÁ( jaãŸ~ú)÷7nܨDà wˆ=mqSOhd®&úÈ8ÊÜO>ù$Ý7D¥^s;wíLvó:3ð5dW–/_œîÛ·Ïæôë×φtíÚ•7~þùçk×®õ9Ü0bÄ%ï—_~ Æ–(QböìÙº=£ø@³5wÈó¡ÔÁ}€óøñã=”áXÓ"¹·Žè†#àÚ†{Ú óæÍS‚kߨ°aCÀOƒcÐÿz³É€ážs÷uAõ㈫ñ ux¼`ÅW_}eŒÊ§žz*UÄ QôÄæÒ¬‹"EŠ@H@©/ò_` °téÒ&°Ëä9»‚9%?LúxD—hàÞ¢E‹€z€ ƒ¯ðÙß7n\¸pa(#€ÞâÅ‹uºƒdŒ`l‹‡\54ûA Àÿ=zp¸û&[èstés^=uêTý¼Ù²eaæÌAl¿¾sLE£Úz^•9²áqn Jæ°ÐÊ»˜on÷íÛWH&ÈáwìØáá À™6Nš4‰'S[M%[¶l¡&Æ$מ¯Ùœ"c_s¬(Çx‰òž£œ5kÖµ×^[²dÉÈ…ÁÜP ëaXˆ'—†§±FP¨4hpÚi§Ý}÷Ýj^½zõ2‚–좋.ʑ㇌ՆSÈäÅÀ”ÒÛÁÒ¬,—°z®Ç™µ±35ù?ªmÛ¶§œrÊõ×_ß»wïH/î)¿ƒ<Ç£—Æx§Ïš:u‚F‚ÛÆ$'G¼]Öêq¿´bî» žûvéE:ٓ憙e”/_þæ›oŽƒ‘|VÌ`} ‚ãÜsÏ*½!Ü)ᯠ¸*Ï1 e¦mø•gŽÁÀãüËE gƒö\üé§Ÿ¼Y`¤oáççœsbC¦ðÒHhËèð+P4LÓÔç–õ„Ê>¼L™2-[¶Ü³g;ŒÜÀ¯Ì¶ zøÁºé#¤z~‚óŠæºuëÖ®]›*ZrѰÑöˆE–îôE´ÒmÛ¶M™2eÅŠ|}ûí·™´—]vYÏž=©•Á¯)¡³º âžÎ¡Ÿ }㸻wÌ|(<~Rqi&ëúzúé§;+˜ÿÍ›7¯P¡BTã™gžÆs\ëÿ‘’?ê²™8ܽb²±âô  HºXÝ;wŽ_ÜylúSÅi¿¢nß~ûíT›õEGYg`J_ăôœ³Î:ËÔäºÑ-ï¿ÿ¾gµHW_uƒîî¾üòËàÒëׯPš”=ôçYϳ%rLó¨O?ý”‡+(ó•+W^|ñÅgžy&¬ÀÛ"Bu &S½F]zé¥Ë—/OÈsÂì`»@un62eÙ²eÔPÕiçÎÜl¼/CÝ¢é#\`õW±’ô0ÿUÙ7Æ Ÿ%žš‡`ÓoÞ¼víÚZµj™á‚AA§ ,õüÑ`kW]uCloh:NÛRÈ¥ÿñ2tèP®Xt¬HZ˜ùúÏCqÝx:œñ@Ö¸¾Ó,«BÙë®»®\¹rkÖ¬1Èí…/íÞ½ûçŸÖYâÝwßK•VŒÂ®]»Ö­[׿ÿ’%K–/_Þö0(·9[ô¾Ëd¹lß¾=89p§Ë3Y_>YeŠWƒùHíNü„:Ìž=›÷è¤]½zµr‡›{õêuÉ%—¨j1” 48,Óà 3gÎäEúÓŸ<¸ 'ç dž9F£.\È‹¬R±bŘuaþE0ÓÌ䥻oçi¼x„¡ÇÀ,â€2"/¥Êæ Øî–·éáÀ´‘#G_ñ.Ôtèa”,ZªâPF€)š£D>Ž| ¹ô‘*¬Ü®]»žqÆ7ÖKùÁD¥ÕÂùý÷ß›Ö6bûmŽÊÚäu4õ8 Y0gÎÝËŸþy Ï“ÎŒl¸¨±Ô”´>½è,†7‘Ã~é| ¬óxˆr ÐcE#+„ÝÆ¹y¾þúk]û<¨È£|e*þKõÂ&ŒŠ{£Fâu†øp_€)¡ù‚mljjb¢ðóÎ;iiµ¥‡/7SC~nld=:.‘€xw¶Ð'<2ÌÁa¥Ÿ4?„×чü7ŒíHP:ô,®ÕÄd÷ÔÄlËmÛ¶ôtRjРqÀzn0²:½Aói¯'ë lò{ÍŸÏ–8:dÿ£Æžzê©Gg‘±_Ì!^ˆ¢'6—†’ùð¯¾úеàgçáJê0|¼ët"äÇ .l¢" Ó¦MÖÝM7Ý4bÄS~ûí·ž±É&¬Q ¡‹øª’ËÓFÍHuëÖM¸þß³Å8iA,@N¦Ó&Ø5¨ˆLç‹F¶,ú_fˆ‚ÒØJ`7n\Î9eêI3=Ø’É:6khõ¿PßL²Ùß½yNdj‹Eü% X”³MÆCêñ!ÂÆrT¼E‹]tÝ{Ê)§ A@rª+ÖÍÐ4aØ7?#_sv{uYà Àö¨™Ks•Ïo.ß'dq>hod0—äTÉ¥ƒ¦Âµ´ãµk׎e‚B]½zu–jfDHiréý–ó„ èº+®¸bêÔ©i}?€™á5'b#›ÌHûØcå Dz"8ÂPçíHˆƒ¦f2œs³[“¢ïÒ£ëFÜB:CæÓü‰Â¯©aø•Þï©ã³¥hÑ¢¨`²>^ªç¶•IO»»=šÉ ˆ­=9ìäÑQ©?Ol_êûááAó´»4Sk0D¥¥ÜiäÀ† ‚Û0ÿ™3gæžØ:ñh§Îã“Úa ’P0óÇs‘ h{†éĸÜ~ûíS¦L‰ü;F(Œ_zÂsi Ø‡ .‰ºdÀ¨ûî»oÅŠÛ¶mn oÏäÅ4„™ü-V¬X™2exËÒ¥K3Ùí]ë¹gÏ>hŠ¡ Œ&àÉKÕ ô½·7ÙU«V™¹Àì¢VZoÀ*9räHjù1ým´·oßN• µÊ qÖ ‡8p`³fÍ*UªD?Ó(tÃHsðõ×_ç¤ÓLdžg7®éï(C¡f’Çzõê… *,¿cqP´¡™¨nÈ!nôØ$«Ãí[ºtéÊ+—]v¦T©RT©dÉ’«W¯.˜*×\Z¸X´hÑå—_^¤HQÎä}þ—~6  ø³nÝ:|}‘ùúgòYOÏñÐ,“urj^sÍ5f&»EÈßjÕªù ÅÄ3Ï<ØFdTh¤­5ØGJpÀ'e9„Ï›º…¿0I7!T=²Ä‚Ì@kŠ¥Û¶m}úÄÀÅÎ{¦0ÀIÀ¥uOeÞ2íYGéÎ;CÏ"êf&»k㇣¡.TfîÞãÚÇ#“„NRÓ‡”>üðÃŽà™gž¹fÍAÀÎdÂׄŽtÌC"úhl] 'J:ÓÀàT™ýùxXŸÔ‹Û*Àšþoô³>Õv²cÑ´iSsíwÞyÖSÊ nÃc1Ï<óŒœÓZ©p…),•§aºÑh£+…‡bÒ™ŒŠqûí·‹ÌJ+•‹°°*êå8xÄi¿ê nm‘’fiëþK¶(_~ùå›nºÉA2dˆçåÓ|¸û5 >Ó?Ý»w/UªÔW\»®…ñ:ŽÒ•ù½}i ªwß}@VA|L›6M¢L᫼FÁœwîܹcÇ`–çÐuT2f¢WéŠ?ÿùϽ{÷^µjÝ¢E‹úõë£øp‘ê}üñÇÈ[”ÉK:R¥Ò°aCûüüóϯR¥ #¥œ-ÄÀß· gÍ‚0s¸K—.zJSÊ–-ëö7z.(‘î€réƒ!ÇȵڰY`¤xñâö'¹`ÁcuFÚHÛãøÑGÕÂÁT¯¿þzwøß¶mÛ‚Eâ×›5k†hˆÐÊô¬ ˆaÀdÊuèÐ!tÿý÷S«Ñ£GKPgΜÉ$8ùš׿øâ a6Œ ޝ„%~sæÌñþáǃoF©…ºCP Ä¡¨-#5_?üðC+i^Â¥K—ŸÄ…€Œˆà·¼qË–-¡>¨/pEwq^„T’3ÛùpãY³fÅè ;>ùä“pÑ\.‹)½ÜkÔ¨q÷ÝwƒäÔÐ.Èœ1ZË]€5oø]°–‚çÒ”åË—ëÞ_´hQc“zL˜rã7~ðÁ" kíprµ¨Äù/Þâ)éã:&^ áçŸÎb¿êª«Î<óÌSO=Õ˜ è¹° •œÚ¾ÜÌRHÑ-ëׯP`îÛ·oÆŒðU´þX³tÝÁcâñÝ9¥d/½ô’¬@f ¨ºá–Ö­[SgÆ‚‰!^ÒÈpzôè3F­^½:?ÍÿꫯLeåÛÁ7cbxƒA?hˆ¯F.8©hiùòåúkù@Dü€â‚ÒFqÚD`m‹»„ñÊàQ°ëôà ½m4ª 6x$¬T©’§þð‡?Œ?Ñ™zEí‚Pàí¨æØzbàï[Ž…˜xi’eS°Hõ«¯¾Ú¾}{õ•)SfÔ¨Q9G0Ž^yíµ×N;í4¦(Ýr,(}žY6GðÅ %þ/.²Æ—-[6}út löìÙS§N…‹wÞy'`kœL©xš/<Ðâ9áu“žªÎ$›tlžÂlsÏ?üðóÏ?§]ÇO<)bù­¹ÚI-É‘Ì=„EìGX˜yµÏÔ'ÎUÞcþU«VM}¼uÏH;'‚ŽZÒ³0ÑvžÆK㇠e*¯£·ãþ4i{Hy݉÷»”t§»ÐSÜ€uó% Aƒâ¨W+õ½5°¨ø:ªAç#ÎDuþÅK•YQáØ8x¾Eå¬NÑéÛMotSœò^È_O¸H+ÂÍ;“—`”YÃB¼=¹4ƒîï»îº+V¸ðâ… ÞqÇžÍYPGªhpN#µjÕ åNß°L^ä·›Zn]ç'õ*I])âÎLžc°Þe™ìöúë¯¿à‚ J–,9`À–|lÓÃTƒfƒH,vOg‹~ÝØÀåá(×èþD»víŠ+kĈZ6è"¨µ.:Æ#Õ‹6mÚÄë\ÅBK­ÜƒÕ{=ò‚­Y³&¶í³4jÔˆ¾ð èèü„;åÏzïæÍ›e­´ñ—_~¬øK==âí±>Pc})·Ür˽÷Þ‹vÀ"ŒZ«‹n‡æSÒÝÙÔ7É& ’h?ãÊW•ÆÑª!ݸA¿tš)AwÐÜdžҙ@´k×càÀ,•+W†ãSÎ~„\¢zú1ZÏØ‚É$GQœüFµÒêîÜHOúÓPWq¿õ1{NLÂhŽ® v&«ÈhA*´—ŽsFÚè쟫ű†¾jî˜ø R²„ÙÇÒ]g‹ga¸(IÃø9•ܲe‹ ¶Œ‰G5x‘Gøàƒ‚6 ¯hxì±òÕ}Ϙ©íHLÏóýÌi²ªt±W©R% K¶qTîVø@-f4Ê8ÛAºôÛt‰y¼¨0Nõ!wÇÄ@ÇôwáÒ¸úõëÇ{k×®­ºš _æyÍš5Y°[;©¸´™ÍBZ2E'=6gΜ—_~9<ÙX˰eõÙ0€° z÷î­'Ê Ž9ú¼ ‘XÞWOT²2Ù|‚†×`±S+ºÈ""4"™œÝ@=¦š¢V !7»Nùk4þuíµ×šÄpó‘Ÿ@#y¸Fx½ûx X$(EOÏV/TÏ'‡{ T³téÒp°Ž†ðýÙ4\lÛ¶ÍcïzVƒ„4œÿÚ†* <ÏÆsÄ83 …dÂñ4æ'wêÚÍÍO"*Ô;ï¼#v9©¦OŸ6‡Xn€¶¡¹Ó!ÖPca×={ölÒ¤I©R¥Üæ+V¬˜y»àO?ýtÛ¶m_zé%Æ+Œ„S_ŽQ=ä¾.Ü\W{Dp°¨9Òï;m¬»½q´ç@¦<-Ø:Z§;.Í\âÉ*T)œ>-˜ÿ<س ûÍåtÈû•Ú3#~/ï­Q£Æï˥ݒhEæ>Ï;SDÎðß:¸¸~ýú§žz ¹¦{L«V­`ѬMµïÔ¸I[ÌÓäy#|—.„JìNãÄ7àlNmÏÊA¼ÓÜî†Ç—hù9“œWòu:|¦›ñ­уBð8j>ž¦Á«W®\çSb\öû^*¦\‹­®ÀU™¼pΙl@ÄV÷îÝ}ÿ¥º)­´´Ä¾ÿâ_5nÔbfXƒò™j\pË?ââ?5ÿ§¿-}úô1O®æqú>µFæz:ÉÍtæ*Ò ˆFÁß|óÍÏ?ÿü„ ¸ ‡·G–Ô(­g»v鮃uã7‚ü<*0v÷îÝ1—Ü%tè—(OÖæ¿ßxPÚçÝ'-ÄÒCÖ²#wè T¼æÒŒ ¹–L¯öÜsÏ9 \Á¸¡M›6¬#ˆâIÈ¥Í@'~þϼ¢­5%É'NLû¤I“è½ðLæ·qªŽÁ]°`ŠmÜŒ4”´kœäoŽó£‹18¯›W%ÌÑ:»³Ž¹ã–šÓ¡{óÙgŸ=eÊ”T«¢’î'柾%vB©uÈßüV2#fGìMEÍñh¼6|#¬Æ^˜Gür^c TèCx©à;^d2§€áò¡ú1[”b¾HÇEnûüóÏÃp‘É‹` ”á™4–¿á«L…¿øâ ¨5c׫W/íáÆl¡\tÑE~€í¼õÖ[vÝN…s¬äD¤t¸ísô òÐofÕñØf&ïŒRÎ^Év¾¤ÓqFµ°G\š©u饗¢ž+…•αU‡‡ ’Éçu˜ÅÐÄ¡€ó•)§]÷wáÒRD½ÿ5¯kÁ[¨!t‹Í©^x…´hÑ¢ôz}ÿþý‡  ¨D f QŸ5ÅÒƒõ‰Q<Ù­. „ å]Äc1R%Ehعs'ŠO¬nžóÁtî(A¼=Õ¢_¹èÉ;Þ«û± ˜¨¿Y-€ÛÚµk}/7дW^yÅiðË/¿/:?À0S{Ý~ß«‚@“5qÈ3Y7r(mÛ¶mb÷Ì›7¯ZµjL¶Àg«3yÇv°O%a2pïZµj=ýôÓ¢Ùܹs¹Acéð¿d øÊEúA±P4Ë»ïI‡Œ?Þ%V¹rå3³eÀ€Š?æÂT.Êý¼–™1_-;cÆ Ô(æ€ò.d.”˜ŠýéOBp¿øâ‹Ó§OGt]$g#¦q=Ê«¯¾ ¼3‘Ô)xµq¶ã'²÷ ˜¢ý¨`!—>|*«o¿Ý¸wïÞ‚·K[–§vépÉc&ø™‰Q³fMþ˲=Ù¸t “®ƒfÊÐñ‰¿ˆ•7ß|sñâŬµiÓ¦!kî¼óN³ÁîÚµ ŽR:‹ó›|å6Ðæül9ãŒ3N?ýt»×“ÝpÑ „6l@ ŽUÉ»Z·níAo£j´mÛ6Ž%ÂÖ>ûì3 è¿g ëÖ­ËWP—¯ VõêÕ?ýôSYß}÷ÝJË=0Γu« lܸqþüù´1øsïÞ½u`°&4A6e ¤Îï¾û.U¢D ,ö8€©{î¹Çm5/Ò(^gÀ:à‹—šcôÓy#¤ 9r¤[Ÿ–9sæX FÛ¨!­pžlݺµoß¾ÞÌ!ŸË–-cŒ|5fK&Ï9œ:3p‘;Œ›©ª§>S§NµŸíÛõë×1Ѧ§ õ§ÆÙSz>øàƒ]»v¥;w¾úê«Ýydpéú¿^½z&?¢>ˆ˜Ž;¢ºò@7Lé%]=­IõGW]uUŸ>}B XÖtÆm*:rÈBÝÓ¨¢aÍ=ÖÂØMÇ—f.yÜ i$øÞE‹yâ¶èXãÒš24•Çaæ¶®QO80ÕƒÄÒ]ô¬xÇŽ01è–[{r!K+VD£-*ø<Ó=}á4“—÷ŠûVS‡èïš:8p HÕ4ñ“¿ -ž4²¨ÖN>ðÕc8úÇÅ{Ã"ÊÏ}êÒXµšÂC/[´h‘ÖGÐ8Ð{î4™ÛÔB_îÁFFÍäyAzôèºyC(ö½|ERÜrË-Æ»xûí·ÝeS­po1|<øÊÅqiɧvªråÊ¥¨–NûH[&ò‡aY¿útòè‰,@ÂÒ´jÕŠÆ¢hüIS‹žsÎ9Œ¦°‰€·3¬æF×rÊ”)f çõçÈV“†M0Ô~ sìþbéᘦó΢}ûö0—|„¦ŠÓ :‘îD³@ |ü«bÅŠ¦7;\Úýšý6BÕ¬Y3„ ¬IòQÔ@YÂ(Ýâ*’H¬vÐévz˜+ЧnݺÅÙüªU«Ḵ^òäÈ«¥-ÚµÉé2áúå±` ïõ”‡;k¶‚ßîÞ½Û$2Ð~„µx !tE#JtöÐ[Ï]?ãBƒ«¼E›ŸâjøE´-q*Šj¯Y³Fÿ4§–>„2¼Ë‡{î†nñ±¸ãἈë†,}ÿ5EjOÖi$ÞK%yÖ”ò N̹=U¥nVØ-cQ¨çºÞ2™¼Ì‰Ž2]¼Â‹W ó2}ôQ&³§ ™b1<¬?'MšDý‘þ¥K—.S¦LãÆ_}õUÔþ"ÆæFÃf‹›ÔùÙ³EF8m\‰­(€¼`…\úÈri†²råÊf‹nÒRA0¹J•*guÖ5×\“9 ‘ÆMü–¨XéTäœ0aÔ¨ZµjhÔ[ÞK7²Ž"ÿu޼$™$M _ÎqÝÈOí_¥s$_à9ÀR€9ëcyΧµƒQ®\¿¦ZLæosŽÓÌ ýžïÕ«œvþüùƒ BÁÑÜZ´hQ€7ôn¸„Ä{¿ïLâ˜F&4Ž[¦•‰Ó@]ºt)R¤˜þxþ7'øbnXW¢D Ýü¾úê+U¡œA4™Â~}<ìI"žS«V-dÊ /¼ÀߦM›"È2yá[cPÜPа†¤Îä¥Ë1`Zj Ó,¥zõêEø2 ¼]CÄÑ ,Ó½ÚF@if1žüăKŠc¯Pm&I´—;ÃßOHhˆœýD-) B' ˜K›ÓÓÏ7ß|³ÆëPæä¶mÛzè!3f>ùä“V«c‡K³d"7•óh­¥7 {B¹á†Œº™Éºxâ‚z³XøÑÌhx¤‡3íž={€GžY¿~}“ PgœË—/O+³~ýz+ªx ÒAŸþe¢C_¤!]#öªU«´/AáÂHžFò7 ? '=ªçÛS§>ý+è¨ÐÁiT… J–,ùÎ;ïxÂN{‹ô˜z¦°)(É•Ú6Á”…`„FÔK!%* aÎòÉ$'òBXØ MLuÕÛn*œpfÓСrô¯ÙBÝ裰ڎ‚Æ^ºB“µ•ê#JR Ÿ9s¦´ÜÔ÷Ýv¤Ë 9 zóæÍçÎËH!ÏíJ•*éTÏxÑd¦\Ë–-6lÇž6mZÏž=§Nš#•"ÐM`Ž1Œºpñ¸ãÒ†^—!è4*˜Ç1ïP8@ªÍq¦z¬=Œîe!Ã#V:,"ãñǯY³&ÄòÜsÏ­X±"kdÓ¦M(Î*Ô`«Ì5 Dµ™#±5ÿ’_™öZÏgºÀŸ•+Wz`ÄûáH "²Aà!“P÷êÕ«s'/eÝQCÀxá«ÇúLø]¶ðA§¾Å‹‹F™¦o³«PCóÊ»`2á6mÚ ”i¦û\þõô^…´wáÂ…ï¿ÿþÞ ‚Q-3º4›¬Mû<««¶'éèêuëÖñs¦¢f[¤ ‡ð+þKã°9Pùúë¯3KËe †zÚ{æ¸1ðÅË1œ‹:{8oÞ<úºK÷>øàƒ†'åNÆš‡kÊÖ*·͛7›}Ò¾‡=ª? _Eoyèg^ªÛ9ÿ¥ç!ü!kºvíÊ¿øØvìØ¯R GŸÍØ{ýõ×kfT—aò/êé‹ ý<–‡ó šCÓBÑá~•X„´»¤¯hÖïãÑÂ+ÉÄ|0.»!’ÚÜN.J `yðàÁ7Ýt“Ê…áa8ÈPÏYk4†¼_ÜÕ«W‡©ŸÛ€xšg.¸Ï ’öOÈ-DZ#CŸ>}^~ùå‰'Î`…QtXìþÖ>a‘¢ìÄF7øÿ5<Á#ŠÚù/o¹ï¾û\ø‹-ò‡{÷îÐ@~Ñãf¡F³ÿ<ÔC¡2´H2©ÿÆÒ¥K££¨-ÈÙ®];3Àò/FäÉüdÖ¬YÔM E; 2s°€ÒçDó5ªΓ%„¼hÁ‚úº°R˜·ÌXmM:RŽ5JçC!Ú©Û$=ÍÃhÃóûõëÛ‚|õ˜g0Ï¡C‡¦£ÿÞ{ïE¼Aþ2â© º!µFt>,—ÏTðxm”Âô0c Ÿ{B>RºFÝ«W¯N:qò"ÒÌÑ“©ƒ½lªN:ˆËwß}æ#q†Î À\Ue;ŽbÿréýÚ¥™r“DòP ÒŒ{&/TÀ„¾c'&ž»x « ¨Î˜1cìØ±,X0°iÓ¦±(n¿ývoxM¸f.]a`Šõnª>ã,…¦é¡9årÄÏ×l!IÓl :c0 r®ƒ*þŠuÍg'Õyå´é&Z U¸v ÉPòùpZö±÷ß¿Š6óAö =ñÄûµÑå/ƒ¶Y>¼><"ZËîlˆ–kh?úÅ®Y&/c  †FÞvÛmŠÈ‡~8¬â¼%çÀ_}õ~câɺ‘zî2Ä 1b„áõa£†Е®PäÅÌ ÿ ÄgíN¼—±Á§Îâùýœ8“t¦V)~nŠö*}ÎX)R"]ºtieíIØ>TêüóÏãè úÛo¿h`¶Ðí÷(Dé#…)­-`.ãeǬš€n—*Chfi0Wu'8ÚõÑ!:ÁÛ!Zz„z€Î­£C¨‡ò_£‡ÅŠáyu“H{جÓù_ç©mÙšÙU@Q&ùŽ;X­¯¼òŠæÂ /œ9s&Þ¤I“êÕ«_rÉ%‹/Þ¾}{¸êYrÝ…Ù–bš˜“. éèƒÞf¾FJÕ§xñâtE¬Ü€G·,é °WXóÄŠ^d ¸vË1cưäÁ7ˆMß.½7ñ·>!ntJ€=“É;㬭^¼M•Á”aVªT ÙHs‡Iòo‡ØùÊ/sÎhäø¿ÅAC³jo§2Ñíéò¡!z©IÂÿW¶è[¥É"š@m+"jºÕ›~àç9K©ªJ¥ü¥DÖ+£¡;î׸ L_êéo»Î Dd ZÌ„ ž}öY˜3kSH®0g4„„Î_µjbqàÀLÚ§Ÿ~íìÕW_Eãˆh¨ùû–µSÚè²9G#õzràœÕÆGõœ©çùðé§Ÿ:Fƒ‰í~¢ïºòÎ]ר7‰*i,rñ†õÌiÉ‹KéšJ-?ô3ZjPÓOPÕH˜c¥×ªiÚbƒÃwE´X½[ݱ먞–&z‹°G¼°fa‰Œ&ÚS&_DÄpù¤éit2áN$à£>Š´-V¬X‰%/T Ã˸]¾|ù8ùàƒ2iˆeõJáÔÊqóó˜ªeË–Ê,ž¶páB0?hd™2ex‚Ÿé·Øâ uëÖÕÖê  0Àx§F ¹öÚka˾‹Z!ø"œðÈh*†L•âÑ톭ÎdO—€™¬ß5`“ÊB+€tº.ø­Ae™«†5¢FÃ_Ö㥠 ‡ˆŸ¶cÇ`rƒ«¸03µ/ìĺ‹Ía¡ÅW@e–¶@ç÷ÝwßöíÛ™r¼‘׹ůWr0+Œz±/[2Ù \¤æL0Ëoé:-ÛtõðáÃ5éû1dÈC} Ð0`††¾ìY<=7Ž'žxÀw ²T&ªaÚ;’¯Yb Žmn/þ»eË¿pÕCsdiÉ’% D­Zµ¨Þöª+âL·>'à¿‘LxZW ¦Ÿ¤ÉZÂM%Éše\‚eñQPé¦V-Z´¸ì²Ë€2î4} 3ŸŽ©€5†@JzÕÜú«p/R‰ð¿B1Â…®¶o½õ¨.Í4™æÈ]šÇõ 4®8ŸQXxˆ6&€ñl)ÈÐ[n¹…žüñÇžãÞh&ïˆ ªs‰.š?>9eÊÝEÇK.¹L>óÌ3Ï=÷\® ìðFŸEA.#^;uêĈ(5Œ^å®JþÄÐ wºÊ" –K;:w|‚àå0OÃÕ†@tÉçìÚkÌÙÄ7ölú4]IÓ€'iBa!5dò>DàÄÈl(Kw1ó³}ûö5kÖd>x…Ùˈ·iÓ&œV/pi&ØôéÓÍëa#É;F„Œ(ý™Ä-VLÅJ˜ Úoawè’,ó²â¤å6…=óÌ3,7ÀMm”©Ã89B‡ö·PíµF†Šœ³Fì ±h¤žÌ û¶ç=)D4iÒÄ´°¸=kÍE*¤¸Þ]­‘žUGwµ!Ÿ©½‚öèÑ£T©R0+ø!sÏ)§õSµÅkß>HMåÞÑ *8 À\ i4‹tÃé©gGÊëá—νêãšg]éaªõí©ÙP ±7¢ÀÑ¥v{zÂ(>§“c¨të-,ÏiL912ô¡]Æ5V{î/"ËøZCíÖˆRaâ6¾ ?…2yç|~*Ö™üMºðUÌðé|f{»víИKzZªÜ{ï½áʰ3íM3T£F Öó„ÛºtéÒªU+è=´gÏž¬š°§ ÓÅ«çdºûЭ±È{î1eò"RUÖÖÅ„D׈Pù‡=i, äÛ#s(Kƒ.²÷RãFD K÷ñsbì+wBEÝ2N† £ß)æµG‡EÚBäŒu¨S§Îå—_Þ´iÓ•+WîÌßÀ’6ßè—•*Ub†Dߪ"E¼bÙKNžèÐtbÕë² ¿Jã®ÓŸŸ}ö*p³fÍž}öÙêÕ«;!!Šè˜Ü†0{ÑþPH¡U9òdFléC·€9èžB¥æD³{§v{Øf*Ê5ŠÆN˜¬âx–¢ðx‘»Zt ä¹çžcÉP7{†{´{kðÉI019ÿ.uÄâ_a¼r·Nô¦»Â›bÓ¦Mžs´À3Ë–-‡PêÕ«ÈÓeäøÎ‰§í‚ÕgFʪÜô”Jʬ¾hKŒ7^|ñÅögT;> dñ ®#ªîºë.:Ê ÕLZ¹4Ãx˜ÉKª…jÀ•˜l*#Q¦‹ }DZ‹1ÞIcQPñÂ≗2îNNŸ‰Ö%v&0.ˆ{;pàÀü÷õ×_7q­Š•Ýn=ЈmeGEŽuᚯF§ G£˜º—bàø!@•ÓÅT#Æ0: 1ºÆC=dWŒ;–NcÕÈ&2Ðù–ÐÝ€‚8®’W­Z¸¾ÿþûé(¦ËT:tè¤I“Ö¯_F3oÞ¼8x›3NBn-—I^ÉRŠHò±ˆ²’É;©dP¯ƒ”tçE·œô¿üË”d©ƒ ýœ†C½ó»ÄD\tÓÛ©Ò@ˆÆ¥ÝBµ7n¬_°àö(S×ài¨ohUG)YmŽ-ˆN†KŸuÖYºÎ¦öðüB*G|0ÐÒH·˜ÆðÆ9sæ@‰™NÌU]­ ×åÊ+¯¬R¥Ê´iÓ<ßÍüq'(^ÇRJ“hx,EÁa@–ž$Çjæ4ÑÄ8F'–áø¦ÏIXžÒt2p³‰«tŠ@"L:µråÊTÎt´mÛ–…~ ƒ™aBa‡ë»s5ޱÐ.䯇&ULE›iÉ”s³&l¼±}©Ý[¼åºK v5—H绽þ—·Ðáö°qeÚt¬ž–´ÚÇŠ6Òû`-ó_¿F+M’m£ð)¥ÜŒZŠ.y)“^¡€AEPý1Üœòì¶–™}:Š¥ÆFŠþá®Á1´¿IΩ*¯ ŠfR¾êvÖîw›Õæ,èǨz®ú€uŒ”sçÎõT uà4Pž'qb2P©/Ÿÿ˜-oï½÷¬ ®‚äb²=õÔS¬>¦3 }Ï=÷¤Ç(<¡L1÷¨dëÖ­&h Ôù+VDÅø{Ÿ?>•yã7¨?õòeÐ/^Œ\xçw‹-â_Ç÷¯‰Ûø/ÿb”Ñå!Û¶mc@ö«…ÍC¾.¨£Jx¹;š¡…Et5õ/ƒ ON‰G(5þË)”Eaò°6é“Þ½{g³þ Ê‹‘Êè¸*;FÇë 4p(53©÷êÆÁ+èVœ­H‘"!BïË_è& LˆÐp è¸qãLG`‚pµjÕ<ªÀèGh2fc×®]¡ Æ ‹9lˆËˆ8G•<Âà ‰C»Ð<æ'ê Yz5ð2‹\§në3ë6nÜÈ¿ DÉ£Òó–-[¶iÓ† Ät…:F«™$ï¾û.ÛÙâá‘Q£FEP *é¡HÖ5Ïí¶à›³%¥zå)˜ÛüV”àù .tãO ?~<«£ÿþµjÕÆY2 oAðRšÀÏûô风L3wìØA=(Í$Q:øœ¡Ïù¡NȈ!{ÀMèmb•1’¶Ë¿Õ¬änŽ&wê …Ë? ‰$bPÅZS#„5Ŧ3GG 3>ô:ßÕÍü'Ô ‹îÀ Ò±áÈé Ø‹„ÖÅûöÛo‡° g"†ÏL¹°8Wã|Ð'Ÿ|ìÄ4Ö¸;μ‹v1ñà½,@’ÎéСCðO„`F6‚rû5Uü™BfIv^I yÔœ©B­$tCÏXCÚXôÍ *\tÑE,.ÃôéÓÕCñį 6ä·ðœ8zC©°:Pw#¨ëß[¦Lº…•ex[ s†!o䱨'2SRûöí{ì±G}”9r$“?ŒQ²#ýŽBôDÒg%xþ=…x,det DŽæžZS™ÛÂrÁgfG…á½L†`°á¤gî-:S§‹£ZäœÈe4Ât˜ Æ’0™ÕÈn&ËjôèÑÀk™™_2[ÂàV®\¹æÍ›Ó3±‚Ûà9M†èa+rŠpí{¡+A5ȸF¨†^¦òŸßÄ¥y¦>®#ü8ÙBk£áš‘Á‡F¡Œ³p˜çtò^ç Ù¬:=m§û(3œšÈˆÀ%w^€JÃ+iMò qÈâÃçÒ!˜PÐ\ª¡ãS\Zï_£ ÚQ<Ç4fS"¸©§s¯ðHŸYâ¶àoâÒaùç©õ@\Ú{7luðç°þÉÔâÁH87ÕS“£ÿò欑rû0P[f†„rÔ”¶=zôèܹ³‡Œ\kó“ºñ¨œHSà¶Úº*|,ψìJ¹÷Þ{Ѽè;î¸Ãûa2¬__Áôbæ0uÝu×ùÖÒ9‚¸ÔÀèpCEÒ³Té.CoøÏ§n½ÜŸZ¿sŽÄ„WègØZ*ríˆãáСCé% LÊ—Ir»Å@™0a‚t¹´¶ g©=ÌÄñUW]{^ÌfBðúu«fÑËêׯ‚ðרQÓ°ú9_}õÕ©F¬#sYAüÅ fEÆ®±¡“Lê õrœðÃj‡Z­jÑ¢… Ü,ØfnuûƒaÕ[× L^JSÚ¢½+“éŽ9ŒÚÈ ¤ +V¬^½:‚À(úÔÁ=hšoªY2]á, _…œ¯‘^ÖݹtL<-ŸÎ4þ¾ÿþû&y²tdeœvÚi÷ß?¤1¿i.µòüÓßÒ@ê¦!‘š»x5Yëû!²Å=ý. š©Š˜ÞîÕ«‹ÔBd.ððÃÃb¢fòòóÚ";|ÕªU “–å ¸XVº-1gÐwh/R/ä>·Ysž¬ÔæÕ`Äò–n–ÉÉ)<ÇX4tˆu ª4 èÄÏÃ^šF=õ $/R Å’mÐ@T]Ä1³½R¥JLXk#ù¼Û1‘јϦ ùîô3јYf¸žº”ŸôQÁÆY¡à»(h&ËöNœ8ñ†n VuëÖ½óÎ;[·nɆaIj—£íTûòË/gm>òÈ#T*ÚÐ¥:ko¿õÖ[ßȺ`•ñs)·^ñ¬hÍÅÿt€‚~=ƒi£¥ÂîXéLcXw¿~ý ÿÁÖH:©/ _c¤ö"Ë °Æm»6ÿ©ÎR}t žKÓRÓ´¥NÔ‘]Ž©ÂÑY Æ›>çu =ÒŠ!¯‘•ÌOÀ *‚5Ò#"Û,HŽ8ÿ~¶Ä¡£Ìm>ø êØW_}%9‰Í¾p9ð¼CéiA½ËXÅé¶…LÁ{]GÆj ÏÿßêãèS"=&­òàdðX¸“„å/Ó¨ZµjíÚµ‘_ ÓäÉ“Yh—¼Èß²Öx2Z 2‹®ð Fê౉R“Úáûx(ÂLª¥Ùšvø1âãa8뜦é|(è¹ærðòmCÏ…>õ[}ùdÆL€ö@ÅyÈsÏ='ýöpRèxâ‰'¨€ûª™Û4‡•ŽÔHʲ2yqéaVEú\ýõ¼ÎÓUG¶xŒ‹•«ë #¥q• ¬\¹à¿4*ÿ‘ÛÃ,±âê3Ê48Ãëzè!ø*ý™á¶ùóçº!§PÉ+VÀ»ÈèòôÒóÏ?Ùe—½þúëÐÂü„…µÊ “`¯žù\g¬ù•|qÂÓö8$°ð &•,hýúõÌ1X„fgÖàÿÏÞ{mY¥ûžcw9¶9"»Õ´1gŠPB‹(I‚dA$#("*A$(H¢€¢¢€€Š †Ö¶Ûvwµ½wïpNÏ>{fjb:_¦¦jªžùÕó«÷_ëÜ/xl|±ÃñþðÖó>Ï}¯{­k]y] 4i‹… ,túé×ÂþRQÔ%ˆr3*„Á«\H“óÏ?_ò÷|Máu°b0 ®k&ÿªã‹¨¼€"´ÓŸ|òIËfêãß´Áå½<«_ ù ‡ˆíϯ¬«cÇŽ`„ ¶nÝÊ||@=øàƒeöTsá…b³¨Î­[·Ž_õ‡p¿=Gä ü‹&cY8Ó6OS›9ji<² Ì9Ý;tè5q$CcpÁeS0îÿðÃA/û !ƒ$wÞy§·iòhŠ2²a3‘}Àö™gžAÝ‚¬44ô]x¢‡è2n¶:4Ò_· {‹°X·råJ<š ìøŒ3zè¡7¢ ¢ ÞvÛmÀ›;w.@Ž-`ß1Ö˜2æŸ}ö¬Ì8È.`Ï‚«ülW?!Ù&í#ùÃê—S!dÌÓÏ`è Ÿ¨h{¾ð 0–áÇDŽÔéÁ4ØŸekJQRiS®n dãRx ¹,¯†“dGÌÑûbè°bXxò¥—^š¬p` Ghh¬BéÀ2Û´i¥ƒ«Ø5—_~¹ÜÉ e^>,|@ãÔ6¸Ö®] T7mÚtÇwÀÕï¿ÿþY³fÁða€‘b÷ùÎï'N„ ƒK`>dΪ٠´tôFè‘A(ɰøÎti&{ ã½L#n()EÉW\ÁÚu€ìïùD‚´‰¡‡a…”t-Z”fTJ6Å_Ï<óLž‚ˆ€m=<ÿ…F‰HgÐCíöÏWô_ ‹–܉¤~öÙg#jáºÓ§OOn”›nº)jäš5k@ÅhJ …}÷§æçY‹GÛ~ƒþ™@¦O?ý#Q§“ÑYðIp %ÄÃ_‘S½]ÅCuEÏ!¢yóæ0Áƒó8_¾wEýŠG«©r™$LÛg¹Íý‚@þÒr!|&©\†óÏ›7æ k‚I"J`ª¯fˆÛB—%ð: >¬ þSsáÛHFc# #\Øý½åêó´Ü+óD“aG(¼43ä¯ÖÐz¦E‹ˆÈ¸dùl¾dÎðj8ª°‚é)§<…abIs¼ýû÷çu¶>gÎ5c˜a_$7êIy–9XÖix¬³A)æè~a!L>J;À1‡K2ÄV„™kÏŽ3UM'ÐÞ ×US¿:wî¬Û¤ÔèÐß:uêÄãì)4Rêáõò%b\bãø|Ì1Ç Ÿ§û0P…“€œÚ†Ø°|óóŸÿ ­Í÷Ðù6IۉΠÀµPJAà”bkBŸ†vh¢YzõêåŸg<‡{аzz÷î ‚!Ë ¥%K–@¶e©¨ø’ibê–Áöª»V+”Aá´òÿfÍš9Ò#ržrX§ >€00XöZB6Ní±¬ö–ï“ò¡+á òt»1š8–ÆÂ«A•ýèG²nF†›yüTk¨¥\ÆyD˜s±²w!KSÑJ‹èr`E54dÈbÌ8²e¹·Ç‘¬UÓ"(äfåç8F'C™‰?CR›ƒÃ:—*§ÆÂ âÿMðf–ÓºukôüÖ8n1Ï„¬² ­hí$‚ÕP2NsCóÜËÀHî—`&ðLhUÍh–JžBÇy+CÔøa­)øðÍkâéçÃÿZ¿¤,´þÚkÃî½9´J(cé-G!ŒkNaLJ„ ‚‡|y 'È"˜¿@PYÒ‡ 'Ö´©&©‰Çã`¸¥òU<*ªý…ÕÄÛµkW¶; wTF§ Q|t.Yé“Á2¶ö›ÔÄ3§1™ï­&^%!¢ÐzD–ÜI_ÿ‚EÖ_5Âÿ÷¿ÿ½ øÔ-Ó‘BJVâÝ[çqƒ”â 3n'¾&צa/áJÖv©¤‰BŒÉÀíít˜üîw¿c(i°<˜øú’ üÊþnÚ´ M#]wêÔ©Ã[=ôÐÄ–ðùR'Ø9çœVÿ$Úµï²TV:f¹¬î+¨›ŠÚsé€%¢ÐâFMun,ÐíhÚ^<ñ'Á™K 2Ž÷Nœ8ñÉ'Ÿ¼•þ€{œƒõœP×eïr Te³˜Jm`‹–.äÙ27]N惑˜úcé®.$97$iâ¶E³ý *„W]uVFkÒI<ˆLœI¤!Û]!|ä6WjJ§¦œ€Me­|õb­ÈÐØÜ´Ä!yP(™lbz£ˆJ´ß«c>ú(»ÉþêJOØÄ¡×%€M³n¦Q&‰ýîüÿõ_ÿ–ÂSàLé7{ñÅ59±+¹È$ˆˆG<€¥³:Е_ƒä,jüøñÈëhŒÌÖÉÌ  „¤4%Àù裔§†—‡ô8&ƒCéa@—ÃJr®Që¨(ºó­·Þ²® ã`׈`’íŠ+ Ùkû©ý?Å¥?3. ÚŒ=âÅœЦ ã…èüq €.Ú®]»AƒIGÜÙªU+Œô‡zEôÖ[oåסC‡êŽãïñÇš1»~Áð?&ðw©K{ÖS«W°ÔÃÙ¦M쬈¹7ß|óì³Ï†pXT™Eû'¥7¦â½J›’f‚F«ª6Ø'š¿v©=z´.²AÔ&–*”ü4aÂð\ràØòÌÐ=eÌ2|‘a±òѼ—x5úêêÕ«“ûÀ$qREF0”‡ø“—iÌާî:þ|ÐÀæV Ž¡ z„œ=UTƒåuXÁº $Šõë×낈!Ì2íµÍ¿Ül‰¡Œ Vz=sôJ‹j1“­ØÖ¶m[Ë®jð2>ã0r²ž¡JVÁ’C§Û·oÔ,JŽÁÍiÝh¢7¤0Ù)Y °rJ̘l«8kgÎZî\°ßôz`ëÖ­Û²e‹ªІçð/DíhP(sÈÿíßþÍ’­24`Ë>R+B6š$‹Z³f “LzBÙD’iólÖ Vv®ïˆï `꺼ÝCF7fò /H8òCh$©©Lþ¹çž+SõaÎñ}±stÆÖêµ’ÌF‘Ya-–ZýäÉ“mìÅëø€}d¨§MÉ‘ ܲY× ”‹†À¿Q˜€M½_¦·víZaeÀ$7óA@q3û’ò|ϰ¨Ä:µØt !?TBñëJü:žI¾Æ5Ái‘D©1¾¹~Å6áì »i­ï·ß~;ÒßÁaé KÑ-K¬Ä¢ ¡1UÓ…´ÎRãBhÛÃÍD3–’ °k@XuΨQµ=Û+x/³U²°^¤‰}<…˜Å—àé Ñ„¹áº§¸æÎ«µ L®½öZE-ì:2±L·ÿæqÑ!Æ„ÜG½áC&³fÍB¬C`‹ìNæ‰Ô‹" Õ0•éBÓÚõ-V!¶² ð„@ËÄtÁ”Ð Üq0‡›=®REDÈ.[¶ Ô½øâ‹O;í4CdÝ,f˃{Ú¬Y3Ø”^‡ü?þøãÄÎ¥ ±0% Þ3Î8ã”SNIéf Äô•W^™x{d‡‘#ó7`zê &D@k2%H•MRà3P‡‹åñ¥K—Â=¤wnf2¬ŽÝÐ2uœ.\ˆz Oãq(¡B„^ Jëà½Ë—/O sH/!Å=h,OÓ™#’:˜Ôï.€59±ÖP‘•Ï`ê½Ìê¾ûîC⃤`pëáè%Ö:ÐAÇŠø×ƒàÓO?ýšk®QwõAþnÛ¶m‚ö!^›8”~Wh5[(òR©xJÓ¸sçÎN¤æUNU &­›ùó"‘Á3d¶œ¸ÅNu"¹,q"lAxxŽðE©»ýöÛù5¬€ˆ}QÖÛzYaÄÏÓ§OŸÒÂOÚhz–,Yƒ&÷éc¶(f:uâH Xwœ FäæTgÅ‘ÐÏ]ºt1xªÀ s¸<ÓA”Xœ½€-ΘF¼³–DàÐa’`¾¥ü°(X^«Y-=*–I}$SËçvÒS³®ïÝ"'Õ1ƒA]YcD(ßlذAÓ‘­ ‹¯QãªwMuå8Ã^EØ/ÚöëŸ€í¦‚Â»à·¬¹TšK. 71 -›¢,m­d‡[:a ¸4Û§n=LCñ ƒ=â6dG,ë—Àcr3Äpñ2âjŠâÁhXI†)J¼(áða&ú1ÎÓO?]v‡a¡k±)¡ˆz¦#b s’¢±Ã„m  ÞyorW1ÿc{Öêµ@™‰EEÂwÞY&õ@;pvP™†– ‚uöû€ÉÍxoôC5ü'žx"’×.ÙSnáÐÄ–3¸o¦Ê³ö¿`2N ééñgb“_Þn»sÌ'’…i°pc=QW–ˆø` { e³.¨vÁÛstè¯É4dê¥LîgḜ¡«³b€Z·ƒ Ö“‚Øme¨ÒûÄ‹\9bKñ/`7”)B–)‹aDæ]jøvsZ}–yê~ôøè… lL~¦9Z²é9#ÇqÄvÃyRJW…*‰ÁEA`OR,˜í»^ÏáÿšÕfwò”h]GàÀ³H±”ÉÈQm^—ñØŒ¯é))âÕåø,·Ôp‹{ßÓŸxA!±Æßn^Ë1Û´1kâWyk÷3 †ÒÆ·fiy„aI4&líîË/¿Ü’ÔMëf­†ä:ûì³ ®€E£À·kךí±ìÕ7 «3Ëä8º’”WÞi çÒÿ摇¡ªiÙÀBq+íý—, v Œ‚ˆ´‘Å3fÌ’Š´…7ˆdoä6cxȤI“Ì4‰ð2ÉÚÛXEìz ¬ÇLš!r$vQæÀ³èNW_}õ9çœÓ»wï!C†ÀÒÑ”PGáè`£8 C‡()¹#¤! -ÿ"ª<²±û‡Mb‘$Ã_P«RÒœ™ÑZº÷[·nJj9Ï$†h-r[’ÄY—õÆÝ U?g¬vHgœº”eäùRŠ66ƒ›í‘”³*§¼ùÒ¢E ôsãIR-€ç¼Òôá“SH‹x€ª: aÌÌŸ·‹„7ÜpèóÐ4jË£å#V«Vð8û®»îЇÄzøÜi ¹¬FÇ["ð|… íQxÒ¹mÛ¶]tt§&ï*‚Ìá3wÜqÇÈm6.·]»J~ÊÁÖxï©§žZ¦'>_·m¸¢…pj ºN±ûï¿_¹²•.ÜqœUŒâTt·7",nÕôs4:Æ/óôm"—.ùjy4lbWÄ ê"£uìØÑðËZCYTçÃ&àWrc…Ry0T+ ÒVd]&Mà‘€´)^f€ŠÆÜá”!(H´£>~oaªežQ¥Aaäå3ÈŒivÕUW•*öÑÍ7ß ëÛ·$ñ²hI%8ao„l¸‹ äHµÿºÏ—Im¥rX²wÅ¢˜ÆO²ÜJÑB7Å5ÃÂ"xħ¹3Þ'¥³ÞH[hÕªkB})•íÏXbËÞúœL™±‹–ëŠÀF#L.cU)Ãhì³3}HPáÏ»wïFò”®»î:é+­r“P`ÚcYç@¢^X`íòI´ý?Ö¯Än•Xͬ©5´SÔ- ‡·»víZ)}£^ä´Õ¬’Àh” ËÔu)eÉHå´Â$µÔø)£î¬3Oã$ë9ȽYøÿT¿Ê ò|SÈ—ÕÕ[´‘ ,÷6]Rº¤~Õó! “Óh“Xˆá~>•.I9¬8Í6òŒ8…`¥ð~²>S¿zŽqÙ,q[Õ"B_}ƒû]šñr¥_”ÊW”RÕÐwC•4ŽÊhœ²HâeNnY¢¹ÖÐê%ä Ð>ùäF·ÓYXϧX¶Nã*uH7¥ÔvlÀFÇJYN¬ì,6ù5v\U ›¨›iç'íÄã?^Å2'>Måî@I8p`«V­UrÅW þaÅÎbÚû¦K«D6eµpÿµÙË€èíÛ·çÕØì²AØ‹®?`c13ÅAPQÌø³ˆÝ÷ì §>i‰ýùð¨þð‡£FÊŽh}—Ò¶gÏž ØcNH!dð™÷f/°¾d;ݬY³C=þgc&;wî,+rC³gÏfj‡rH§N PƒÕÝ¡@ ï1},š9sæ=÷Ü#(˜*#ëc ë@Ïdz2^þÉų²YPL{üñÇMZ46Xg…PòõµÆ}Ǹ2]Ë2kì¦ÌJ„aài¨[5¼Râ§(H<²nÝ:y‘Ëbm¾£J¼|ùòÄÔ±#@´ÄÄøéO Jj2rRÿ$ŸæzôÑGp“*±ŒNª_&Là]ü[™L@‹SÅÄNÑi&ÉVzŠ$@ln’'ŸÍ)3líE•fäÈ‘ 1xˬ”Ó§Oš"~ewÖ41b„©”ªÉya CëNq3„ «d£õ°!²};‘±"¬×.™zoä-&9ªŠÏÉ“'oÚ´éÌ3ÏÄX†âD!pÆ`3ÆqVzÚ!+qñöíÛ·+P@`Æd»Y5Æ Fž`Â@M«W¯ž5kVYyÏüðÊ’Ÿ×/ßbøŸ‡Ìäúë¯ÇÀ‡ã¡N÷ë×ຘE²M–ÃÚ1--£OûÉ'Ÿ4è8¯\¹’_½™WO›6 =³{÷î_|1Ë·˜ÙŒ`‡‘‡‘¿|I‘ ˆÂ:el"܃™Û3hÀ€·ÜrKTqãH÷‡.mëäÒÜ÷à `> D¥‡N#µ÷Á7®Xú£¢Q—Ť/€e¥E¬5Üd›R¢Šè1qâDãçaw»víB¦ ¿ø ÞBMÏ>ûléôÄÙ9 2D–nô,¼è3 ŽÅúÓŠ—Ïð=›Ž„’(؋ѣGg-Xv°šèpxìtE?ÈcÈT>@ÅêK¬qÞ¼y÷Þ{¯=ˆ•¹sçÂU6Ð$nîí6N†i^ÐOº ÈÏ‹•ÄŽóx™FŸ>}d\ÀÁ£Ü@ó8ÏÆÓPØ¥ëL(Ýzë­ÊD¦@¦qéÈ}öN¯ÃB/üEp«²zݺuk`\ÜÉãš]îò•W^i¥}æ zCS†6ÉçÇŽ›ãZSbÓ£@;,Vï{õêeî‰.À6v/b З€¼KŸ†èqã7&c˜ ¨÷ê=ã_]|\¬æ©oÇFo¨ÈG‘¹i„Äv´lÙÒyE*P<ØöçU¸Mçž{.¯P:ûǶZ ¦qÛm·ÅU¢ÅeA×/°ŽWÄYÇ. 4H Äs†H+ŒÄSN9E×ÍþˆÐcAE5R1ŸSô,¹lû\Ï*1F–²õ6MÓYž@’ .´¶’è2x°.ë°£%Èo‚’§~q~òèšÐÀŽd/ûº"âsš¯…Ë{-ø¶Øø-Úpw6ZK«öˆ—ædðÃ?dV¼Ô{# ¤°Kµx–‡ †àFæÂ"ØYö:ªø(!tz÷îútÙe—ñÙ‚`0Kh2g9§Í7¶A”ØùÒÐŽ[xØ1p¿˜šsŠ­„ö~íµ×‚Q¶P´öë*u6VuΜ†4³=ꨣ †±F+,.}BÙ#F¶Ã…•ÕáuòÆœ?ºwØ y/¶aP5Ó"6›ðf–ïþ»Ô]!@fé÷àír!Ö‚°»ð ù^?àJ ŸØeÕÙÔ—³ºiÞˬ`o¾ù¦OgÄÁGqþùç+Cí¦Í³¬Q6˜ºPr¼e:3h†t@s+ƒô ´ÀÖ â–þ pÕÝt ùOõ È ‚±Œ˜܉ïAW^í*@u+äpÉ·ABÏ‘AWÞƒO¢»*Ñ€ŠVÊ!FõB#‚UZ¿.¹!eRÌLô( ! a¬)Q )Ñu16aÝ]»vµ…•«0àÓî¾ûn>{°"o” RýŒ/3ÃÈYl“|Õ~¹ P‡C…Æ*t÷=s¬dTiΣq$ƒÚŸv½%·oÚËÚÉÈå&VröÍ7èâd0UÛЂ”3ósŒ­Ïv³×K—.Õ•aU(SË-“²º•ò°Úæž’#îÑ”Î[ N€rÁ%˜­âöųØ_Éy3fŒK€»4¹­ñWxÆ êÈ ©,-Âës¯À1Vׂ¸Ük~b(x"’—bJ >b40lóæÍ Ðb2(f Ÿ¯€ ZHŸ5ˆ BîÖ­[N3ah™ÈKyPC2µ4ÓŸÑü8ìsdäE(êr&‰ÊŠb¦®b¦œÇ`3€‰Ã7ÌY F$Sð ¶²Ág`ez« g˜(‡5ÇÖ(úQê"¢ù@nˆ t†ùóçCÎà-XjÃƇ{³¡¬è‘GáfØè jy’È6bÈ!÷Ýw`ñ`ò>ø ÚÜÒÆ.ÐH÷¯q1ßvÕäW:Œˆª©#%ꃋ»o~i7‚íׯ<B/H[Ì…ÐìËÞ±ƒ©Gtî¹çº›à]wÝÐü—{³ {$À¸ø`BŒR0lØe )=À s?ȦŸ_!%X#Ë"âhM=ô÷ lówèСn7XS‹T0E‹™Îay;LÍGÙ jñe¾Â÷6n3[¼l g5'àÜ[´hÁ{á6gŸ}¶³â'´w„»î¸"ïåKM{8PQtaïH‡4ÛÕ6ƒ]üË¢”ql {-ƒM.ÉÿX¿àÆ’°ÑtµlƳ0CÆ1ƒ†o´Ë-·X²Ñü ÉjVÄ÷^\¿L´úÀ–/4ཬ-TزdD”ÞÖ<"÷`X>Ã”Ø \4v ÈO¨µØé>ú(k‰æãÒ¸G7K®œA#ÑõM7Ý„~8`À9€^#p’­ß tncæ÷ß?hc÷+;q³niÄK†Mq?0Áö½ù•Y!¿¸ &£uähñÁO/¾ø"<Éë÷–eó33GFØ|ÐJ’  ŸìP 0gJ¬ˆ›O?ýt÷óRø¿@¶],°°G4$)r3\œÏœd' \ž×§,³ß{~Ç—h°Þóԉ ¢?°GˆÄ¢Ó³%Ó)õ ÄÈÜ ÚIgâa¨ RŒÅO÷‹ú›€Jyd(ÑF`|Ž÷•i3þÊá™Ï ";Î^Ê#ÌÇñËt¡¦Ím17ªìô'ßNµŸòÎ}ûÂbSŽfþ;ÿ÷¨CÉä©Cê—¤„äu[ÃñT‡Btì/_‚{0HFªšTö5v/Êo$Érw díS˜ÿ‚º œ°Ñ’Éà<&@AH]ô\ªpüEð+ó'³@2‚Ñ“¬Ú#WÔ¥ µ‹¬wsQlšmYaÌõ²Ríël ’g½‡Ïú,`b$sÿ0«œzCì|‰VÉFˆN­U…Yµe U-á°Gæc³Â$c¢¹IP4"õñÇç-,=_Ç~)Éí}Ö¤ix¢°tLB€²¶H•0†7T¸»f†:y,$nýp8³[ÌÖ'kà‡K4)Ó+Îz•_<ޱ®È®9¦5OØDÍæ¾ûî»à‰7#¾Ý‘ µ´¯ 9 u]ÑbbB›Ÿà„"¶ˆêA€ ‹?;eí,ÀΗeI¦‡2¤à×T㇠à·ñÄÂ*yÜ hÏ£“Zµ{÷nû®]»¶‘«Q’(貆'3A'W¢1íœÔŠFœH ~b£59­BÆTå“%KGŽhÍ%]µ}ä]ì²ú³¾•U fmv™‹„®žI2¾ÌŸX¤ ~ªK ñJÍcŠW€äæ_óW“Û@H[°1šñ" Žá÷9¨MMà&¿<™µŒgNp,{³kL›O]Érú†‚ ½xìnJ2:CL€®é @Þ#èx®R ¹²/‘›пŒãO2çÀÖ§>;Èø 4»€0åEz`"vÕ^RO¦¼Ôj _{܃`L’1AEÞůÌ_–È7|À3 À÷¥jÅìbL¦ÒTB$O T˜3Oëžbž‘DºýÙ–æ8ñ]$ ZÈà¿ýíosJh©v,t•1á3àƒ2™•>Gͦñc•§|ê“aiÝ»wW%cþ샇C²)öš29?ù/PÕm¬Ò5’Q!çfþr?ª©SFcòH¬^]“¡8Ks-õ„+Í>x;oÉ Ü+F"è](uK@£qùMö¥¼Ì½ò FKÍ‚êêÃ`W‰ðL /Ê7NF@ýˆxE¶vìØÑ^Ã^¨ (è ŒÖ¾}{@·sçNæ,^™>“Èßüæ7èÀ‘¨ßÈÖ¼wË–-(31Q·Þxã yì‚ ¬±ƒ®+g@wR—f÷™üÒ¥K“W襦1µ¤¬¾n ‹ª)ƒó!&ÛýÙgŸy²oÄ;`º³9ï0`hðÝ ¥6bù;kAïÚµ C[öÎh N~ì±ÇþýßÿK‹7p’UhÎ[2š5a'èÌ€ãñ|ÐŒQk€p 6,Úæ¦M›’vR‹(C DÇP¿þõ¯1±Á´ýlËY¸p¡8Æ[€ÆÀyˆ ìÃ¥À´Ã±¢‘ l“ T"€<„¹±GS¦LñW¨ eI G§Ú±c8æó^îÉY³e›Œàêái¡ÈNÉ~y ”–Òa°Ð @ŸŸ5k–Dg‡SèÎrÁzØÞ~ûmCL¡¯¤Ûã’=b4ÿU4 OÛÿ½õÖ[Š Âg~å~L øC=¼¦®Èêâ´A—¸öÚkó¯2Qîí[E­&ÅÆ÷Ó*þÓ?ý“)r–´ ±,Ú’8û㑳pÏB©Ðu†Rù,ã<á9A‹›]ºt™>}:| üân¿ýöqãÆñjE¡>0"²&Ü€ï-'h„ü±Q\í"T·nÝj¸²Y‡£GÆxU¿ÆŒë˜:u*À ì\†½ì²Ë¤åøR`Å+V¬€mÂu™ÌÃ? ®2±Áõ‹üË—àïݸq#´ Û‡`möVí˜ÜÆëÀ[ãÁÿuëÖaB²Àùóç#¬ùŒ20—,Y¬ø L˜Ó‹«6&!ŒHnf=·Õ«W{R,þ{æž®ao¾ùf²xØ;~‚oƒ ¿ ktÁ»ÐÊSôÀëx$-e™vJIƒZ, *ƒÄ 5=}¡p!†‚$Yî$Ù¶ƒ×±.è·W¯^|Îsë´ TùðêåPfsÑl‘t€$ÁÒ1€Fú½ ›‚·råJæÃbÙèW_}5ÝX,l.3— ™ª¡Ì—‚'ŒÆ«áÀl7ƒœìï¢E‹ÀIvô[¾|9›‹ª:!8bÍ¥%12”˜ ²Ë–-c¬”_ýuàÀ7|˜¼ôŸÿùŸü®»î²†’gÑô˜Ï–‡¿l7Ó{à|ËÈ‘#“äKøáš5kXØÀ…R‰-²²áÇCSÌpñvðÍÙä#07–+fq‹3ÃHçÍ›g—XðY›‚y¢§yƶä ]ˆ}dk1™ÛüúÅ„=ò›W¿˜C•Œ,éq* óa'NdÖ…e;e¬‹Ç'OžÌë,\ „y»…tX‚£eG@B¨2Å^xŠ‘w@€ÍEsD/; }“|¶ƒ-¯ŽìaX,ŒY\ÖŸl*EºŒ!÷˜²±weü- åñhšÎóPc/”·Ù¥éa‡äâA`‡Ñ͇£ Ö:ãhDƒ$YÑ ÔŒ÷5OxP椬;8ÀcPèê4̵Ò×¾tà'ÈÓáobcé•-So`é—ñCêÔň;v,8Ö˜ÒdƒV:–IaŒc OÕ›ô'Š-áÿ ë»lWŠPÛI ‚ô%ô¼>Én)vQæع ÌgËÔM4ø:3«@& A ¿LquÅŸ¯†º#ÄËŒæ\ÿ¡~UÊX¸Xï«U…ßÿ}È?f»†Iv3E9ÊýeÀb±JÑ€iC˜â‰3‘ÞÁ¢²ºvMµ,á˜H*nH4¯mª£eg\Œ»`±(Ïr X´1¥e6\¹5ÙFëß¿¿Ö¨ñl|ƒß`ÀÓN;MP§ ÜÿÛp¥º`öJ`bF¡&¡?£î"w2þ£úU.U¸ ü´iÓÔçáÃÀõî žèjCˆÀ¥£¬2[„ P ³_ºÂR4› ‰hÐÏ߯_?Å(r þœªÅ~ø!BZþè£À+Ô~\¿thpÁÉážÉ‡[‰ZÊ&ìóåsÿ!CJùË>ð´ýÝc\“\I+. "•¬ ¾ñJ³oxÙ4ÐÏl¨h'ÉÜ ’¢-ï£q”Ènq Ð¥¤€HÅÖ3mѵÌôHÔì¬3$,º.ZÙ—_~)[RT‘dÓ=‚À‰æK4¬<8ÃB €¹%–2±²„eµpb¹¡âÃÙ¬X(Ni `1ahU: ,XÏ’&y/ãj0ߨÄ+…üÁ"lá² d^­Fm¢™ˆµ†Ž®¥ƒ hË[y æOuGÜïd¢è£ÈÇL&çÂ|TVQìQ3X8 Ó䥬—ÆÊ3ŽaÅBè*»æšk˜ ô:thc #‹Ì]Ò¢ZeP™U"=¦„ñ²ÑFX*3$™e9²¨ º Á"5Øòu×]‡Æk£Ç Ç+É$´¬c} Ëšx0 }ž0+–Üâ4Àúö×;¿T*‹ze¹Âo^p¯k×®¤àbE@¯Ô޼´1‘ž1mÀÀ²6 ¹Ã »ö²­8Èh¶ !`1|.½ôR»V…©Zžš¿¨_|¿}ûö/¾øät@R·¤žaÀËÞ!‚¹Í*L9\K‡YiÔ‚–mzŽ¡}É%—Œ1`û0<æÊŸSßpôª_a­*?éÖ SàHêê¬.d#-UD»Š¤QÆ×(®œÞ}ôц”{È_ôޱŸZe1ÒÔsöœ=7³)БŒÎ^¢b”qàñŽ ¤&ã[CCWX2”ùrf±W]u•u“P´D‰ðC;§$Õ~¾É6¾¥Œõ #ËÌaãÑ3(ÖÛaG¶lÙbŽqài›(&ó¯†áO~òiÁzóÍ7Ã{ÑÙâm°y_ÙNË ˜ .%?Ô3.´ýO?ýô³Ï>{å•W,ê_z$ñ.F1¬ƒ÷ùçŸó7Ôžˆíƒ Òå«„Md…D½Íi[m M]sâ`;x%Ø>=üˆ¤UÚÖxq³'zŽÂ>ú…É1ÆAÙÞ¸q#¯›4i’ÎFÄ0äY;¿[UITœ5kDYâµÇˆS8õœdˆ ÌöAw¨è ,`V,ª, ]Ñê¡S>ä\BGPú€ܯ°bk/Xm†iÛ/1\%ìͶ˜Ãb1mÝÔÂ$x¸ÿ.¦b]µûî»/%G4²Êv$ûV%ÕªJ%Ïzé(Ä5lØ0´½]t JÚéëׯuÌ</^,% O“ÿ´¦²°¬Õ¦„àˆŠ 7)O‡NÑœ ‚ö±ü‚T#3ÁºyfÖ/æ¹víÚO>ù$têÈo¿ývb‡jçÎIÚQ¿äŸ`+zõÕW#©×¬Yã´ÍÔã'3Œ×ÔõZC#×]»v-\¸Ðæ2~‰µ‚©¨QÐ;'žx¢éŠvãJ½tÀˆœ²n<%d(P´ììi/B“‘í¨Â^˜]hÆÖÊ•+ß}÷]…šuY±@ùÞò¦1bG˜ Œ´E×2̇ÆSÐIýŠ¥• ¯ãÙÔ>?˱ AXCû -$ ‡XfÌ"ùjù,”ž7{°F²ð"ah©â$ÓöÞ"âÉÞ|óÍT#a×0^éÉ ÿš˜ ;rýõ×KáÕ›6mVR:ƒ  ëÈU”+å °Z·n¯¶¢%¹¢3FûÀ+@dYZ¾Ádc+±0ù!1è‚¡Ú·o?yòd»•¹¿iô«07´Ðí¹j¥;Ø Jrå¶mÛx¯²{WýJáY›Öi\¨Eó}ü–,ŽmóhDÅ5é3 lId.{ÙǪ,ûxî&ò»é ½½Ÿ߀¸XÛ-Í7…'–Kjw ìYA±VocÔ»wo5=,& í¦Í=”Q؉ÙØ5lÁZ=œå«A}Ãêý/ŒG›§ÇÑi¯R4ؾ Ä?Œî‘ÊºÊæ[œ;)É_æ¯Æ”,O'Ú …"ìÆ‰0eà<ßðþM¹ û~Λ7yÀ9ûè> ^F2ïšx9‚áuË—/ÇŽ3Ô0»@ÉÔ‰}‹Ç.壢ԧb½D9šŒF=}útؠžŒl÷{èT˜Ø¿Œ-=¨p_Ç»lf³ ¾)[Hk/”E~V¯^8pøOé*Ý’}éW´Ä±ªü‡™È­{fG¹äDçEL^¼ l¡ÓÓ ·xÅ“)“ÏÚȼH¸Y3Ù¤$Ð> ¢K0 `’ÊEÖLŽe_ºmc9òÁfpå4RQ‡w1,’3h†*+fç¶[j#3Iv9 æCâÄò¢´}ÔMá–ùˆÌh§rE jć,()áñoƒ0@£høʽs%û[íËZ ¬ã‚#‚®eû›Gèí¯‘c¶LÛ¸—¸’’S–b¼µ¢¿LŠî:ˆ®§ò <ª yò} v!©˜Ðif2‹ïÍ^38ã° ÑŒ}øÝÀ:Z¦®À8šÊC+´^QºÝØ2 פ†Lyü³Ë ÓˆÓ›ñ-—Ê•hÿxÅInmÌ2צÖо4ðUZ*u5E‰òÀ:Œ:ƒ«ÃˆðÆ,¡ ÆÒiÂ:ˆ¹=z”AªØuîÜ®åë4öÍ‹Âà\pAé*D¦£Ø¶ à#¸Û¶m{Æg W – µ2™81âhÕ aw-Ñ8%eIRt1?PŸÕ_“D€ºÎmÊ‚LFf.m-ÊÝ»w›œ0é²³Xrø É«ÑI 6¤3yÁþËΖ÷êUÐ! eAÑš“¢·ÂB÷{cYì`/ëâãR™´›ÏIF–™—ݘÏå—_nv6ŠoT‡$R[3ï¿Q Ôµ{Qêèr§j†/µSöc=f°±ß(^-Â&™ü—ú#¤,ÁÇO–]õ´5r.¥Òˆ#Ð ÷e¿4Š}JÙí[ʾ¥IS—3ó˜cŽÙ±c‡ìÅ2h#©Té_ä—¥¥2û !Üÿý(´@¾r€ÎªU1",òé¬\/ã;+ñY¯4ŽŠËShøVþy”ønNfÃ*陑8 RÇŽ¡V8Êš>´ZCÓ"·›ï¡AH‚Q§+néág™€¬ÆXƒˆ A^mÇ„xìüÈ ‚J~±m1ã³-[kÙLÙŸÂBEyoÊ͉Ø:¨K ÉØR*X`òê6VÉË·2Ž«ÔXK:ßé—‹èô,MÉ76Õ’W¸|cDU‹°P´•ö`NB£z™Yì̶ÎIYZýfJJIÈß>ýªI {¤®îkNºuKVªé–a6ª|N¾Ô²ÜyÖ%Íì i è« ¨ GUâ«<”ƒ ÙfŽ•ƒ-Þ.l¡èœ¥¨ÐÜfûÇGÇú.U>ÛÕU¾ç›z ^4ofE:3SÚ]ÀÙêsù%J{ü‘Šßæ›kÛÙ"•[ú?˜¢F •ø 6jì”tƒØå¿Æb¥_³[“ —ê–ºGnã3:¡oqÇ]Bö=ú°áOå m'aíVóþ¬c`JDðy³5íz¼Ïáp{¼X£•pŒ$ä-ˆˆ°V­Z-Z´¨$Š}àÏ+W®DâL˜0AŒ;v,ƒ[Š6Š]öÆoÀ«:ê(#ù1a,iô Ê¥eØÖVn±¯Q§Mm«ÕÛë0ÿäo2l¯^½,éÀàºï¿ÿ>~ùå—ì–¬ÞŒøß€9ÜÆÌ…®]»¶lÙ2ÕÑÙgŸÝ³gO —Õêí? ŸþyS×1 ˜6KÀâ1&+µîÁ‡XÃqÛ·o3xð`O^¼xqB€ú•ê=ÔÔ©S×­[Çø¡Ü%K–phïZÐpx5ã¸ü[o½5ùƒ¼W¿·Ø•±ÒP„Ý©â6gbVŸ3ȪҴ”-X°@žênذA/¢ d2ªZ܉Ç1Þµ.ù‹ÀÚ¶m[(yýôÓO3aû;ÔÊZb0&¶¹ÞHV¥h€ÛÀàd;ž‡Ù‚*@à ÝÐ U$œd³êÑ«¯¾j£v9¶ªÀÙ¹s'ÏjŒpZ(¸ä)+²Ý]®ørôèÑ—]vÙ©§ž:nÜ8l¾ô´š°Ë<™28‡Ÿ€‰é LE(£µzAc#´ûÍ7ßܼys@ʆÚïÞ¢Óv߃"jeb¨v@É¢Ö*p= Ñgúè£:™ùÆ’ÔòR˜íƒ%ÿì# óíÊ«¹_ž°Gp-kŸÊ£à-z>A!^m¹ÎoA,Q½€ÀË/¿l8œ ûük[g&о÷Þ{ök–Š—-[¦Vo_<è…×éÍ`ΈÉп0¸¥aÌÇ\cÈÍ®£_Ö/£³ø’ge¼,–¥!Ñà ñzYÊ8¿­[·Ëí®1èü|cãŒYÙX9–ˆÍéJ¿"ØæŒÚ0(þeÅ`‚·i@¥I=ô¥Xò€ Ä^ðÓ/ë—¬’Áaððćc›³dWt2²¶ž¦Ðçl¡?î—쮨‘bï9fÅÛY/xhõ€f‰Zhð‡Ï -–ܸ†`—UGŽe)œD‰–YEj3[î¤Æ¥@Ì-ª;ó™;w®û¥w\uuª:ëׯg|]Ž"-SµÅÔweuJdÐ.' Ë 3OÞK€NŸ½ÖXcUÖÏ3öÉA©w-[µt/0 ÞÎ ¶&´%ÓäÉ“-©-®bΗz]·nÝÔ”¸”3QŽgÙÞX˜›<“W?ùä“ “ñu {å•W>ðÀÜÉ2‘ÂHÌ>}úL™2eâĉsæÌ™4iÒËŠøÛºukn¸÷Þ{¡h‘2 Kqß®]»4ø»¿û;1ßjÓíñJ¸&|ØÆÇê®`‚Í |Z‚îÃÅ.\qÅ0yTe”@­ .¸@ªLfž€€aJŒl±FÛ¤ç9šõèøÞ{øl.¨ÅgiÇnÈz¹†ʳɋa$r€Î¬þ÷ú•S /D h¨ƒ!bÊÓò„Ž›í²>?ûì³Vcȱ`¨L'Œ O25Î?ÿ|^äµ\$ ûÕµx ôe83I쟱"zéÍñyŽ5 h›)¯r›¾±Ip&eMZ&ÏêJG“<Ê‹øv$puàÒäG áqS†UN¢é-±¦ºé°ŸÅ9ú裯¹æ)iÙ :tH {O ®û¿êìÅV**±pcpÏ`Õ->Tyýõ×cž 3Zj_ÃMs†HÕúŒÛ‘]8ßÃ%ÐQO;í´ÈwùC,%—0+P’û÷ïŸH6Fã¥À¹ì §DôÃ^,9¨æ †°­wÞy§ Î6²WD“S%¾ÝPTÁT*cLël¥óa4Ä™L2áýºG<ÒK“ ÒàŒÒ0!ÙýDQæŠSKLÈ ‚'ì]ðÊ~÷¬nĈhø¦aÏV¼nh¶zõjLNĬoß¾à-"¸¬£•ZIp!Q‘-¹É¯gu–%¡Øe‡µÛ£Äã¹-ZèyJî8S²tž¡×숥Œ•†ž£íï`iVª¯‘[º‘¶`ˆ JöQkÆZó“uõêÕ«{÷îýë×È‘#Õ{K‘åkÀ"L›Ôm|±)•áò”S&¬{øÔaûEГb³Õ“ù ¡ZNFã.=8B€q5hŠÆ¦ÃAw. OS¼rb¥/Ñ€@ï·Š¦7t¤tzK¼ø¾è3M@]ùÂß27*~éM5žÄðÔJaÃð¢dêç—ì—9?Jk9§¤?Áuå 6 t„°äiî6†QàÄL±lìd6x¦t¶Þc_ZF³Éxe!eu28ÇP4>$±B[>mG XÀU°õH¥„ªÓNú|šš™º•j$zì˃3&ÏÛЋ…"|d}îxée-Oß 2±÷¥Ç£µ†B£ö(¼Øñø:ìSÝ@¤ò,8Žz£ÈŒKq2ê|Ž +‹-xô\ÉÔ³»“#ƒ$C» K)û’.<~µ )2= žb&'wÉ(G׎RmP.jðÀ;uê„B8fÌ,;È¡K—.%ß¶º¸ ð¬U•Plº1lØ0/¶*ø‰i€RÔ¶m[‹ðëM7ÝÔ³gOŒ Œ¦Ý»wïáÇ# óg(32š9ˆ‹È(ÃÌÜŒsä±d›û èF#èï¿ÿþüàèKh¹êüU’"5»€­!eØ /ݼy³8_E{´ÊnžÇEu¹ï¾ûlKd…Ë/¿¼B¿ìi;Š_Î|ÙdŠ/â›0ÉU«V¡å¦î(¶;EùY KOêZ½áŽi­XC +v–|œ‡±€½h†<‹:Äœy/7€0=ö#—¶èˆ n»ë®»PV.\«yàvìØÁ¢`ÂÜŒ’6±~¡»òL€Ÿ~øa0`䌦gMÅtûB}µ7B'1§žz*X§1Ř?²•¦W\ÚhÞ Bª¨ së­™|íž–…M4.دŸþô§ð«{ï½×ìÅ&ì!Î*¬aþÅ_XK3žÙGØ2B >©1¾º´x(þ]yŸ%­Õ‘Û´iƒ2aÂ8"Fgª834°ß »ôËÓê77¹`iÚd ÜQÒ4ßÀ:6È ciA ÝÉXLH„Í&Ü‹ïY¸ÇñÌG³ÜЋþƒ‡1cí»a¯(é-ÝsX¥˜yš‚?0Þ(, äÛåÒ ¥)!FïܹÓcÄBX挪€d‰;—ùhjÁX<È`(ît,Ñì=õL޳ë‡gÒ¬Æ/ê",No6w‚!¨©Œ¯FÍ*’mÁÎZTva/?vSg) g ¬H'+BñÖ_š624«Ìþ¾ôÒKú+„ FÁ…^8þ|‹8:õkVs™~¨ÃÄ0]í ¦mÿDünݺ5è­n9jÔ((•21$)«ã=èNééª>( z¸X;Ù¥vO±)Ø8èÃaªŒ€ÑtóÍ7cÁµoßþÜsÏ=ãŒ3Âmtø³Ÿý *ƒ·c³XÞX Ø>‹BÄ„´»î#Ïñ£vFsÈ‘A©ÛÛP »Ó 'j‰ .-FYý ôÌ4ù%Ãa™¼—…Ç%h5OcFK¡ ÐB ÊŒ1?ݺuãu°J("<-ˆ„ýÂN!ã»`&|.ë¯F«±×ŒÚHã¨Zó÷õTdž…Ty0²Þ‘2“Dá–5Kï±»o4…ùzä*Gå(î—ýÕìMZSƒö0ïƒÞígb¼5¥ÞÚÿV¿¼Ÿ/¨e›Â¨ æKÚì{ À”ôäfLZ©ÓKeûÔá+!è# 8¡Nªgê@Ì^ðÁ †59%ÞQ†Jµ> Iê·Wú m%G0œ/áÜü["«05I1]VLBâ°B F$É Þ”½Ò.åDÏu©bn xÍP.­u²下ͯß^‡v…gV²œƒ2Î*R›z¾À7@Û|aëöY»Ï²ç™pBµ3lÌ.Ä.6,ÊêìÙ³ãÆƒ''ëªì?¹úê«õšþ{¹x*ãØ&¦|ü¸ã޳’¼ÅÃÓÐGùÒ¹sgØ2Æ…Ÿ1cW¯^&ƒhÓ{¹_ÓLÊì'ã &ˆ5!»^´h‘Þu‘_ ÝIo¡ÚW™ ûí/ Ê(ñУقìˆ À±kÒš'm;ØŽ¸ Ñ‚øëÏbŒ<åyŠöx¨5~ß%Ÿ¤ƒ ­S:gÀ^Sze¶†éÆ·©5$J‹Ï’’;Ü£C‡·Ür <''ãEÅÈRw­Õ[o°Ày󿥬V9_òjƒ¢õ§½óÎ;ê`ì£õ«cÇŽ¦‘BD‰ˆ³.´FœãÀë*éB~o,"ò®¬Aáå‘_É%˜¿±|Ì*f ,âÐú5bÄ^jâaªð%¹I|ƒ¬0èR{J©Q ¬"ú¹œöÿ®_ùlñÛœ”aVC;zšQ^BÃ6(<‚¢à6HÀ=âu(Ãp U\p5-ÚÁ±JôÿšeæQzMVòÅ̇…e¡Iš+ S»ÉÝÉ™¬;««åÖ[oMþQÄqc´2a-î/™•õNYàë׉'ž5å~$܈ Þ›˜´á^»v-x/½ôÒtˆKOôäwëŒ!Ieol"Þþ‹_ü\µnR.î¹ýöÛŸþy4̱iÓ¦õéÓp]qÅ(Ø£GN´Ò_ÂÌvrÅÿæeè,Ðà Ì7oÞ¬ ZÆKð£>ZA¯ÛPó€»ÉÝæ&ÉšVƒpDnbýøÇ?N‡$ÛºfÍš×_½_¿~˜]PG§NfÍš5wî܉'ZÃGBóìÛIê©+ —œSm9*téÂÒ^˯*’šS FîU§VþõuÐEâðv©6î oºt‚ÁRËÈÇChzàK¶_)OjÑ~®ð‡=Ö³µ°l¼ñ¯y¶œ¤ieùÉ(…@ƒSÊ/ú[ž+u9ï÷K£ò' ÕÆå ÊXRøV„BeÊrÇ™žL;¿¦ºZ)RK{- ¹!åfÂæÓæä,žE½\Úk:£T³ŽË‹ü^„41`äNôä”gzQ _a&VÄåK°ëµ×^ƒ£5 6LI ¶iÓ¦l¨OãŒ3Î@'{\wÝu(W'tïðáÃÇŒƒ† ëÃyx/—3ARðºqõËÆ7|X¼x1ʆ¹$ õÐCMŸ>ý‰'ž@LìÞ½›E%³‰µ£3 [ò.ËÔïï"¢å¦3 ½æP¯ sÙÃA‘˜X%j_ÆÀL:U'˜ÖJ“þyF¯ê+ù_~ùå‡v˜.Y„-C€ÞtÓMi†2Œ?~Æ +V¬°pGZˆÚ,^m>Â<€,f×<¹[Z¿’ÔÆþbD››ÌV®[·®}ûöÆs *惽6 "öÜÀ€ÒãÇOè~ž}ŸÆÙÈ/ô¶)Ê¿¢   9 XQ=Æß³Ï>Û]°Ú:‰lÿúÅÂ1$ùט®|0 {aïàK¨ô¥h>ö7DÙD¦qrL²‰–h SE‘Æ^ˆL„On¨_æ¶çsÄ.ZZú†-åP.C×pƒ^x]Nmx@<ôÀ¸páB`Ž}ðÁhÂñ¢[r m™‘À‹Ø çž{®ÌÖ?ï¼óÇÁJŒƒ%ÈîôíÛ7Ù"–™XÐ{`ƒ eâ3°‚/¥Ä@cd¡m‹(@-Ó†Ç~òÉ'À6²-”e² À“ e!à¿ÅQùb‡‘2Iþ&tD½:5è˜zÇw”/½ºE‹áNö:´ü£ú@EoQž²5¬®R4L­"¸§"¦uù²eúïS—V*éå°—D÷îÝ¡ ÈÙꎀ!ôêÕËþnð‡PýÞ|eßæÂÞÄB´–2sC½7x^™‹˜Fg†X€ó¼þúë­"h¯:M0TkkÕš8Ù¥K»iòäÉ|Ð{i7T O“kap=óÌ3~í7×/qOç SŠ*…¾™ª¤þ3dÈ1üª~ù‹”±W:4ÅÛª31íõk²‰Û¡y²J4ÃW˜ª}.ø­#{­Þ¤ .á95 $xù×Ò†ö}T¿ü— K³Ñp³Ñn­fVùÃ&Zë´úe{/>`“Êâš0i=æ…È(}Âáè1=‚Q…à{”™9sæ`q[2×jCˆ«èÛ]»v-K¾—nQ}}tº²mºágÉ”õòOŸÊé^JÆ•5êà 1÷MŸIJûò:”%ƒ“ÕŠ©Ÿæ o˜vìØ¡'Ä÷¥ (K¹“„ øÒóoêÿ/õ+rí±„‰‰-&-&éÒ<ý$åH 0"ðŠ;Õ#¤'Ö «l— }Ì*”Èž¦Æ&Cñ£,€KÝ*x•=¼Ê’ÅžëYÀ‚{ …TUÅO<†­ú¬` gÀ¬(ùj’ƒi¡'QÿV¿’=̓zðrV¸7w%/B1öŒÞc‚ʯ•"LƒíÐÃÀOvdȯXæ# ×лlS… È=ü-{…£´mÛS5L—”}ÇЙ‡ 6a”tïT ˆ/=­µö¨€•qVª¾_CéRVãSž¯ «¤©‚):PhBök86¯3m»¾qö·¼Ð4dź¤Nlý˜ÌÊ8 É¨îdò8ˆqÐAé÷X¤Ôaöxžeð*dv±–^xÁ#uÌÌfÍš!MÊvëׯ—¥h×ëW¬cÞ ªÕXŸG"»¢j”©­ÁK!|ÐÏb}¶Ÿ%¸ßވ'Nœ¨!¯dI åd…¡mŒJ2¡ôu¨rDE¬œ˜œeÕ¨Ï6RÑ!Y óÑSêªa¤•’› Ã!˜˜,×¼r,ãÉÓW(Qo´¢‚“OŸq€|饗L°£ËQ5;s«V­‚±—iþ̹’5 |x"H–µˆ#dËÏ©˜a(—AÝ1Àu­§»wx¦v= ‰á¦W]u•‡ã1IZb*ÌP—°Tw2IKÛÇÓÎY ô±ÇËßiÓ¦e]X|•Êyªûî¢ù¹ºËûëW©Xö0¶<ÿ–¶ÖD4y¡‘ÄTðæ_朰dá~~M!5ãåÜ,¿TLÔº÷Æ|ÖÆF—Kw–‘ofåè“g¨¨µ*f•â$åkŠ¿‚:T³§ŒœS*K*wŒ/#ÀY©ÇsaÔn ØVe¬#7— ¹%‰¢nž‰Y\1“Ô9_úØD¦ÊÎ2ÿÇëjóŒ3víÚeú³D5„GÇm@Õ-¨ eË–'Ÿ|r›6mî¾ûn ¾YøH¥%0±~—õÿKõU”ã{fMž…k=yèc¼wYÚ}¯g, m!ßt`G0Ùþ›_ã¿okéD‹6Aé»a¡\p@¶h­Qïoy¡Ì`±ÅsæÌa¬£Fâ]“'Ož9s&BvÊ”)¨C‹/æ×ý!Ç@ÕeÉ&c”ÏT£¾mÑ×=š|iŠÎ@n~ýõ×Y—áš Ønï¼ó-ZôÆo€À¥dGµûä“ORÍ6p±ñ¿úê+˜IJÇìQ—¶†˜=ÇQjÑ¢…½;ÜŸã¹Z½2¡¦·œjûöíÐ)K–ÌíeÌŠ4 ¡PÊL®ÑÕµh‚$×’%K óÝ’ìq~rmÙ²EQ"†Ãí åU´™ç.À÷¦K3mÍp”:#7U¬²9‡Œ eE…ÆæOØ©ñ3¦ã1¬!úªOLà­·Þb‡Ú¶m›© :œO>3 uiöîˆ#Ž4hÓtñ$ŒÍ™<öØcÀÓB"iW„frã7Z°4a ÀÐCC±˜j¸®|J‘Í2aSz=€Ó85ÎÙq>øàƒ”“ Š@^ùÈÈ ,˜@’åÜ|óÍýû÷‡*3Ãäë± ìõe—]–Ì>OdøÛ½{wÑiãÆf[ƒó›7o6ÃÀ’´Ã¨h‰¥˜ã߲ܙ¬²ŒT,%×ÿ¹—KÇ»Y«&Ë0`¥8Æ_×õgÑ¥=7×É–>¹²/ËH5üD¯"ÎÌòkÚøC㥺´¡ÏÞà&8W¼s&ßɂԑø;qâD¤ÖÁ•W^9kÖ,”4 ìAkÚ¼øâ‹Qr4öåü‹¨Ò¬SÍCw²e³µ àxêZ<Η0"Ë1qYkˆ/ý‰¿Æä_¤ðLõc„‹Ú£}ÏðÌÑn/XñFM¨˜ûa5&šýú׿fbj–wÖägªÜÿqý²ˆ½ª5£é°µŽ+ÿò¥\H¨òjU,¸Ö† ”ªVb·Îƒ¨‚½Ì2="ä'cÿÒ¹éõ«ìŽÇ¢X‘l&¡Ï»¬È–[Ž¿iÓ&ë;™»ÛÑÁk6åÚµkÍ3ò$ú¥—^rÙ&v„iókšL¡iÈs®æÍ›{Úrä‘GŽ?ÖÆÈFí¹úê«aïà¼å”sv©æãyDÚKÅ2JiýÆÞ`¹‹Bz§=DnBv¤±– ®•–[ IÈ\Qž“Žô†ûîù¶GÆ ±hœGÃZJ[LÆR²\Ñö·È`|+i{¸¬¼–Üô:îòå‘™½Û"8b?Ú."zíµ× ˆ:ÍhК@x4ŸZCåLKáŠ,–~í¿îàV‰ñ(/x{|²”(ìZCG ¤C‡Xú“Šÿ–R/§ÇHÚ#»f·¨ìÕW_EWg9‡rzdË_–l4x ”“8õ½2ÇÍ%ïÂF}ï-Æ#î©Ê³ém‰^3(8è ƒN9å>$wÛ‰ÙÀ®¬S½®]»vìòNU¡ì9›Ïú‘yGuÔÙgŸ ͹U™µ·†Ciýìg?óLÜÆ ÿÌvJ|¯!%qÔ˜Rš*¬ ›®Âk¯½¶Y³f­ZµŠƒKUVwA:)°•+V¬@×åft†hÅl«¡AÖ„±ÄtJ aÈ—Øh,5$²¬cΕ\ªZ£Î_!+\Ù4Ó87ÌÆ7ùc}i‰Ëü …—ÌÜ€ Í:áÆâ¶8Ì—j "’—ƒÔÒy<›¶f¸6£EYE$‰å{]ÚÀ€orØ×˜#YÀ¹RCãÛ\2ÂyPØx£{*1ŠE¦7~ÖÈUK£ÈŽT;+§ÅO¾_ºt)ÈÓ@†² Õ)S¦`q[ÜÃ(…ZC74úR_½r9¾¨«c!Þì=žvi€¹­_4ö¸¡w_#¤rÁm€a®ðQî@°ý Ó—ÊýR¢y®šKF¡ìHþxj —ëe!ž÷iË4®ží—! ­”jI<­.O"õaê|ˆ›:Õb-4mû0OcÓ=[‘æÄÇ£¦š´hŒ%¯CŒÆ+…4yî¹çV¯^‰a´ùO<!Ñ–¾?úÑø –ÂÉÐ .ô¸6Þ½{wÔlLN;ËYM ’.µà§ÐhVa}l…ŽAªúµ®“V³wi­eÛzO o;l ´î1÷P·§¡n +ã+ýB0ZCJ~­^‚¿ ÕqLJ®{Ï=÷0+ïäÙ­[·2ÃtúøÍo~ãQ TÙ±cGXV¿~ý{úAý2&!Ÿ?ÿüs´ÖþýûŸqÆëׯw LÏŠ|ÎM료ˆÖêgØnݺFw¨üýßÿ½Ç¯Fyj¼iÓ&7ݦ!67ÉI1ãO›6M]Z2†›¾dÉ’qãÆYõ"ûÖ­[{=Å#?üáÁF~íÕ«×ôéÓwîÜ)'˜Ò9v³xÙ”9áÜi&ÒÈ_|ñ…&g¥ø•å£CP¥ßS¼tòt®\ñ_Eh–̶r”fÊdysÙù¥ßY–÷_….Í^«nùR¶Ì‚ðƪ@øÂâðÇ é·-Þä‰lØCÜ4aí¬Ji7Ñ<Õ'-¬€MýЬËZ`{Òôdƒ?ü0´™°tÒI'), ÀNY~Ç·ê:äϯ€H*€±´iÓÆÄ(¾\_¿<¡–Õ\qŵ†º"ùWâúä“Oî¼óN×î—'N´ÈF­ÞO°oß¾ž@Y‡ç–[nùòË/L†™ ãÔ^Ø–?uêTÞ›Ž$7ß|³\|à_µGTvÔ/OÊø’‘awÑôàKVøQJ>õÔS C6¤E•X~ݼys|ª8°è«¯¾r½|à_KƒzL[ö.çA²¤ ïzñÅ Ô„‡µ–­ýÌv‰õ×Õ_]«×d#xÖ2ãh§¬MUDe„Gê—[o©XÄ–j@ ˜ipÏ®]»<Ðûí·*iŒƒqÈÞÏ&¢+@­²ÈFØ“ýöÛo?ýôÓá½&%¡$ !Ë–“WrÚi§ÝqǼhÒ¤I­ZµÒó FÝpà |@RÐ5†¤ M×Ðó´=HUÑT-lh¥©ZCê¥ôîÁ´N²ýÐÕÏ=€¶Ëv8³ÒMJ´Æ¯=Á+^Á¹{Ë=´§Û¿üË¿°§LÏ£ÿ’‹ðÚÅÉòtÀXÐÿT¿RtBg©Ìá;óQ#pa –%©í©Ö>_lˆù'^ºY³f  ÌÊã ®U«VÀ2 «I,ªdå—;wæuè!ÞŠ·¹)Ù)ù-4et¥e=Ôñ¬ð Û Øßþö·PZè\pðÁ?} õU-ÈÜm#JMÀŽòŒ£VÔij¿1Ï:‘âC€œ  ES’|¢A‰¦L–§Þ2IQ4§Ÿe¨¼\1Ñæ‰©Ö[î)¼áµ•>P r‹…hTü0!oÈýkâå§TÛ«5ÔðT5ÂÜ£ÁÖðÙŠ…Ï?ÿ¼‡­%'qª:dJê–—¾ñÆlC•O•)Æ&bà yW ÏM+ TÏô&UP6¨ÒRÒš+-Ûóå°Fy—œ ùóçŸp Æ1s>þøã-L”ÂqwÝu×èÑ£µSâÕQ›M0—&¾Uâ«“[ÔZÊéïÆ|Ó,]OV‰LÑZÄzJìÖ2°JO‘¾Ž½Ñ¯Bùÿ+®ƒu4÷¥D Ï)¾^;Õd [û÷{]:¡Dé²páÂ²Š‘1lÆù€fð“²èî~½¦L™‚šKYßAØZ½·òðáÃgÍš@L÷ÝwK†<¸¬çS¹rŽfIŸZ£²rå¿r99^i*ô-”“>S<,h‹R¡£§·| Œ¥òÞ„æÕ¥Äa+íÁZÚËYc2ø$Å„7&7+ScEQRضRƒ½7ÞED§±.åBì5Yk¨è^ ¯ˆo!Æ*&`qÁS+®øÛ¤Uת5t—PDš”aÓsë“„Q$ÔÜ(Í|æ©3$¯@!tÂü„^}d,¨fûôéƒ2°uëÖŸÕ¯«¯¾ºW¯^&LX¼x1æAÙÛîûë¯å-að«yóæéÎmÂÁAé O‘?üðävëÖM6’žÑMx¥Ú¹ÎOñì~›r‘ž%}pÆÞ_¹re×®]±&“~ýúÝÿý/¼ð‚v´ÑwÎ3gÎLÄKÀxG ¨ŽÂô”Z•kÉ’%V\°`ÁæÍ›?úè#õyC¬Q³súÇÀúÞ½{·`‘í¨«ÍBø‰¶å>«DŇvKÖä CcZ™¶Ã4øFc€¿÷Þ{>kˆ üÍx•|kjsØù·ÔüœÖH-x2³ÂTñ]||Ï;ï»"ø|õÕWk×®5P&ÌŠÒ•›wíÚ5}úôHUÞË=²z É ¼Ñªž_|±ë¬zÑ¢Ev±*9Yß_Õ—º4¬R1] ±Øê´Ú‚¡Øhsçεÿ;T¦½lÙ²ï ]æ§‚è.{íµ×FŽ™$i‰mÚ´ 6áNÃȬY³F>ƒ:„²¤?_Šæ_u$wðú•áÛ0·yscð“x¿Êf¬Û·o7|ŽÇÿáþIjì• ÷ðDÉ g8^¢æYÞMžf;Z¾Iò ]à6ÜÀL˜_2#Çn©·Ù¶nzÔÞ·mÛ¶cÇ»²ê€Zµj•þF0QÎ3V«7³ü$$þ‡úe¬8På3š6¬Ï#HdCÕâåË´iÓŒ%Ð# 'D€Úw8¬X±Âln §8&`jø§›×œ9sÌ0ü)P–{zä‘GÜ\|ž}öÙäõ‹žê,„Ý·ï*óa»áÿ†Ú±‰?nܸþâ–›.ôkÚýÙuitO.ç<}ØÃtþE”Q˜ˆÄ—eÓ[{Œz¾`Ÿ&x8|ÌÉóÅ¿:Rà?¦iëÇfLþUV¯æ_¾L5 îñ¨Î2)ÆßÆ)бÆÒÿ¨£ŽBç4¢Æ¾3pWDÀÂÌñaª˜3VøA<±)HIcQìRž˜ 4 Æ‚ÇÔxKAÏO¼ËÖ½^putéÒ`Œ¥Ÿ'uZ$¹þúë>ø`h¤yóæµzÖ¶mÛ¶lÙrèС>øàúõë-UŠØBùI Û÷×ß’. ¿b‹-ä¿ßþ(=W^pËÈ£LB§'žxâe—]†º!è[C%øÛÖ¥Ë EwbùpÂ¥K—véÒåØc=ðÀÏ<óÌaÆ¡2¥oô¨.J”9$Û"a¦u¼Q¿òo¹õeð’r Zß°D]¯*u°2åš·(u3øsboLöƒGf0ÉDb(GJÔÒPr¥Bʤ”)„eµ«š Y+ 6>gç)½ßijæÒŒ„Ï™]æ_ÆÇ2fÙ*E=¶d€ÆÒ§|œîb&ã»,X`ý[³-f̘aüêt|Ë@fjFN3S\%Á]>ÔÖ8 ϱcÇÞsÏ=W]u†Ê3rÖ¨cî,{¯4V’çòýõ½.]êÒŒ goáÌ–Ÿ'wîÜùöÛovØaÇwœç/ºX›\ƒÍÑëB}ýséÒ*ù¢†Ëa´Îš5«gÏžè~Ö#å{ÔNyHNÀ­ÈQ‰ŒÊå¿9ð’™~Þyç¡X¢^Ο?_o€o1”HŽpTJÁäóVø¦‘‚i¥ (ÿ•ž _eg-%‹Ë^Q©h8#ð.^'‰í´Œ@®5´ârË6d¬)`ò‹ßÀ Ë‚lÓ§OOpˆ(í¿ ÆpQÙwí˜\®}ûö£Gö¶‰õY6Â*C–.±©+Š'ŽK¿MN­\˜C–ùRž5Ä17øež·ÛËÏ£³³±nN9å”0ó2mê{öõ·­KsÁ'5 UœÀ«&ìÓÝX@nÞ;fÌc–.¼ðÂ#Ž8"¬F÷¬É“º´tôI \fa7ˆ}×®]ï¿ÿ¾ÎåË—{Εxl3_VñÛú•ÁåEyEBÓå“fö…ÆÍêªð«è{27Cל[™û©£Ã–¥Úi\«ù†y‘ܸ,Åþ©2éé¤yˆº „IRÝk -§md¸!pø¨ h³2Æ´²ýøãMµN„˜Í>JÍÙq<Â3âB#ëu×,Š’Y¥JR@W¦;1o.@ýI×SYW?z‘® ž˜‹1~üø¤l{üñÖ5:묳zôèQF»Õ…W8¿š¼äÌDøž~¯K—×ìÙ³õú/V[‹-ÒÊ£j»]4m|x9TØEÿþýÿŒ1¥Z ²V¼ á³Ï>»à‚ ®»î:c›½`×¶Á2dÛvܸqº42ùRnðË_þrÔ¨QpªgŸ}6A5¨.™/^\¹]|ñÅüµ[·nò’<"{ÇŽêŠÞ0qâDC‘eÎü¶ c1C`Μ9²)À»iÓ&þMÃq¸ÙÂ… ³FæƒýnãWÔ¹L»3pøðጠ߳ûª…äÌ|¹aÃÞÎÂíáÕ®]; 4 ÊKaJú"3‰#½V¯öéT䤓Nb!ˆKDƒËùÁd›¾µnÝš@¹õ|ÖšT3gÎÔE£ ظqã‹/¾hü ƒX»ÖP •9£Šî˦1+oË–-µz Øò±Ç{òÉ'·jÕêÆo4à›Ô9‰j®˜6)daË¡ïÙÚߌ.ýÁ$-¾öÇñ¤-Ó6·Ž ËîÔSO7óÿÈ#„íü­êÒ–•+„ÚK„±¿øÅ/l Û¡C‡Ä«®]»j˜ •-¬_ž‚’‡Á.<íìÉ¿Q´`\+V¬°±‚ :Äþꫯ¢›ÅÝ w‚K˜˜©¸þúëåº0ÑsÏ=gЈp›4i’6¸%Oûôéc÷fná8Ĭ”¥¥²Ð¯~õ+Ï#^ÑÊ»çŸCÛL‹€Ó­›3‡éY`Š4’D­U8³d“ÜulÞ¼Ù C+B¬]»6þ³àýUËnõêÕžÉz}ôÑGË–-ӃͰHFå» ƒ,Ѓ£JPw§Nj,:ð_¹r%¿ ´èuëÖYÑN4@`½þúëøÃÞ}÷Ý À¢Ù5Ø8¢(6ؘ% »I‘±{÷nû[‚U«Gø‘* š¿ñø^—ÞÛÕ·oßèÒ0>·lÙR› >á„@BÌ7 Û&´ÅþÒtiM{m|‹«ö¨Ùúj5»m æ£[ÃzbÜœüÝ¿«ùìOÐ/LÆ´24=cÔ¨íÂã…FMÍÜÔrÑW-ÚïOø’‘ºe‚Ly%Ù¼±.&ƒ¥±_úì ëîÀöu†)mÔ´[ÌñÌS©Þ0 83/…™kšuîÜyÛ¶mÑ9]އy‘lY®žÞ(êŸld&ÿ¦Äh­žŽÝÆãβ™ÅfÖ|Jo1N‰jøèض wÌÃ?€lºýöÛ{õê5räHômãad³Ó¦MSd?òÈ##Ï‘õcØàÏóJ üî-7êûë¯Q—FùÎý*§<Ò2<f’ÁpQ =;YÿMêÒæú5–ƒ¦Î¥ª›Ñ€¨mÛ¶[@œéµ“ˆÍï0L×âÉP«½ê ™È¿ÖüÿÙ{ï(©ªmíû YrP$'Á@TŽ(¢((ŠQQ%K’%#‰’“D‰"9#95QrÃw®çó=ß¹÷½õýF=£çØVS}šÚÕÍšô¨®Úµkížù̹æš,U,±fHÒ¿Ü5Â(K¤ãݳ*¨ªØ¨¯(¿…¾(TÀTÊ—ä9‘BQJE¯mžNQÐÚ%Ô§"®Œ÷ÖõS¸¸R'éþ¶¯ªä0`h¢‚(¬v­•büª=üº4‘~T9ÃÍQU¥Ô9ǯuÜ>¤l_UªG71+F”'v„}dþç{‚h[fÕ&ü*diÛøò[ÚøPnF%¸Ö t踴WfΜ©Œ.kÖ¬A)@e¡vƒ>zô(TM•§¾úê+U½IðëÑ㡬žöCòrè<µ7GË–-•FOeì€eßµR¶s§œ¥ö¯ºÎPÛ»å„-ÃMÌ`Ép”Y¬P6!›•i=³Å x° uWˆkW° ÑE'6hÐÀHäPbçÌ™3wîÜÜD@§öÓ{Š-ç/ãEwñ\½|ù²~EyWŒ 6 LfPпEŠáoÖ¬YË–-+/·Šò„ÔEåVVtòñÇÄÕWeíºJ­(…¾sn$%. ‘Ž'º2aE;P˜œúé×_Ù¸páB^CžlLö¤I“’*—UŽG‰¸ mÛ¶…eeË–íý÷ß÷Ôû÷ï×eÊÉ¿feó+ª™b5Nž<¹sçN:œûƒ¢ ª¼ÖÊ î1tª‘w˜«V­’Òäž ñÊ•+-?¥KRbvB}×Ü:‰rªÂ‘2! ó•aLÎo:Ùõ´S¹€h¹ ÞEƒ€ÉÞl®á2~bãÆ›7oÖsÉñ¢Z¨ˆâ@ÐeFæ2G«h’,èªóCwòf Æé )5) >™±Ò’Š“ä¹ôø‡2„‰Ê¦IÜvþüù=zô@#ÀŠá-Ê”Èü/]ºôǼaÃ#¦UÕç2jø[§N-9 •0ßšèK1'‰”K3Õ+W®Ìtbú-Z´HY阖cÇŽ}å•WY4{öl­ÇçÑsöÐëô()¥¼h§¥?bÙŽ5JéÎ À~ø¡0MÅxêêrÊ}¡ DËI•KC·öîÝ«ñ+»sö¾òä³4š6mª=D ˆe›)S¦ôéÓÃ%2gά‚³×"Ï¥•ÌA.…+‹&)¥R.¨ª=&âtüøñ–-[jç(cÆŒ£G†ëBYÝÞŒšüË›²vÌõAQöÞäwìØ!ŽždTÒ~ù·§OŸÎLPZK&¬(²<Þ ­žié"åÇ۹ܓúYÔü\Óø– mp+G®Þúøº€@îxGÌò$£>±¹â·mÛ†V²|Å`,´@ŒïB†ù!;ÉÂ=y(y›y"Ú€ ‡™t jÓ«Íü¨·„‹§M›fòÈ#Ú•£í\!±h§RG;5»7n ÷`ÖeÏž½GôäêÕ«¥#7‹yVùrË+®q\·n¿^ @dÉ’)C»úÁüÒ–ÝÅápÒãÒ˜Ÿ0éÙsAIˆ9¸júÝV:ì¸îÕ«“vâĉ%K–T{þþ÷¿Ï;÷Îô¶¿Ÿ~ú)º‰¿r«F[yJÛ› ór”/_>W®\íÚµ‹[.ÁzŒþ´ÂUÞ *<-T]µP[ŒTÜÞVÑj/Ð2v‚0Üù`P˜Ç›üA–r>{óñ€Þ dðMžm9ó•pFÑq|W)”¿Ç þUУԴã Þi-sL;ŒŠ¾F³@}­Ô)Ô]u¡¹Ìæ­bZÄóù‹¢¡U|ªXhúМ?b,Š—"›9sæ{ï½ìgÊ”©fÍšôä­ÅVIÑWM›6­[·®pû“O>Ù±c‡ZîMŸùN¢ŸKëŒs¾uëÖ:t°Š«!Wg.n ï–Á&¡¸´£EM?ýôÓ‰…Kb˲Þ;wî\¸pá2eÊtìØQ^)d Ä9‡bZXgX”ó_çMìÅÚâ¨Q–TA“ó2ÅáÕ^6‘¦?¡ØP¾s,{×/ý[ÑTÑ<ïêþ¢Á:Û"¤õ¦iòv‹Îè© íã†J­i`U uñðáà ( ï‚ÕíÚµS9UæåA’6Q,…L+4ñ¥—^RDô°aÃÐh(ï³{_ÇC¥4vj94¦Q£FÚA6·v•Ãá6ñÊNd+VaØo¿ývÚ´i¿øâ ã!ê^GíD#à —Ó´ñGg€^·*¯uô>K–,p6T¤Ö¦3•~ÌQ*Å-bƒFÔÕ4î,†é[ÖÆ £áÐa@‘U±z5@Iùøn8.­èbÁ©’µ*³9ŠÕó¢Ù¢Áò ß49U™å¦\Z-¤=ú]^X*ie@Õ¡xö–ñÈÝ” J0è­¨"çÁ;Ÿê)4=h°ö^UóE1'êUM~u4^1y¼n|]k,na¾Y¼ÔÐøñãuÒÜ”ž°Õ4œ$%.­¤mš?Ù²e˘1£`9þäB6¯t@;ë ^”"X˜Ì¯Ô®];±pieZ“kHñWÛ¶mûüóÏï¹çžâÅ‹—,YRýZþÏn;v ~eÉyËägV’=þŠ¢+ɆbÌ„<òi¨Bëºuë„ÕJשdG✼à_¯Õ[ÿ]¨=bÏ/񻏡 - ç—f·lÙ¢(;}Ñê)ë°‰²j˜ W¡ã ¡"Bu±Ž6´ÔôЖ¨òçb³ü‚Ñιr岌‚iÒ¤2dÈwß}§íu)£½{÷ªÓ€ôîÝ»ÛÅcÆŒËjÐæ‹êX©lAüÇä²u µ#ÔÕxõèуŸ(T¨žÝ呾¸ôÉ“'µg¤ù`¥–oÇ/ˆ-X¯×,g,ÁÌ™30À"²,kPÈÞ}Ä$±pie6_„€ 4ÐP¢€nzKtlº•\‡CÆ=n!Ú ÂL†Ѷqõ²¨²¼ÓvCx² Ò (s›ÏÇ4i<1:Ìh·õ¶GJÄ›F‰f+ÙŠÚÑK«,ˆ-Ëîµé,€\ö¦ÎÖïµP1®éÚµkªT©4.k×®…{ƒêò™[íƒÀK"þUsUÍæ3eÊį,[¶ÌÅ«s”oÐaãÒq9€^C¤“%Ký0ë[QOæ…¶+µíuÊ%Ôsi+Çš9Kßzë­ÄÂ¥½®`ñd=… ¦H‘âùçŸ×cª‹Î…B¥ƒÖËe»wï–‘~ðàÁ¡C‡Z®$zc9&&ÆúžOVÞž5jb³Ü3|Íš5Ð ¢ùW“GÍ{ûí·¡v[·n•äÍ7ß´…“c^yÇeåÊ•òfˆ¶lÙòŸa„O›7o. -7ì‚ • 䉄Ã<877nœÁ $ëCímîÛ·/oªsøî¤I“¤AÔ’²eËZñÖ¿ýQø–ÎÕ ±•“jÕªUË—/öÙguÍO<1gÎñ[žÎKt+þ‰tàiî¼ÊN{”4C° ±·* N’6—Výe±hsÞÎ-qS]ÐÇRz÷ÝwsæÌÙºuksœ*±¹ªæ)¸7}I‰K èâ’"zÒ`s;yòämÛ¶•Ûó\^ba¯ 7ès.ƒtÍœ9SœóÅ_4%þs±PUh|ðÁ3fb+³<ýôÓºÕ¢E‹¸›rÙV¸³‡4þøñã‚ =KõêÕ…–`6§ñãǃo"Õ4†Ot§ÙØ©S§pg™?'Nœ@§¨6 /ø—7Ï;§|€¨-~TÛyÚ%K–(¿ëáÇ:Ä#ó&Wªîí„ x,ÕX.–W‡ßE ÁŠõuÞaþðBçÍ¥M¸úbúôéuêÔyøá‡Ó§O_«V-n¥ÞPª”‹R|ÜZÍÑšÐt­W¯ “Ê‘©®=y›gœ$=.íuz°º•OÆríÚ³ýkþÂmŸï==‘°\ZûG–á }‘X¸´\©JXá­©æ âAt¹C‡ P<†Ù&^“„¥ª=;ïÍ /DXð¤wl¿,ó\ojÓY¥º­ˆ }.+Fù6/^OE vûŒ'U–Λ M•-&¸3m ¶ª‹JË[Š»ÆNš·ëu±•8‰û\{÷îA‰+Å(zA.t³t¸óĉ‹+–={v4ã´iÓÔÉ<”*Â(îÑz8äÙÉY!\š{ò‹¼Ù°aCš$»ÆÕ ¿¸44¦¡m;EÑÿ™³«ÿY³æµãž:Ùš'OžºuëBÀzöìÙ¾}ûnݺ 6lðàÁ]»vý裰—™~àçìÙ³!]ŽKœz—¶|°^2c˜?¶víÚ/¿üò²eË,lÐâÁt‚¼uTC¢Ó ½…Hv¥ª[3TÊÖ‚~ÃåÄ@)W6b1{{öì — @® ¹)t±6énšÏô‚탨ªK\b¯•Û{0ðÿÆŠUÒ‘xM¾¨mSQtU¶õƒotéÒ…y~ß}÷½ôÒKÊ}í)o²hEqßÂ|`ì,`UwÀ,ºçž{0‚t0G££ÔÛ9äè$©riæ¿RßTªTI‰pxàlÙ²eÍš5sæÌÌÞtéÒ¥N`L™2¥·òóÃ3Ág” WáRúõþûï'.ö4ïÙŠìõR>:"»6@ÐaÓ§Oëéd¹¬^½Úë&U™W0PdLpj%´€P¨£-¤]ŽCo£”rU1èÒò*øâe³R–^ƒûLš4ÉšÊõGŽùŒ¥°TñPÌí£(;[;™â%ÌFeuLÏBæt$Ç8‰>U]` tß¾}2dÈ‘#GòäÉ!Ò¼ö6ÉRñ³^˜ÏÐéU«VÙ§^³EJAÒ¤pb驽š^Y°`#ž?~óD9IÚ\šiÏlWpl‚pi-ïDåÎü±²ÄäÌ™Sµ„R¤HÁäg `-Z H/[¶ì /¼™~hÕªíéÛ·¯‘Ä>²yóæ¥Q‘#FŒðRA@iûöí¢¯àçÒ¥Ke°èäÅøñã¡dPVƒ¥ƒ[._¾¼hÑ"@^˜Ï;°D”C¬`#¸!àâP xrg,#¾nÉBQ=ëÖ­SÙq´9 ƒF0m­æÌ™ÃÅjLuýúõ:ž=÷&£… œé/G®l#«'N´°FöÛo¿•¾`Bnݺ•ïÒNùL¸ŒÑŪŠ8jÔ(Y[<)?4yòdÔ šKÇy¬\¼{÷î!C†`nܸL†ŸÀ¾øâ ®¹CiEyu¾ §þüóÏUâYîhu~”'=pâ‹í¯ì𙝽öšÂMóäÉso1d.W®ÜðáÃU–TŽkÅNëåQ¿e•ˆ ^âž;wNŒy<¼bGYŒË—/ûí·Õ™ð½5kÖ‚ÁîvíÚe ¶xñbqWAÔ%K–`¿ˆýîß¿åÊ•`¦*r1÷Y¸p¡ÂB¬3È"Þªˆ Æß6mÚ¤‹¹È)µH xP‹Uw€ûÓà¹sçZö‰C‡­]»VÎòôÔÜŠÂöQ+|—/B$h6-a~êV< 0¨ 6ÐÌ"Œ ᨷZÂÉ £³V¬X¡A?qâ÷4w<ÀÏ<óŒÜÑ:™’;wî &(î‚VA$4hˆ­ÛE‡DfŸÂ|\uëÖ…] †4±½Ui4¦nß0ÉpiHì² ˜Uøg"…þ£_ÚöµÅˆxýÎ;ï¨B}ÇŽØ¿´?/ºwï>räÈtéÒ¥}ûö]»v6lìË&;.ýW%&&Æ ß¨ˆr~BùTÛZ#Àà… ÌÏ@‡[ÄE 6„Ï´_ómÿkß¾}Ê'Çæ¤TEc_íÇYM.®õ§,1º³™ÿ ®Ð‘v˜3ͰýAàH¬Und>å§½‚Rsð<ú…;«$îþëÀ‹@*®|Œú9(¨Žêyéʲð;vìà:û£<'6Ÿ¡“&M2ß3 ñèСƒŒ½ì[šAú!aÏq+ÐE àé“3f0Ü­[·ÖxY<|j9I\\Úà"»û‰'žÀŽžF˜Z`r¿~ýxÁÄÖ°}å.°„`·<ß’—ö h€´k×®råÊE‹­W¯ž€.ÜVÓ Š©Ò:‘á-hhAÞü^)Ðg‰8@-îiU]x‡²èdÓ ªÄ¡¢Å&ü¨LôV~äîª( 3ðÇí6ÛšÔ î¯Ð;n®<{bõ 8ñzEtHP-TÆEy³½“Ÿ[Yú\Š‚Uêׯ_«V-¦ 4*1b$V9jÞxã#GŽØ¡ÅˬY³ÐÅU«V•5¡ ;ƒîQv’¨¹4°¼$(Æ¥C"¾nÍif%DåÁ`eÕ¬Y3Y²dÍ›7׎˜ö’”OÚÚ SLi$û!éqiºY¢D å÷^L)­‡wØ#[ÈÁMG_F–¥b3fhçÐå¤ —ÙX BØÐal¸ÉiZÃÛpµ$dgMæÀkÅáÀ- “ª‡è}YFÔÕ9b×áæùæÍ›Ÿ{î9™-Å‹gZ¿% ëC¡ãú—1ݵkW®\¹ *¤d}`Æ€@‚Ƶ:I\ÚÓFžRËÜÿ¯{—¶Î5há'È9Ĥǥ•GÂþ¥åп˜˜˜7ß|SˆQ°`A…0Yó…K+V¬€>:ÃwyGFèyhçÒ¥K Q¯{öì1'/¶mÛfPÆÝ0‚`È¢mÀÂüùóÑqñâEþµ¸^åe:Äżæ[:/§…¨+òßݸq£¼%Úß„+*ÒXGŸä6¬Þ½{·v1˜$4hÚ»w¯æ __´h‘¼òxK§y“'O>xð ¹/6mÚdqàüĘ1c8À=u^Q¿A§Ë•+‡Ö+V¬XæÌ™[·n­„«6 ‘ÁCo x‡kÔ­•mÂ@Øö«á’d¸44ráÂ…Š_ ÄÆ£Þf̰ìY˽ÀìeA½ð 9rä8p wEI†¤Ç¥5ŠRÈ“'Oúôé±Ü½LÔ2B ¸«È0)Üš¿ Ÿ*c³ªõVéìÛo¿eà€D…>|ª æk¿viòÈ‘#(Ë'78xŒˆŠóC\ÉåëX·n’©ÝÐZ~HŠèVù]`\`Ëø•cÇŽñ¯¶u0Š›ó`ìêÕ«¹9·UA.T¤‘Ü–¯ð/×ÈÃ5âœÚTå‡Ö®]+ï½|A,;wò¾Duh?j±^½zùóç‡À¢ ¤jì<øM“ô&¬hgÖô‚Â)itú¡‡Ú¾}»RºDLŽK‡Ù‰ùòåKž<9ÄU„í¦"[X'ª¼Ì0açyÒãÒHe™ìœ8P³fÍtéÒµmÛV]’K9[ò<±3/†Þ"„B` Ó] ’’[)¤ë¸Fçk°U3”trÜ[š'öfÉQCˆ„qT0_÷ÑwÕ*þZî}yËuÈ”7ù–Ù æu±2!s[?!Vo\ea‰Ètb]á£ÕªUóVÍÐ ~ËÎÞQA§G¡èÄA›6m,•Ÿ}štN"Ã¥‘9sæ`¨z—Ìm£ÒGh(ÏÜcyÞ,W®œªä >ܪÞ+¬õŒvgþ >¯l׫kT­àþûïçYèäÛ_ËN’—V×'žxB¤N€n*L$&?Ö(äÄx” í?“’ú®åÒÚ<?•{?äS ¥@ºuë¦Ì:Kâõ£nذaÍš50gF[=ú»ï¾³…]»v­X±‚o>|xÙ²esçÎ]¼x1à¬AY¾|ù¦M›btàîÝ»UpJßö·mÛÆàªÏwîÜ Ó³;ÃñV¯^-Tg¬8ÀïJwëæü%¶Ì=ù!Õ×û÷ïO«äsøæ›o¸˜ føË/¿ä×™Q111ëׯ߱c/¸R±÷<²rk€]¼ÉSˆ] Bg̘ÁÃªÔ ï 6ÌH;]W¼xñlÙ²}þù禡DÝù:1Es§…Á5]ÃwìØQñ´ƒöªª9›æ$z¸4“söìÙ^.}›wV± MoE€íÛ·¿ï¾û@ȸ{”Ç`¥í—¾e£$TJOUiWòy iÙ²åÖ­[½C‡EecÜ)¯ü0ýúõÛ¾};HhwÖ!qà™3gÒT•ù¦I/faàÀ“'Oæ°š§æ_lEG(Woò£4lüøñC‡å‰ÄX˜Ã'NܳgÍæ» w¯^½ÐÓ§Oç×ùn“&M&L˜À;R|üU±-/µð¦ÚNpNkn"¯0vZÔÊ7‹*¼ýåì$‰qi;šÊßW^y¥pá¨øxC&’ŒVÍpå‚3ËÑqéíæÍ™Æ¿@ŠEÉ‚Z°Ê¦’>}úÒ¥Kó¢|ùòª¢3T9r°ÓÅ5kÖd8 £/½ôÿæÈ‘#wîÜ–.EŠZûY²dáœ9sÊ/š9sf4]öìÙÇŽK†*|œ7oÞüùóë»=ôÄÖ½dÉ}åÑG-T¨%Ož¦Z§Nèã#% å4’ ²fÍÚ¼ysk•söÈG™2eâ2þåµf‘2ñ>-Ï!ñN™2e Ü =Ѥ"EŠð»|…>áéŠ- °ÃŸóäÉóÈ#d ÊÃ?¬ú, 6”2 Ù(AËŠ¬–6‰Ìüá‡tòT ‘RjëZµja;˜ãůÊNî—†lÀ´Øµu›wö†Ýš)Êúmݺ5vqIö}.%ÉÖ²mœ)!À“Ó°Ä,w cÄ/[¶, :b¨W.£À+¾ C{ðÁù{ì19/€èR¥J-X°ž¬Ú‹¼ èåÊ•KwæzFÚ´iS¾U°`AîtëS ý©§ž‚fCn¹Z¨Þÿý¼àw›5k àþrC´­â_ ç´Ÿ|òIÞgùiXçMž~úéY³fíÛ·|–޹Œ×`2Zà믿Vuoin®jìà6WBÈ¡ßuëÖE…øÜ™Æóhî߸qc¯›Ú @é/%¬»ý@©ÿ¸xC²¿Ú²êС­åY¾øâ ÌtŽKÇÛ¢Â`ìÞ½»÷ØŸœ~ÿ¯Ú^ k™ùïMy—sém#Å]°l¡vrZ*å…*<ŒJ™¢ƒÞzßX4Ìz ¿´·oß..-ÖªˆM0Š—/_fDÀpñaƒ}ð¯3yhƒ2ÿxì0›4iÂ|ˆ‰‰1r.žÏ_Ú–Í.úm¢º$´GÁ~:Óª_?ÁsÝAÅdÑ‹#0dƒðÊ-#¤†ñ÷üùóÜœîB‰è+|ªzX€öÈ‘#yjsGoÚ´)¤ÿP±œ· /´¨˜U«V¡ª0U°^±STy-Â5œÜi.ýå—_N™2Å*uÞþøjºJ×Ûá‚… Ú®¢Ízqmß(?LH˜–ãÒ·ïQ~!†^úÆox3Û¼UªT‘ E”Ã0P®û@†A0K%è†îß¿ÿ—_~©ZµªxÎ_вzõ꺹ŽI ¢[쀡¢bâžµ a¹*û÷x;§ª“ûZhÊFKoËFø«ÉÉ]Â¥8 ýAU©Ö ñp58dÚ¬æ-±ý,Ý`zŸ>}úèÑ£:òิüH:*hïÐQ¯ z9~üøE‹¡ˆA3˾}û´¢¹»~Ĉ(PˆâÌ™3¤a!pô•xõ† b!ª‚ŸƒÅHYÜ»Nù 6LIMÕ²q¬ÂÄq•²àW{vGŽÔ{#ýÀFMô¾ "X슡Ÿ8qcŸi£àp;µ’'Då ô\Šš³É tÕ=u¨\_Añ©æpÄvºµ$•iVïhV}¢$ÒMm:%ÆZ(µ<¶ J+j8.Íc0À%Hw’¸²s¾)Â.´á¢Úâ¶YéMä²3®¢ ·Ÿ©ØIB‰òœkûÃÊs(¸täÈ‘cÇŽ5꘰‰pý•‹/îÙ³ç•W^áOœ8!gf2cy¡˜“Ï?ÿ¼`Á‚¦›X«W¯>yò¤¦®NºNÅlœaËÚÖÜ·o_Æ BÙ«W/«9þóÏ?ÇÝîüßXqÝè»Ü4lÃ4i—.]Š/>mÚ´hn¿$d:YŒtºgÏžU«V]¼x±æÞM¹tªT©Z¶liÇ\Æ'‰Bhn9C3˜ö:"ôá‡Ê ­$„f¸™æ¹Åº(ìV5©]ßFƒ(I:TQpû÷ï·I“&é2F3ñ3Ñdþª*úÁƒ+Uª”&Mš¶mÛj3TÑVˆxµ¸4 ýì³ÏN˜0aĈÝ»w÷ÝwéC~f5üÄÅx8IV+:Q l˜l¢˜@0þVe¼Ô:±‡x%ñFà3ˆ˜û¬E‹Vû¸V±xI¢6‚h¼77õêÕ««T©rï½÷öêÕ+$$Iùç¡ôIš4iš5kÚC'Ο?¿oß>£\Æ„Wù*7‹œD³„ËÊn;,Ú” Ç\Fþ•WJ¾\%R@ÉB›Qį½öZŠ)zöìÉe¼…5ˆAQ‹'ô"³"ŸùtãÆ+VDõ †.ÆÃIÒl(»¨S—7­Ä¡2áxç3ÿ²´5ù•—‰¿à6Ä#nÍ×ÃQâñ0P‚"*EäÒ¥K—/_î¬Ä{܃Æ{gééÓ§[µj•>}zÙB˜t*–k¸’YÝ¡C‡ 2tíÚU³4±•Á#jù8qbR·n݂ʋۿׯ_?xð üùÈ‘#–y@Α#Gü1îì¡“Ä+pifþÎ;X¾|yÖlÛ¶mÏŸ?ÏGcÆŒQr¼”)SêÌÚßÿþ÷Q£F©ìoÓ¦M…Õ@4tÚ‹²¬]ßú+¨Hó6ÛéQå^µjÕêÕ«C#‰ñûôéÓ©S§6mÚÌœ9SûË/¿`)¤M›¶]»v*"ð¯ý ¸–_Zßâzåkõ•Þ¬:~è=MàÄItZÊ‹/®P¡B–,Y˜Õf8«Ü9Ò¤Iql@~áÂ…¼S±bŹsç‚Ø\Æ$w›‰Ñ ÿþ÷¿CRˆK”¡èã?¾ÿþûG­7£6¿ª6/_¾h­\¹rÞ¼y±àlN~ôÑGL¿æÍ›â—v9ñœ$:Áàõ&CÃ"fµÖ¨QXîÖ­›6¸¿ÿþû äÊ•+UªTõë×ß¶m›.ž:u*¬¬H‘"8sæÌ?üàÝâá…Û÷]°q`ƒ9oeiصk×®[·.ıXž Œ… ¨8µŠ”)Sp÷îÝ`fƒ9sæð~Ïž=åßàÁm6&`í'N¢A~þùç²e˦L™òÍ7ßT2%á¶VúüùóíÊ^½zñN‰%”pI´¥èº1:%á­:}úô‚ Zµj¥¢ØÈçŸnÑÝXòÔé_H²w›êéׯ_Ò¨!îä.æ³Âí,è®ZµjÀòSO=¥a&[¶lÑ Ü#F‚‘x vçÎÓ¤IóØc9ÿs"«Õ‚½d|…Ì–4/:Å{P9¾ÎŸ?aà}ˆf ïÞ½{aѵ ŽK;I2‚ÁX¡Bõã?n±L7nÔJWRb&?3ÿ…^P)[ÚŽK'¬(Þ[2ëø6 Í ¹ !ÏÌœ9s³fÍ Ò;¢â¼nÓ¦ãÒN¯ÈeÇ|fÎÿðà íý÷ß_¶lYY‹XŽ{öìɘ1#tzäÈ‘ö­·ß~›iÿÌ3Ï$Ò3kw9—îÓ§È&§Œ”ÑòzÙÿŒÑé¸»ÒæWïÚµ«Aƒ0j«ç¨Ü§ŽK;I’tK¹.y佃 ¹yóæäA™1c†±W^y…Ë^ýõ .¨ž‹;Õâ¸tâ³v™T†ÆÊõ‡¹üÎ;v1aÂE–*h?»'Ánܸ±ãÒN¯hÚ‹¥üøã­[·öÂ2ŒzûöíiÓ¦åM`Y¼‹÷ëׯ¯#áQgëä¦\ºmÛ¶:t#WmQ3i9W5Q-0ÏBŒøÈÂ<€å9sæÄÄÄØe «v1N’˜ˆfôêÕ+}úô÷ÝwŸ&üÁƒ×®]›!(VÞ”5^¶lY.cÚ_ºté‡~`É߸qÃxq\:ADy9T1kΊÌ"L6Ú|íÚµõë×+9¶ª' ±yÁw!"ŽK;I\\>}:ó9GŽrTbc®Y³Æâ¥-K|¡B…x§sçή#—†HwéÒŲ+V‰¢ö™Bì„Ãj°©˰¤Ë®^½êÝÈV@ˆò¥;.í$‰q­Í›7+ñÔ©S/^¼xîÜ9ÞQ¼ô_|Á5§N‚Æ0ç_yå%ðÑb¹råŠsM;.€úEÁ^Äöz<¼>y°ÁQÞ¿|ùò[o½å¸´“DͯD¨d$ÆÄÄ<ñÄLé‰'ž={‚ ,[è&',eÕªUª¿¼gÏ׉‘K÷îÝ{èСzSfTb±ûhí?þñ¦«`æÀ¼Ÿ8qâúõë\7/´ù@—v’ôäÒ¥K3gÎL•*U… Àí@Ð5­•>zôèk׮͛7¯OŸ>ü;hÐ oT\Ú%ñp\:¡ÀYµÞS(Gµ àÌÞ­C®—ý¾páB:u—v’xÅ⥵B™ä_ýµN…¼?þøã‘#GR§NÍZþöÛo!-£FªT©€ÞÞ ï$qéaÆióWüïß”ãÒN’Þ¢Öúe-¯ZµêùçŸÿ[¬ÜsÏ=)R¤È!ˆ=mÚ4Ãj… ?¬Š“‡W‘$Þájµ8.í$) ŒzÊ”)Ï=÷\ÆŒË àïý÷ß_£F &Ä-;«™Ï-S™“¨åÒ}úô²ì}¹vnrâ$q‰öǽ züÓO?­X±¢hÑ¢©R¥²xioÒK®ùñÇu½…í9qx帴' ˸AO5Sž1c†ÊMœ8è„­’Q P}áÂ…@°ØÇÕ«W£<„YÇ¥—v’dD©i¼a0k×®M™2%K–,ªÈ¬”ì:3®SÆEŠ©\¹²¨¸óK;¼r\Ú‰“;!¿üò äJGÒ.^¼8vìØGy„IÞ±cÇßÿ…|ãÆ ÞS›æÎ»iÓ¦?îò]û׉ãÒN79qr§É‰÷ß¹sç¦K—Ž•>jÔ(}zêÔ)U¦CíªU«ï 9þ¼ë@‡WŽK;q’à\Úûï‚ Ä¥çÍ›ˆÍ¬.Z-Z´zõê*0wåÊ•'N™Ïž=ëzÒqi§›œ8¹sð^¼x°µücÿú׿Î;פI“T©R©2Ë¡C‡¼_¹zõêÃ?l•mÛ´ic¯8¼r\Ú‰“„;lV‘ëÖ­[¾|ù˜ä 4¸víš—KsåÏÁøçáÇ—,YRìK‡óäÉÓªU+/Ù.W®\íÚµ!ÏóçÏ/]ºôÆ]t‡ãÒN79q1–xç0hlnjãÛö:Íä¯Q£FïÞ½+V¬xðàAׯ—vâ$ÁET™kY"-é}úôiK½þã?B¶ ,8}úôjÕª?~ܾë\ÓŽK;ÝäÄIļ^ñri>nÅKó/D:oÞ¼÷Ýwß‹/¾èzÏá•ãÒNœÜ ùõ×_™çð+KãÏk­ß7n·ÏŸ?Ï;—/_.[¶lÅŠY­Zµ ÉÎäzÒqi§›œ8‰Ñ2/S¦LöìÙ[¶lùàƒŽ7Îu‹Ã+Ç¥8‰˜hJ+}´yB”tzÔ¨Qùóç_²dI ¶Æ\b)¥ç¸´ãÒŽK;¹«ä¡‡ªT©ÒåË—7n\¾|y×!¯—vâ$’óßV·¨³=UªTÕªUÛ´iS÷îÝkÖ¬øclžÇ¥nrâ$JDÛ…yòäyæ™gx±gϞ… 0ÀõŒÃ+Ç¥8‰¤ˆ*+š•^¬X±’%K²(Μ9DwìØñÇ ɪçÄqi§›œ8ñ]~ÿý÷ß~û­`Á‚Õ«W—o¤ÿþ2dp=ãðÊqi'N"Ï¥E½@æ ¨V Ò¢E‹Çœ™ýúu—ÍÃqi§›œ8‰f9yòdÀÕpx帴'gÑ,go ¦ùóçbÝÔ<~üxÀŽkÇÛÏôXtri¯ÆÈš.öѱ©ÈغF•ØQ_ZË¿(k‹[IÙÑÉëèdÑ&´Ó»üŠZtSNõËM;y_5þøôz5±si¦½ŒDz#&&æÈ‘#¬PQèDÁ¥½JÄ(„6o8abXÔi¾WÊÓ¼Å$7Ó’¿gΜa2Èr÷¾%‚ñËúæäÀòxDƒH—±(˜rD^Ÿ={Vf¦*¡G—ö.UÀç6}8Oúhfx’¬{ÈÀ1¦@nÊ¡t¤ÂìýÄ¢›N:eÔËw¶ø£ëî:þ<ÀN0µðôéÓÑÐãÌÚ"Ñ;ôÍ3Ÿ ­’Õ‡ Vƒ/_¾µÜŒ¿/^¼víZô´ŠNc…3Œòþýû÷íÛ§1ò€3èAs(Ý=\šy…qý%..mºƒQ^¼x1O…9¯ÔW_}õÕ’%K¢Aehò£”•n—EÁø®\¹rÁ‚,8¶,HŒ†=qï„ fÏžíã&æ¤óæÍ‹’µ²¢Á;w>üðáâÐY…oùÛNx”lN:8p€¦ÞÂúåq¸kʬ?î“$¹4CöÃ?@Ì ÄzüX¶¨0㥉E7=zëÖ­Þ”Ñà÷ îçŸ7nÜ!C¼l?JD>@Ô÷¤I“L›ø¨VlÍãÁ ܽ{÷_|ݲÁõ}ªm¶5mÚ´C‡EçJ§…cÆŒ™2eŠÂ·P‚¾ÏC2”Oê±cÇŽ1»‹M#â[Ð,I ÆÃFòúõë^‚ý\š¢V4pgΜyõÕW§OŸ=îA/™a>ûì³Õ«WÇÌRâ†.øe›Ó6ÚÃL„Y³fÕ®]ûâÅ‹ê«W¯úhƒ„ ëL®R¥Êš5kSójê2mO–ê… Ξ=K«òæÍK#C‚Rþüór+¦±×–,Y²$Æ¥i¹"Q4!OjãÙm§5é¦ *0FGå‰h¿ï{%²æX2ü=}ú4Í+Q¢³4 çº&S£F 5ÃÇøFµÁkÏ‚ÞË–-{òÉ'¡ÓŠ'ô=ÀCž!-¡…U«VíÛ·oîe K–,ùÔSOÑN…%{cY}¤‹Â:­^½z/¼ð‚—´‰Fÿlº¤wö@7—†½Hùb]æÌ™sÀ€¾£q\цHêÔ©3eÊôÃ?øKP½­Ò~–mÆ Ñ¨fµ–Œ\4þri­M¸´ÜŒ:uŠN.=|øðܹsŸ:uÊPÚG.â¾ÀLîСC† ¦L™Â@[<ªÆ×__ÇÏ?ÿL“˜ŠªQxk†ðÝÀ¥¬«‡NcâéZˆïˆ÷‹nJž<ù;ï¼³uëVZ¨c;þÒ-ñ”Qüý÷ß§L™’Yä;‡¹©œ8q¢Q£FiÓ¦Õ¸qã+ÝÇù© f³ôøñã“&M¢÷ÚµkwæÌ)l™É5>b£b…Ò´æÕ¬Y3ÔñM±QZïìÙ³°S %Ç×륱³®… J—.Îo pn9.4ÉpiFŠI€0jvÌ6QÄxˆ‚ñ*©R¥5jT†ÔjJ Ü³gÏnî{«˜ö ©ÕL®V­ŠƒË›B›öQ üÌ=š×¥K—è\AS§NÅP²Ø6ß\3åÌÙ7oÞœìÛ·/\…q׉*-mÏ+yZP‚öíÛßšƒènˆñð*)žnÿþýÓ¦Mãé°.G½eËvЧ– #úuc—>xð x,¬Õ_b£sÄrÈ 5‹¢sJмúõëÓ< +pmÚЖÅâµ StðàÁ4¯sçΚèZÈLöqï˜^8Ói(;šW±bŨeeš~¦£}çüj‰Öê¾k„é7cÆ %tßž={¬mŒï­í,Y²„É\½zõaÆùÍÍ1fª[*“N:¡qzõê%j:sæ °«ùîûï¿ß}÷Ú ¬P¡BåÊ•ßyç¾þÉ'Ÿ|ö¥U«V| ›åÞ A[½ýöÛƒ4hP¿~ýzöì‰öoß¾}ëÖ­¹òó0òî»ïÖ¨Qã‘GÉ’%KŠ)hЇ9Ð=Œ >œe3¦eË–¼3aÂ~E —;wîÌÊ⣦M›Ò¶¾}ûÆ}‹£zéÑ£G»ví6lX7(¼à_Þ¬X±"<­‘+W.õ-oÓ¦ ÏØ±cGzƒßâ&ÒK/½„™Ü?ŒÔ®]ûÙgŸ-S¦L‰%Ê•+÷òË/Ó94ž;-ZÔâSTj£Fè7†&Ü}ø¨k×®êdžˆûpOnB7>øàƒ>úè3Ï<Ããз4æ¹çžëFh<_çIk…üË›©ÂàÀ21bÄСCi6=O1î4»|ùòEй?(¼à_ޤŋgL5'_€…g‡öcÒ`þÍž=;€“>}ú´iÓ& #áÚ“ÌI’–äÉ“3±)d2€ÏXŽQîë€ÓH¯J[HÂme†ŠÜsÏ=+V¬00÷n¶ÂjD¹Áü±cDz¨õi¶lÙè{¢LÔ¶¬Y³ /ôŽ_íFœ <ôÐC÷Þ{¯ÚD[¿ÑοŠjT9}ì7yPsäÈ“md%éÒ¥®ßÌ™3û;¾(: ÎÀ[óx'ÚÆWú¦øbÉêð«=ð« 2Ьxäo.àM>e|µYöWï/®¾I;pà@tâ³N™…XßÊáS:¼v:ˆ™ ‹ÆÖ°<6³g϶’:uj½€Ãð7E ×o`ÓC舄–0^,I>òŽT8]Éšå+†xÞ‘·ã €ûð,ð+ïe4ÌPË;±‘äa„Æk"y¯äMúÓû˜ô^¾|ù{ì1Ú¦ã~÷oBBîOGPŠÍðþ·…dòáîÃCq ‹‚k@¿6ëÎ<;Ý•4>\rW†|‘7ÃÍz’æqgzÛ¦ ŒoÙ8ò‚yuöÀxÇ—öðÂÜŠ›Äm|\ מ¿9IÒ‚]¹hÑ"óvZ2Àh”šSˆVqCU—tÁ¢1~=ªkøHÏ«4§OŸÖÑ9dëÖ­à¬JFK5Ú8CÉ’%1YÔrÔ˜âö‘‚N¢4 ÒPÃd¢ÐAoz-ZU‚–ñ‘ûïôš|6ª†BÑÐNàÚ ¹~µ3CPX ´0gΜP8H5<0 ÇÍK×Ñ<ÚIƒE!|lCÌŠÈ­V£ú4U½zËã+ Ä}ªT©2zôèS§NEg-‰7nèlŽ×c/gµJØØ–úæÍ›y¢Ê•+ƒÆæôÐn5ƒÒûƒ¢í›EA™>}úú02)ŒÌ™3gîܹóæÍ[°`Á×_ÍM–…_߸qãºuëV¯^Íýy‡O.\¸3Œ@øwìØÁ­†Ú³gÏÏ>ûlÈ!cÆŒù6ŒüôÓO£FBñh'NÜ´iÏE?ŒJRBºëÚµk?üðƒ,úŠ^¢~þùg”Z<ûS(>U&=^˜‹IuT¹ ?²5 _Q‹ø÷G°k¸F(nÙÃÆ£Ñ0Ûìæÿ¢ˆé”Ñi˜r#üFtj[!pÊ©\îñlÁ{'!7ç)âß·âz®¡ç¥,©¥Ñ¡C|Ï–ì$Ú$IÔ³‚¥Ä*p”“Íž…U 8¦ýüùóûôéƒ"{íµ×tA†\¿~‹õNš¬n•Ãc¾…Òá:œ«únª•…5 BpUÁK>Úf¸¨„ãë{ö9 IeÖÑ%¸A•§Z-V—ÇÇxZ:ôž-õÆ<(ìáÿõÈ­Á(„é}Å(F•(Ϩ °¼mÛ6Ø,œÓ< Ù±cÇ`­yóæ-S¦ tWgrõ©éÅå9xë þaDYÇYñ( 2"ÿF¼`¢Š– ‚'Æãâ•èn¸ç27‘ÎþüÇh*˜Ëe"¢ñÃÑŸUîÉÜŽgÝ¡^µãBJÃÍðpÙî³~ãa/¶í¸«"¤Þвk4ʲtBúÙÌÅ~+ Øÿ†‘x易$,Þn0•ˆÎ³h‰]¹råÌ™3µjÕzõÕWË–-{îÜ9oDåSO=‹nݺõÎ;½F½÷&Ö w‰*aÙb#‹KKxíc^SÙæ†—/_ŽB¢eôU®0iIÕëñqï[ÍÂ{I éC¬Î”ùk+™¶¢IJÕ…µx ÒÊÆ G½\W\ÅÑt\šýW9ª¦ùǼnÞh“«W¯®]»¶W¯^•*UÒ¾ù‚ Ž?Ψ½ôÒKò±¿ð Ê0ðœ.dúÉ©ƒB|÷hÌMåßaDÄ>nÏkeU ù?o*º€öŠÂÈÿ #OeŠ›®èGëM?Gt¹itz鵺ö!A8áž—êbuR®rk˜—vre¸ûð£qk‡¼£»Iâу!ö‚ìˆpýcrŒȳx99ÿþÕ3¤¢å7•píù¿N’´x'˜9üMWxË~é|ùò ´çÌ™sàÀï¾û®qãÆiÓ¦-X°à¤I“ |ÆYÝ`‚r†”çÖIí¨’À1¥à{{¼þ"Û;CÀYÀ ýæVS%¦ý¥Å|‘p|/ÚÆ7œÅmãÎ=u;÷qƒD•\ºt t•I(§šEçåOœ8ñÈ#Ñ… Z¹r¥\𯋬˜X ·„'`²(ŠÔøýÆq÷õŒFŠV‰Øyó²n]pS1£Bì88˜Š…/›¢êЏÎÉ›r°†Å£»å/ÕÅ!! 6OÌÅýWý¥Ùþ²5þñ˜í Î4ÿ¶~ýϸjE¤Íþå…<½ÚßüïðrS“9œÔoéÙEõm¦…@‡ ‡p6×_í·xpÕIh@ ðvi‘FažŸåãENaµ¡cbbä”fa¶oß>cÆŒO<ñÄðáÕëÆüæÒ‘ßCwÓ¢ö‘ă2Äë¾ð‘30Iè@¹qdÔ«k´qiþ^ Š©’[à0 (¦ïÄ…h•B;ÐPÊ}mîUñÚs%(4ÉK$¢p|ˆ‹Š_âSѯöÐoŒ‡ØšéPý« nùWïo!ÇæZŒÎxi5Ò¦±<¢ 6lDºD‰rkèÓƒêJÛÞb*’V³N|[q¶ñÇiÜT̃* 5à4B¨2I7•ï¿ÿþÂ… VÔÀ$÷“f±*iü4z*î†pi½öRÐxžK×Û3›Âž:œ‰a×ß‚Eæ5üm£íÖR‹{0ÖÊ¿Ÿ\Õ^âúÛã±­øT{‘¬8%@öž´ŠkœÚÐx¯ÑZöôŸÿU[ÏIÒ(¨f…à%jãB°ÚkfJŸ*‹—·Múôé«W¯¾e˯ƒ"ž$–ÑPq)\ B\ ⯕>2O¯Pâï7&†,””s³šLË[¨Å#Æbt]IòåCˆN1¿«È½ñÕW_éÜe×®]§OŸÞ·oß=zŒ3F'ÁmcTp§íQíãK1±ãÁ½_È·=ÊøÄp°ãnýÉ¿¤^娗™îë!ú–Å":øa7”ßC±d´‡¶1]/_¾ŽûÉ,§1ΊÑeŠ0¹©qƒÂωÓÒE>Ë´dXÿLÒƒAùÉ#zçÏì\+RHX¡ðòxDï¨O.]ºDS•éKQUö»Ø£¯;öè$d±‡¼Ã”ŽÎzÐÿQl1ž9s¦OŸ>%K– IZR¶lYeÉD‚eGXÝ:+­#*ÞB$0Gx¥õk¸ *þÆåüùóÚêòQ‡jã<\[:Yc5Ú Œç·ƒEò-Èb¢»ä”0?°²UD˺ˆ}Z 'Gk}Ô¿Þ€œ¸ƒˆÍl`%‘ ƒWB•¸Ns$šûHq8‘¤ñ¼>vìX”þŽ€ FÍW \÷v#¤KiÉ믿þºvíÚ9sæ¬W¯í.ó]X°°Z•5kÖ²eË6lØpùòåq=!‘ãÉöbÕªU~øáîÝ»5{µE«"ã!çn¼rîܹ>}ú4hÐÝÇô°Mé„7ÿÿÎ;iX³f͆>räÈ3f°ºY×&ðöEÁÆ6—)÷Ê3nܸmÛ¶y³þnß¾<,_¾|óæÍ7nܱ yýQ¨¹yŠPp{÷îUø¥rÄ>|ö•9sæÂ… 7mÚ%¨¹§xÎÃã„ zôèA›ižmx©«Ç_¡Bo~λD,±¶e9¾éá¸I“&½øâ‹*ôµmÛV>%zÏß UH©X Ã÷·¿ý-oÞ¼ŠTA [ JżéL„\šF}>ú(ËáóÏ?÷wÜC–ÞÖ­[7n\¦L™dÉ’¥H‘¢wïÞÑ ÔÌ­ÁP¾òÊ+*›Ë$d|Q¬V‹ÛÄV‹‹L׃¾üòËLŘ˜Ö/:hÐ ùÕ-?¿[`6l¨\¹²&á'Ÿ|âo@‘:D¯™ÿÅŠ£m‡ (ðØc¡éè7ù|l§T×_~‰Â…ªÓ@BL’åË—«¼²m¼F²©àX÷îÝË•+'Ož<[ 䨱co¾ùf•*UÐt`‡ø],¸Ó¶c– zdæÌ™/½ô’LË>}úè}ÿ.\xÓ¦M´äÛo¿Í•+áaECMž<™UðÐC¥L™`A {+M ;Pgj¼Å¨ø¾æ¯x§7H"m–šâ%X¨9Œ”/kÜ!éÉçŸÞÇZ¬S†X °4iÒS æý;v@ha¯^½h¡¿yàÒ: Ú`îÁð5'MšdTß’;EÀ{ y iÁ$)_¾<„pÞ¼yt&€ƒ­£8Qè( JÓoXôP‹Ñ£G§Nò±Ê}!:þsúôiúJçvk×®­£ ?øà€hÖ¬YŒ)zó„É ó‰pîß¿¿uëÖ˜–4oÀ€Z­çÏŸúé§ã4oõêÕ‚M,ëöÈô*¨òÑG©1ˆ‚É­¦*«¸L™2ú¨qãÆw>[Ñjå~4"mõšyݳgO:‡U M×¥J•êÞ{ïUÞ™3g|¬k©é‡!Y±bÅÍ›7ëO?ý”·jÕJ±úÚ#ÓÖ’í„bišeÍš•UðAE^Àçƒ*¶­mÛ¶´êÅ_|à-è FVÁ½XëÑPÄsÆŒ÷ß­Zµ4QjȪœuÖ‘ôÉÐ9cÆŒ$cÄÉ/­÷œ9sæ Ø1×dÉ’EÔ:þBŸ ëÃ\¹r%d6nÜ8õ«[©ÿþßÿ=C ÃGeÐþHŽ&=€žEm±NY÷Üsχ~hþ2!ÒpFgz]7w3—Žg—~ó¦ë„¯B`X#PS©9ÞAA*TÈGÌ¡‘–þdÆÌ|ýõ×çÎ+jª ÌdßûYY|ÁF +¶ÏMŸ>=K]c¬t ý!)ïÐË,Þ;w‚<•+WÖö+,‘¬zÍ%?WkQ%Å‹7lÙµk׃>ˆu/s þüíô œ†"®^½: ëÔ©“>âÍ´iÓ¢e­Ãüßxã .4hPdbQ8©6¨>f¯\»;w–V=üðÃLB™r¬ wß}ÜîÖ­›V™ødX}‹-øuš—!C-m3ñÑÇŒ ‚ÆÉ‘#Á݆ÏV*Å›Q9Äu1ÐÄ3¸ÆTgîabOnúÕ~©×5kÖ|õÕWÚžr劌ô‘#GêUo D$¶-œ°@`ûÏ<ó ä¶uéÒÅ÷Täê Tm»ví´üöÛoó¢yóæZ˜\€Êó·HÜÖ­[åâ¼ |A˜Ò¥K'K–lÑ¢EØdzæ,Š€^“ëOÿ.Y²D–¸Ež÷èÑbã-á ,ý™0.€ò¨OxʃðW¨PaÏž=´SìôÒ¥K:x§ƒóriZEóbbbXS§N…‹Ž5Jmß¾ñUà%c .õìÙ3UªT­ZµŠÀø^¾|™…`[À 7$9K–,¢ú¶™ns|íµ× .‘=bŽHBºtéš4i¢wŽ;±Ö¢hOöìÙaø`1Ÿ“&M‚Hß{ï½Þ£wÔvóºO±ûùóçÇZ—‰qàÀ5jÐh7®×ˆŸúè#s8´oß^Çþ¶Ö{®f£MvìØQ§Nh!Ô…±VŠ{ý¬Y:pÛ¶mtf&ž€M7nÜ8/³²³ŸàöRÍ6ÿ\¸JæÌ™i!Æý„ɬ\¹ÒÇ‘EÏZµ>ù –.] ­Ò —¼yóBøµAvkõÈЂI“#.Z´(cÆŒâÒJõ €ÓŸ‘ úå1Š•Ì\I¹çÌ™Cwõë×Ï’àièå!)0sïÞ½ú:::بC*&˰j7Vx¾bÅŠ2eÊ´iÓ& Ú„x?BʹÞU>Ű: ¹aŸÒi¼CwEIk¥”1ÌsåÊ…ÅôÆoØRUò·'NDƨzO^¸víZ€Ʋ`Áæ°¬eë#ž@Õ!ôϰaà÷åÊ•S~ø'Ÿ|’ÖB´4 üõK+ØÜ¹sÅ¢§M›vèС’%K}^{$bÑtš’3Û(Ëôž]ÀbIž<¹áJøLš4i`ÔæUˆî©3°Y³fô\ 6ûè·uëV™œ¬—3fønf"AZ«s‘Ó‡z¨hÑ¢[¶l‰òJ…þJ¸½lº±[·nVŽ æ ‚\>ºk±§#õTÚ@«ôZµjYž2/ùëj@‰äÈ‘c̘1¼ž2eJ²dÉ>þøãeË–éŨŒTd¬Åaš=>aÂúíñÇWþÒÑ£G+V »ÞG{Ó©J‡Lœ8Q1ð³fÍZ½zµ0Ýg‡ ýºˆeʱ:4Ù ‚´ ¨Æ3²“'O[·n—/4@5nT´…B×¥L™R)ŒžØ¶îÝ»—(Q:Ñ¥K¬NouÔÈŒ»-aÙGö¾ÎÓ)ø\‡Â ´}ûvóp*O{tÖŒ»”¦á‚ ¾óÎ;ØÃ°,[º–¨äc*ÐŒ&]¿~}áÂ…XC àM å|èÑæÈW~ÅzCêã±|ùò4 eÑ´iÓÂ… koëïø¢P`4¯P¡BÐ?½Ïf-4lØP®¡hpÒ$Ͳ‹ˆ€tÚ’`µ†œ™½s"Òˆiï†ûôéCcX,B]´-pç53«U«†";v¬½±¸_ø|ÇŽS¤H¡³‡ò*`Zbc.U©RåÛo¿•KÄ_.*U*–*­e0Ðt ÄÊù¡‘a¬bsD­„;c¥3#Z¿/^|ñÅygÕªU~µ”V\„â|E‹Ñ*q‹-¼¹|Œ§Ó¦MKw)R$C† J”Á’A¹Xk 6Y0‡R}½E™?>M‚\ ÷è=šZ¡BccÔ#‹õ¡—/_þÅ_Ð¥h“²eËÒNÖËóÏ?¿bŠǙ㜛æþJ:5«Xg‡™¨PÁ2 Åý*Ô‡æ}óÍ7¯¾ú*MZ¸p¡íe£M|w^]¾|‹¸`Á‚Ì=V.-¤'EÞ~ûm¸d#•$Y'Ô´Û-Ù´i“0PÎÉqãÆ‰ úØo¢p'™ x衇š7oÎlTÍk€ˆI(¥ããv?ý ÈÐ]õêÕ“²¦ÍUªT¡m6ijÆŒ#–¬ Ä65&&ã—æåË—Okáüùó¬_cø2î"6õ»ü¨%ö_ºt©ö¿˜K7.R¤f¯¿ÉO¼³zË–-4 $ùä“O 1(ŽôéÓkÃK™£ á„10aBŽ90ßæÏŸî1Ü… êÕ«3P.bщÈÔMð¾`¦õèÑ#W®\F³!JôÞ{ï¡àªU«Æk諾¥A·$owÔGD{àQ­Zµb@é1Õ3e-?öØciÓ¦µ|JJÓç×à®^½Z 6exBcCnxñMÕÚ‰p‘¯D$ájRÔªUKÉ© °,ø‹/¾è-Cy¿¥ÕÌ:xð ²w§˜…ƒR¶8MË…ˆ-âÜ»wo ‘m(ø”¹ ÂGÀdJÖÜV€¶9Ô%sæÌ_}õÕáÇkÔ¨Q¸páÈ8Qɬ6ø§‚—,Y—f|Aé}ûömÞ¼™×Ø&!'_tßgŸ}°X¼“<Õ™2ezî¹ç6lØPµjUšúä“OFÌÏ@ox÷b&Ož,Ç ¹³kí’¨Ú¸RFüÕáÀV|X†$«žXÆ{Áµ|n:LììÞ½Û›§Lqw-JC¢Îœ9b1µŠ/®¬|ðÁ‰'ÌÉàãÙCFgÕªU>úè=÷܃AÄË,bQôíÛ×òCªRUdl"9 ”LUï@ÿ¤é˜{­[·.V¬˜–‰±1Ú£¤ Z˜à’!CÌó¢E‹b.Y]x©4’>ÊöíÛ_}õUš—3gN…f}úé§ëׯ·Ò¾ø:øQXߘ1c (O-lÔ\‹- Ø%J”À¾ƒÆlÛ¶M\¢Ã#ПŒšj’:ô™gžAw0 ¡ÓÝ»wÇ–¿ÝA—¢Ž•Ýȯ‘X˜ot‹’Œy?M—.í¼øk{F³„«•ÌG/¼ðBÆŒ ,ȈשSÇŠuúè×’>…þ5oÞ$´êZŠÞïׯ”ŒÇ‰äÝ9wîœí"±ÀáÆ £y_ýuˆrŒŒ*pcLU¡Û®"ç9mK“& 8±PÆ› ëT!ŽÆ&L˜ ³-´èF;·k×Î,>¿Ú‰™ùå—_¾òÊ+K—.õ²Ù^½zU«V ¶h×­[ý‚Å™v²(tS* »Ð0`Ë­qàÀEž#¥J•Ò‹ Ðà˜˜'2Äå7¦…ØãØéÏ?ÿ„k­]»Ör¿£ši³4F#È2¤y4lÈ!ýû÷åvíÚežHFW]QZŒ7nÐe_äµ4Òl s:sôèѧOŸ‹`ÕX²ßÈèß@0“°e¥Ù‚å±cÇBõáØ¬—2­v³/²aÃó§I)ÐK4•N†P±Rd+ùŽ3ÑŒÕ^ñFd¡ì¦NÚµk×(qéëh•xתU«X¬¬QV Ô‹!ÕãcÈ4ÖM£˜K«W¯¥éU¯'jZ¯^=–Lä›ÄiãF<¡oß¾Þ†ÑÀxÇŽ!`ô$ÆvŠ‚lågˆ@8ŠBü̬[¸paÈXËŠg”Ïž=Ëû^ºE #–÷&ÚÄÊÔ¼ÐE75¢¡°ïÉ“'AËŠøc‰4U‰ŠX„›Ì4¥Ž1èSRbúe¢XßÏ×@¤•¸Ã [šd¬Æ”//|l*ÍfcŠúÐ([È1)GVÄx j”¡´ãÉŒ©ùÐd¹Ë±Í›„ ŒÚElÃçuƒÓòXÒHsø«×Ô3¯J)1ÜXô']dÀøÒÈ»¼PKˆ¬K-@¸´%Åë4`NÊcé¯^£ B9y6˜ÿtWˆýèo*Ù›Zµè¦_Ä<çt”L¤>,`a]n6ÓÔr•$–ñby#`(Åeì§N²×´ÓÂx| ³ 7µ¤AvìØ!®BŸÓ«GuÌÙIÖ,ØbÊB{IÿFtTv Ïß;ç,R™ÂÛq**y²-ùw¡ßfóœ8qâä? ÀÒÂI”ì"'–Âë.%a):ÁÏAÔ¯^½z qõ7ÍÉ k+qâĉ'ƒ¦Ö^ÃME&¼jDb{&ønL^Y°P0|}:aë»ñÈòÏ;|vâÄÉ’Ë—/{#xABEGËÉ 7ùT¶|Âþ4÷÷úO·TàœÔ±MÌ߈y,±§5#% 8q’„E~fUZ¿qãþ_a$îãf•Lp¹®îÅm ô§Ÿ~º)G¼õ\ì´'NaàÒÞâ ‚5/ƒÛW¯^MX|VŸš9sæÂäh§2`û?ÅM$'NœÜiûý/1UH©òuë[âÒ ŠüÛo¿q·ÍÊ[Û»Tâ;­éô"&&Fùü8qâ$aÙàÁƒ•+ ^Ê Ô§0ÞS§Níß¿?a]¾:5Ú+‰Ü¤I“†z >󾣨éÈtŠ#oPÜñC'NœÜQñfPâÀäøkë=zTéÈ © HKX. #¥ üÊBY^Ir º`ûöí›7oVÛtŽ&aQZsÁx’>ø ~ýú ëâĉ'ãÆ+[¶¬*%åÈ‘#]ºt¼¸÷Þ{ù›'Ož¬Y³fÉ’%C† >úèĉOž<™P¿«H?iØoÍš5Ë—/ tý·ß~*‚Ã1bDíÚµ‹-z§ûMhOËÓE§&]Œ‡'Nî¬ZµJyz×®][£F”)S>ðÀ g0A=xð ’KëLÂréñãÇõÕWëׯ‡´ÃQuŠü0üûï¿9rä€bbb¸ÃÙ³g9’€gÞiÒ•+WÑÿdÉ’¡æ|¬)ìĉ“¤''Nœ¨W¯ž¸töìÙÓ¦Mk{3eÊd¯~øáM›6%àïþóŸÿÛ•IΕ+¿rk\Úó»ï¾kݺ5ú…[Ýé~û?A‰ÿ'Nœ8I(1 ©®P¡‚sΜ9“'O®×Ù²eK:uþüùAÈögŸ}¦¢'ÿõ_ÿÌjûìêÕ«ŠˆS|îɧÜßê’È•}ñâÅÿŸ½ó¯ªXÛþA¡¡÷@)R¤)U±"*‚4©Ò{ïM¤—Ð¥ƒôÞD:J•„„@è5"¶Ãñxô}Ï»¿ßµï‹¹Ö·ÃÎ!1$$ÎýǾÖ^kÖ¬Y³fî¹gæ™g¢áäâÅ‹,XpĈ2”wÂß½{Wƒ$†Íø¹ÌB\v±ÑvÃSâ5:¡Ä ´Ý¸qC[­q‰®„Ëíÿĉœ4ñ;Ë›gq£ÇbCçžq c¨&Ÿ~øásÏ=×µkWmÍ,΢5~ÍæDßÿ½,¨µe•s{/Çááá®GÛ£ ¬nöÈ64¨3„j')d¶ÓrcÍš5ΣÀÕh9 ä|áÂmø5fÌ8™ôë¡Î=LõDmŒb6ÿ2Wµ–<ê>ÔÑønU#±‹±cáÐÏÂÂÂâ aØ ª\¼xqŸ>}б .œ;wnÆ QÑõë×ÿüóÏçÌ™³|ùò)S¦Ì˜1ãìÙ³.÷âhÜcÇCèN;÷‰ÛÍz b™ùE3޽mÛ¶­[·F³)*Ï•T¾råŠè÷âÅ‹:ê6!–6#¦AѶÔ&Ͱ·µsƒÄ›}é¨í e‰jþÇï–-[Ž?n‹“……EƒÜuëÖ­ 6@õ“'Oæ˜3Ú3QÄõÉ"BcK–,Y»v­Ëm¼ír/‘¿yóæùóçW¬X±~ýzcË—n6lØöíÛyD¯^½4ÀîÜÙ<,,l„ S§N¥ÑáØÉá´&_ý5©¢MáE”$èYG~”/_¾^½z®X-`·°°°xBÀ6†dàRgç~á…`Zsæ—_~1FÂô¨‘“'O9jxÛ°¥¡Á'Ù{Ź£1\-× _¾|9"""88øÂ… NVu ßîÞ½;44T^,XÞ6š™H¤üµ‡¬nñr̲‚øõ, é@øù©S§`x34mFl¤´yZ¢5j|òÉ'v…‹……E 9›amép³”ž‘vèÃÂÂ"´ô Aƒ8RBWC’õ…ÜêÕ«‡Ž…î SN~ûí·ÚŠK«Üž"E £f³fÍÊí®G¾‰ˆœ¨íÊsLÃУþ"q!dä1OI“& 1wêÔIVÜ»páBè”`ðpîܹ!ZþrÑ¢E'Y¶l™¢"%$˜Ö…Oœ¼#Wy:4ŽJ'@úôé¯_¿Î]'OžDçK—®E‹2|,4BæäÈ‘ƒ|PY3 ‹§y=Ò&)>„Á4Âܶm[H z„ÖP›Ü€HaËï¿ÿ‚‚-ÔŽ;îhÞ¼yxx¸ÓÆ#Í4¹råc[XXXÔzFsÞ,l1Z:… Å®S¦LÑ¢‚á¥xý,êFÍšØÐöeË–U‹àrÛ`W¨P¡J•*ÆôBvt-Z´ ÌÔ©S5 6oÞœ"EŠ€€€ÀáP=BÚåvö¦¥5„ŽöæF»â‰C?NDý¯ý ΄¡ '‘~öÙgùòå›8q¢ÇyMŸ•(QÙ,Nƒ ‰äã?†›5k¦`3gÎÔ„£Ó¨Ž-S¦ 4ë-=C† A“ËÀøøøÈœšÕ°pXX·£·9p¹˜!a Y$=)Ñ/ÂÛ××a|ÿþ}úèaHuΜ9Z2C“ÁíZTž={vótzÙ²e+]º4úœ¸JÛtôèQã˜y¯áh³@†š’L™2.\Ø' ‹øÑÒ:)‹;Ô… tã:u mܸ1 ŒøÔ0/´†«Rq¢9œÿûßÍ\›DµÙKV„KuÌãŠ)B>¬`XñæÍ›šP˜¹sçÂÒ)TüË/¿ ï¹ áÝ AM_Þºu Næå Áò\áT¾|yÎ#³ùkÚ:uêhÚ‘”plÞÝ›––9¿þþþ4 ï±ÀÜÂÂÂ"®`†[5ÊAÏ]+Á]îñ^èëÓO?uªh.mÛ¶ ²Z´h‘‚qÄBòðg‡4&0yòätéÒÁc²²–­Edd$=mÚ´ÞÒ3cÆ ˆtðàÁf<„4 6ÌõȦ1 ËPC+4E‹U‹cÚ‚U«V!’á^—{Üòçm°âz´:’—-P @Ê”)ù«!‹ÐÐЊ+ʨˆô;½¶Ò¾·'ò¿ª×¿}û6·dÈÁ' ‹xÐÒ¢Dcˆ´Etôý½9rä(Q¢„xäo`` ÖJ·k×.UªT«W¯6ñËùê:þü¢P³§­†&îÞ½›:uj¢:þ¼Ë=¼¬ ;ѯ¢…W5X­8µBõïBk"ªD`¿÷Þ{ÆXš3¹rå‚rI›N¶oß^·:tˆ_þ¡g–/_Ž,'[xëhl<”T??¿R¥J·ÅÉÂÂ"žÑ¦M¸«oß¾Z~¢±ksŠ›0a¨Q£`i-0á‘ܳgO—Û8mæÌ™þþþÓ§O7´BÔ}úô!Øœ9sNœ8ᔩ:èÚµ+ÔÚ£GýÕoIkHûæÍ›gΜÑb™#F8õ¶Zý’ÚÙ³gs¾páÂÿøÇ?x´¯¯/«U«6~üøÞ½{“¶1cÆhC1hœ8 Ç7ß|S£F Å)>7ÞJµDÝøñ03†´ 4Xf…‹………E\A†Ä€j† ûÉV ¾2+ Á믿ŽèÍ”)t„6^±bµâ‡Ù"##³eËÆíýû÷‡Š{—T¨P`Š Â43qbfé[©nó—Té*¡Ü¼yóòt3”÷"bej¢“ãÆ+V¬˜$·¬õhD¾øâ‹I“&¡´i8 §ðÕW_‰o%ìikôP{ƒ ®\¹¢œ‰FKs•„eÍšîzdRn‹“……E<AK§~òäÉò̯Qh €œ>}:þüZÜ3§J•ªN:px²dɦL™¢ÛÀ@KkI¸‰¶[·nðÛºu뜛¡ê†lѽFK‹? €Œ—}ÍAš4i m z0%Ãøëp=Z¯­à$Ñ›3gNîúðÃásÏ=—>}z9ÍãqÆýÈ7`iš`›w3CÅÞ\•'øøø/^Ü– ‹8²n„å¤Za¿îÝ»kýˆˆîþýûR›Èl ÆÞµkg´ êÕ«×­_¿^Á´š»C‡N'ÿGÍ‘#G¹råDn²[Ö4¥˜Y?‚ƒƒ5€áK ¹ÓÆcÓ¦MZ$~øðaIb—ÛÀ¯cÇŽ^æ/iàfÞ°aƒ3ªZÙ³g+Ápò¼yóä6¤råʲÊF{»9²ö¦¥¹Êë¿afë³ÔÂÂ"ž‘öíÛÁfÄ[¼M§`èСŠyïÞ½r»úÑG9sfÊ”)ô [E½Ô;wn;Êaaa‘P€3;uꄬEÜ¡k†2j×® ¹:uJ,*¡«5#o¾ù&´yñâÅnݺ!­ ©ù8ñ/¿ü²¦ MA‹ðÝwßé/¼ ûÉ3?@6C¶’ÖP7ÂÑ+㽞={JÊjí!Ò]1üðètydi“žR¥Jùøø˜ñgáĉåÊ•ãvRË †‡‡Ó;à‰¾¾¾ðöK/½Äíï¾ûîܹseìMüZDãz´äPœ¤+]º´Yªcaaañç•iBéËkM4ì gÊ·’.Ab(d‘z{ðàÁÏ?ÿ¼„+€ÉQÂc˜Jg *¹µjÕªN:õݵk—¢ÒF-оTúÍ›7u˹sçDƒú«=³4 xãÆ ÎÀ±¯ Eؾ}û|€Z®^½z¯^½Ú·o¯‰BÇ&((¨]»v"sä.”KbŒÃRÙfß»wO ˆp {ΓlíC?"z?¤-mÚ´éÓ§3[~¶°°ˆg@§@Ì–(òe µÖ¯_¿`Á‚«V­º}û6ÚuÛ¶mR×uª±‹¥K—Ê‚¢Aƒš’C?C˜ÎUä®Gfl÷ïß×Ô,´?`À]•8ÖõÈn™Hô ’'Ó‘3f(Øøñ㉠Âç’Æ–eãA˜Î;ËÊzøðábÔC‡Aõkذ¡Z¢eË–½ð ëÚµ+gΜ9£ÞAÕªU÷íÛg,º !{iùñ°öÒq 瘃Ë=ø ƒ)RÊÕ´š¹9š=µB¥Z«V-AÜÂ̲ñÐòjdj™2e¥:å)Ž…Õáˆ]#Ïü-ç†R@Ù¢~áLH[Z¬P¡ÂÛo¿Í-Æ¢ïàÁƒZD“-[¶¬Y³¦w#wîÜЬzÈi _kÝŠL»µâ›§€€€½ˆÓ$"""UªTeË–Õléc¡6ˆþþþÙ³gW’켡……EücÔ¨Q2ä0ZZ?XT‹MˆÐXËó’`éÖ­[Š)øÙÊ‘¬Ño19'‰gРAŠôôíÛWÏâÚýP#-ð¿6^9|ø0dnŒ¥y„¬ûàym’{ËÏ8\r¹7aÑ|è®]»L³ez²Hx–Ù§ÀÂÂÂ"Nðã?:­|ùûÕW_AwÒŠ¦_z„?ÃÃÃaETñ¸qã °eË—{löÈ‘#Ú"îòññ_yå•Nš4‰ó#GŽœ2eŠ$±HXãÏHY9‘ƒxgΜI0¸T¥×­[·iÓ&—{®Ð Œ/^¼xíÚµd0ôþùçŸó|þüùûöíƒ3%×à?ÿùÏ7ß|“`Ò@H^͹ò1,,Œv„Ö!88Øø3á5ùûÝwßE³öP;ÈW9rä¨^½ºn´ZÚÂÂ"þqðàA˜ùË/¿ÔN.E´¥Ëí¥šjݺ5r4Y²dùóçGmB‰.\€™‘¯7¾{÷îÒ¥K“'O^¸paÔx… 8†ÃQªóæÍs¹Ížò¤±wk—{}ʧŸ~züøq]ª[·nóæÍ·oßëšu<š8n«!ÿ!C† Òµfô¦gÏžœÕ“f<]{fIT÷êÕë믿Ö`ûÊ•+»wïÞ²eKÞW-7Òˆ†väÔ©Sf )‘ÿRy7å­÷ìÙ£q³1¢………ÅŸ‡¥†-‘¸Z"…œÍ8ƒqg U:‡¬¡,€µä cذaKÂGDDܼyÓl®­Y¼;wîÆ3û¹pæÌ™3fK\çÆU?¸¡áø_Ân'Ì÷n8—«ÈD­ÅÔ6[,,,,ž×rX¤cmq«c¤õÏ?ÿ¬ÙIÀjÚù v„ÇÂÂâY†X–6[™èØæŒ………ųãICÓÿùÏ`ï_ÜÐùß~ûÍø\Jƒºt xA£üñúõëršg‹……Å3xŠ–·%Èþ÷¿ÿm)ËÂÂÂ♂qÂüé§Ÿþõ¯ÉœØèg˜<©R·Z¥$¹ ÒÂÂ" @þ¢g j3ihaa:Q$iät™nþ:¹>Ôvx6Ç,,,,â ÆðÕ,UÐÜ=Çf_<»0ÖÂÂÂ"aQk‚þçŸæ]M!mW.XXXX$ nß¾m›ÃÏN9ègxûáÇhi»TÖÂÂÂ"ÁxFEÿôÓOpµÑÒ‚]¿`aaa‘à€™åæÝ¬„EBë$¢ÚéÆÁÂÂÂÂ"þñŸÿüÍì¤b­_€¢µ:ø×_5{ÞYXXXXÄ4øüRÑwîܹ|ù²®BÚ:ùÏG°9faaaÿ]t4L]ÿþûï¢kãÍÂÂÂÂâiøjG3CÅ¿þú«–˜ñ×ÌJNCÎIc$ ‹ÄÈÕÆEƒËíáöíÛááá¡¡¡W¯^ýᇬ%ž………E‚@&vÁÁÁ£GîÚµkÇŽ§OŸ~ïÞ½ÈÈHm$3<Í!Ç•ñ‰üã—þý÷߯\¹òå—_BÚ0v›6m†ºråʳgÏ¿gñ†ï¾û¾*S¦Ìßþö7ÿ}ú4###!p›E ‹ .O¿þúkÚ´i{õêuóæÍ;wî ¢!íòåËŸ;wÎå^3þý÷ßÿøã:>vìØÙ³g½Í*"εžñ “aÂË0Öº]û=™uîtîÞ½KšiƒHü½{÷¼ÝøÐ þ× ~ûí7%•':S˳~úé'yüç?ÿIJþí—HmŸ‚q£Ó´&jnx{®·ø½¥ßÛ#¢y/Ñ-Î\¿~=¦B´ø)ÃÚ„D³Ó÷Ã"ï«­{Sí|©˜ÆWé‰Q÷tx6׬©Ö|÷Ýw*êÑÔ—'ù:?üðƒŽÿøãóçÏ'~¦,½þúëeÊ”¹råŠË½½]`` ´Ü¨Q#¸ã†2gñâÅ+V¬˜6mÚ°aÃÈïgŸ}6f̘qãÆñ‚¾^Wá»téBJÚ¶m;bĈ3f|ñÅS§N]¹rå˜"¦Ïõ†9räÏŸ¿xñâ¥Ýà€¿œ$*RHÞNœ8±gÏž:u>|øØ±cßÿýW_}µlÙ²Ï?ÿMš4È’%‹¿¿† R§Níããó·GHéɼ e ‘'Oó,RK †dÏHÙ’5kV2ÊäLºté0=ŸOi+Z´¨Îðu@òž{î9ýóçz úð™3g¦¤ùùù™ðEg1Ó+p2yòä©R¥"Í™2e¢ ;ÃdË–Mðõõ%B Ø®S3¤ý”£–¾témëµk×Ôl½ûî»FRsyYj±Ù €_5Äëׯ¯\¹29œ1cF““BŠGø»޾ݓ„çSR–,õ#¤q#í#D Ï×ôøÊ”7øÄi¼ …üÝ (†OtÆ^ÇæI’)®Ü˜õ (àñ 8½!jüÞÒÿœxû.Ô_ʹLR©ürü\ á­æÆ4ž¿=Ia ß¼HCÄ4|@^©Ñcñ]â*=ÞàQeH° ÿs „è?köìÙUqô¶‰EüP:Ý‚ŠÓR¾D4–{ÿþý3gÎlß¾=""Bgg¼Ô¢E‹\|™‘¶d¶>+tGååãFŸÉ1ý.1 O2 (X…2ã™Êø·ÂÇ þ+P[Ó¹aZœ¨MUáÂ…d(P»ÑÈà'ç%ŠŸ$ŸƒØ¢á('h[E¼ˆUÝÂíºDz(ÏÎ<§/@Õà$µ›qoLóÍ'† 䉪Iá¾c|‚üäk:›!—Pé!ëøjð€oÇW.Y²¤.ÑqSN’`¾5å'ó3“x _¤HºœpNõêÕùÐ:IùÏ•+´¥rƒþrrÖ¬YôåéTöéÓ§I“&U«VE@’ùÕªUƒ²>øàÎÐKíСgP×¼»FöЖ22‰ègédÙšeã_}õUƒ È·:]å£iôèѪËѨeg#ø„ <…GJìIh**'xhi˜œÅWöQ‘*† ø!ÑáF#EœO¤hqžÌ1üÄTè¯ñØ#xãp•^ŸÁƒÔަ-ˆé÷…f#»h4áå˜šã˜ÆWéy’ïN½(^¼8Å2µt4m=Ÿ/X° …0v:õM4ò ð[·n¹ÜŽš ?ß¼yÊÕmsÀÁƒi€¾ÿþ{gàþýû+V¬[·nà”ö¯¿þúóÏ?k21NæAb~öìÙ›6mºvíZppðû￯‘ϹsçÆ4~ñ‚˜ÆCRi¿Ì„©fâ”þÈÈH§íÝ»÷ÆšûÓ´F“#O2aÊ÷úã?4eý4Öÿx‡e-e’­°°°>ú¡ENê$ Ü½{×Ûl]<ì a&éôñ•‹-Š@=yòä³VH' ‡´‘   d„4'Tzîܹã1G9¤‚×®][µỌ̃ɋZÎá>ÞÂSÈ%p½¼ð ½zõ2ó˜”ÏßÜ0¾àä­âñàÁ"Ù·oßÚµk!ê©S§òœlß¾ýúõëf$êk/ø§DzŒ4 XM½ .]ºnJ,W)¸N-8 Ùºuëäɓ钷H…Õ«W¯[·ŽL&p8/{ôèQ²ÅÛs½Åï-ý1µñàŸà½÷Þ#yÏ?ÿ|`` "~Å©/^äSòŽ;Æ{‘É|»¸*·êÇÑÏ]±b…äêÕ«Ñû1øg »T‘§N¢ÔÑ'…uêÔ‰iüq›ž¨ A¡šÔ«W]5–-[ žx¹W¢D ’G™¡,‘HÈ!¦_ 4Ò´iSTèØ±c)!Ú…ÄÈÕPÇ'Ÿ|¢nŰaèõN-Í{uìØ‘JÑ£Gó‚äXôæd1m[c^Z˨T©RçÎ0µM¤1óðõª~ŠSáÄN©Ìñ¿Üe tª“Ñä[TsDªÀ‡~HòL+ãr»0ÎÆßH¶ŽÑ›>±{YZ" ü¿g Îä9Ü*=Q»äaóæÍIJFÒúI¾×Ó†é"rèÊ‘¼-Zxôל%‡ A*SÚ£'5аo‡dÒH, ¿k×.N’'zœ‡bb³Ä‹¨Õ8p`÷îÝëÖ­Kƒ‹¬B©ó«ïK 2$[¶l6JÒ YkÏÄ'ì Ç(<_НàOø¯]ܹsçL ÿ«qæcñ/0„É+ÐÃ¥ŸK[OAòÈL^¹+b$ýÐ q’¤÷ß¿L™2Ð ™“k¨3=Ñ?7jüÞÒ»V`èСEŠ¡K…6<ù'‡Ô‡«r+s…Þ½{“íÎrÓïWùf> å–@0”,Y’.aLãÃïèM«£ÁzöìIo®[·nÆràYáwß}—fEŽVÄz(¦Êš5+ZZgÌ8I¢½3r51ôI“'OîççG/ÕY0 ‚öíÛÓ6õïßß Ds‹Úħ­™£ oz‚¤Öh­ÿ$¨ž4%”%Ñ©¶!㤠ʀ6Ñd¬Q¿fðDCjO˜?¦/£§(*g0o&*Uƒ¾ïúõë5Š9Ë#¢iwÌp7ox3ñ–þÿ!4—-Áã4ÓŠZøÏ3Iþëû:§i*=fXÌÔkú¿h­dÉ’‰ÔM¦¼QØHy\=7¦õ׈.¤Ë[o½E6nÜØ9ñØIŠhf—ÌqXX˜Ø`d%\£v‰tO@ÓàÕxÓ«W¯¡ÍÕËr’¢hìÃ:tà|›6m¨5¼8,$®ˆºlЛ6ð^T`¸‹`7 hQÆÐuRžQ7Ì•¶$ …ª-ã1Ú *â*ÅÅû//ðÆÞ›Ԓž«‰T§n—zÔ FhIºðjdà=7H7’ÃZ`%zŒþ¹Qã÷–þ?¼ÀÛø§:†  ¯4zôhã~üÂ%R;Ôóub·ò#ó€Áƒ;»Wjø‹˜¶1M§³+ÍíˆUÄ4Óøã*=Ñ|w>½¤}úð·B… Q¥]=þþ÷¿?ÞÜë칫3E¾Éã±ð^[zQ´4N«!hº¯þ‹¦±ô«>‘ð¹—¥¥â㫤fÅ[ÿ+¦sëÞ ÞÔ5“EŠñ˜gªƒYÚY©R%8ÇI­z#3½½_ÔøãÊ6@µ˜¾§¯¯ï¼yób]®¨G| ¹ï36ŠqØ—É@Ò©û_c~Ú6npr,l6ž¶‡0xð`jG÷îÝŸY§ñ$¯V­Z¦Q¦RÇ®ÖlÚ!C’%KFiQ/ò í¾ž;v¬dÉ’Zh,§.U«V•ŸRj–F„D/ôàÈ·Aƒi‚X»"õWš*á8 ‚­f”“ÐB,4[œh?M[«¡hô^v”1cÿ£‡ª·¢FJÂ&úçÒxñvÎN±ž;Ù£xx®<"ºÜ>lMçÚ9Œ W‹77¤•J޳鄦Ÿü¹yóæ3²VÂ)_)rêµAVÖïÈ~u¸0©¦PÑ”“{ª κ`ʹƎÌZ]´Äc ¤š3ª^êԩ齎5jĈΑ¨óŒÃŠ0}úô·ß~;W®\Y³f­R¥J¿~ý¶oßîlÅÔõ8p Üίú&v ‹§ 3Ðu¶Ú„‘龿.Íœ²‡ÿsÓÓ˜p‚4¾ñ‰¤ÊW²ŒU§Û Ÿ6 -ýé§ŸêŒi’ìÆµq¥— > yšn»1•7“eª5ƒº:©™'½ËêUÆblÔ(b<¼²$éŒ8Í€RTýXmÌy™öÙgP–³—‘H÷o »}û¶ù(rgúõ×_ûí·¡¡¡Δh¬­–¶°Hq £Í”7fsR±s¾C‹DVI^E[-mµ´…Eܬ!õ£x¨ÂRÍÔ¼S¯J*{Œ÷zÌ}KŠ{ØäÇÕÈo¤YN 4ýä¡™«ù“ž–¦l<¡59)«¥-,âšéÓ¢]ÙDÉ ¿txé_¹råêÕ«wïÞåªì-=¬µUÍ2aÙqnµ´ÕÒÑÃÛ~ÇÞÖ亹höˆÇ˜ÐËI¸ÙaÙFÃÑNñ)ï ò9Ÿ$&C2-Å~&ª7 oöÞIOK;k5Óê4ñõµc¸œ¶ߘVK[XÄ?¢O–0Vcò?pïÞ=9ùôl|‚IsWdddTg¶VK[-maaáçO§»€hìüoݺ%+YãsØåvnc¦s±˜‡n7áÍøÉ÷nȧY¼Õk­¬—œŽ~¿åLT•¿‚–vú[s.t¾²–ÿkËji ‹12XN‡à^-á \mÜ€£«ÃÂÂ4i¨[¢z/w=ÚñM¾ ×Z<«¥­–¶°H¨zçtbœFs‹±Êƒ·;Sb¿qãÆÕ«Wu *6\-“ZýÕ~N¿f¿ÎxÃ1¾¿ää!?Hʧbôæ2éiiÛ›/+“Ιù$T£,GÊVK[XÄ3ÄiÑW4§`ŽJGÜþl.±·ZÚji ‹Ä§31Y><fgÒëׯ‡††ÞºuËl>e& ¹ýìÙ³òàqüøq3:-‡3 +,###eR"ULb¢ß_Øåð5íáƒ:Éki3Œ/sÊÛ·o“ô’´~S —¬–¶°H(ê~¬Ï+ê),}çΧMšØLcÎòði.AÚaaa×®]ƒä©O«¥­–¶°x´´‘L÷‚?üðäÉ“+V¬È“'uS»f§OŸžß¬Y³öîÝûôéÓ7n|饗´ÌÒ¥Kƒ‚‚4Ð-ÿá¦sòþýû×Üà ~å…‡‡Ó¾ §MûâÜXÜ›–FEÿ膜vþu´´>Ù]7h|õ"Q7¶ÖvVK[X$”| Y°`AË–-‹/."‚µ{T›6m‚ƒƒCCC¹Ê™:uê-ZôoP¹rå‰'8p`êÔ©sçÎ]»víþýûáIG=VK[-maañ$E¤AZÄÒß¼àÝwß%À¡C‡2dÈàq EݧOŸÛ·oVDh–Z³±ãǻܾ7õ8mˆ,uç\·¾hÑ¢3gÎ8OjJQeÑͱ\‘h7m'þ×9Ç‘#Gò¾íÚµK2NK¬–¶°Hz§š1R­´ËÏ7ß|Sºtid³“s®_¿nHÌœç/â9((èêÕ«Ú¥W ¡>ø¶P¡BÅŠÓ¾<Æ&Y¦ ãLJÏ!d¢íСƒŸŸß¤I“De ¨˜¨<ÆF45©c-N×+p/ÍÄùóç=³‘åzAcOرcÇo¿ý–ƒË—/ëv…Œú,¥DíÅìÙ³Ó¤I늂ÌNCVK[-ma‘°\„š4KS¡ÙÍ›7#S]Ž´BBBœ”®µÃæ L¸víZ‘˜‡š•ÞîÝ»+UªôñÇwîܹE‹¯¾újÕªUO:å\c®yF9D5mš\ÛŠ9pôèQíîñ:ÆŽŽ–HëhºvíºdÉb€áùE±;­VŒ,Ôˆ o¤ôpžfeܸqVK[-mañ´!©CÍ’#;ª!D´ÿ~m#‹¼”4,jnA‹"¶‘Ъ­Ι3gzD‰–N:5ñh«V§žp\¤H‘-ZÀx®G{d#tÅ®òn¡´Ï‹†¯7†a'Q%jê¸BNš4)gΜ»I†fI@çι¥k׮͚5CŠC’pl¦L™ ÓòåËëÒ† 8xñŇž5kVt22Ûßß¿víÚ"Fлwonä dÉ’H;ùß+Z´è²eËÒ\ª[·nãÆÓ¤I3zôh]¸páråÊqcŽ9PÎ'Nœ Rœ| q!}Þ|óMþ^ºt‰ÛS¦LùÎ;ïp]k ¼AƒHh49ÇyóæEð'K–,{öìð?qΟ?ÿ?þ€ê 0kÖ¬ÀDËKU¯^cÅ WÃíC‡WÓ;à iµ´ÕÒO’y0':Yš1|üøñlÙ²,X°G2iÓÐÄ©S§¾ûî;XárŽˆˆ¸}û6\£B¶r…'ë5èzòäɨÓ÷ß?22R1ȳ5}РAùòå!+:†®}}}¹ëæÍ›L—.8þüFÉó,qã”)S8¨X±"i˜;w.ɘ8q"gzöì Í"ƒ‰ÁåÞS†Ñ:@é\=räLBaáÂ…(öÌ™3àÞ½{ZŒçs€Go7iÒ„Hˆæ' MZzŸ3g¯ÿ×Ù÷Ðji ‹D¤¥³dÉeÉVM²PZ½„N6ZQÃÑ?Ax‡‡‡ëvnìß¿? ù™‹HWs ‰ Ê.\$#’J•*É,„`:u "È‘µDŽZæï_|Áo¹råNž<¹jÕ*„1áÞS§Nå@´ïr]O›6ÀÐ5á'L˜@ 9¨W¯$ téÒóR… J•*O‘V,Y²$—x.Q}óÍ7hï¥K—Z-mµ´…ÅÓ†ìåàUã¥AÖÎ'NœˆºYèMKsF6rÆ’ Qºoß>xµ Ùj±z÷î]yá£î˺_»v­ÂC¹èy zõêð<)L:u«V­xНæ)¨\øE Eûûû/Z´ˆÛa{¤H‘â…^à*Ö¨ËèÑ£_|ñEôž^Ÿ3É’%«Y³&´ÌqñâŵBGËp”’#FpŒ¢†´Iðc×HZ-mµ´…E‚h'BÏ›7eïÁÞÐ, $spõêÕ³gÏ‚u¹'!7ÃT›6m;vìâÅ‹Ô4NP¡n(¡ë|4ÏE•i”Xœ»jY::Y<Ü·o_þ’†W_}¦Í‘#¾lÙ2.ùùùuíÚ•ƒ"EŠ´oß^qæË—`œñññ™={¶$7ÑNž<9Mš4>mÁðáÃÑêcÆŒÑP<ÔÍ%žKHx{õêÕâ"ˆHñ[-mµ´…ÅS…¤/¿tÿÍ2=#€å%ïÖ­[ÆÃ›r]JýÕÚ9pÖ\FjºÜƒÞÈïÐÐÐT©Rõïߟc-¤øàƒnܸ‘%K$±ö€¨þ0êk¯½¦Hø»|ùrÎ;ÇS8†9kԨѡC‡üùó=ztÉ’%)S¦Ô GëÖ­áä¹sç9Ñò—v„`àúõë#Ë'œÜ¬Y³ž={æÌ™süøñ.·%aÙ²e÷ìÙc´t·nݸڱcGmOcí¥­–¶°xF Õ.FñB¼23†„!Xø‡šh–·¸Ü‹YÌNˆ®G0 SYÙAΚ[„ºïܹc,=BBBrçÎâ…Eeõ^®\¹™3gæÍ›÷•W^Q0ÈÓßß¿@Ö˜ð AƒájS¶mÛ7fË– é [öéÓçáÇ4Mš4!…œÌ”)ª[·_¿~Ü•.]:(^åÌÂ… 9CÛA»€ì‡íQË"™*UªìÝ»·Zµj7VSExøßji«¥-,ž6ä(¾5u ^‚$‡ ûÉj.,,¬V­Zp¬„ñc×Þ¿Ÿ–ÀÜ€6á:c®&Î]"g”348eÊŽa³€€Ž¿ûî»>ú¨xñâÓÜ€o³fÍÚ´iÓwÞyGMC¡B…j×® ©)R$((ˆä¥M›¶oß¾;vìHŸ>ýðáÛ7oŽlænÞ¼‰º†=ˆ§E‹< R…aÄÞ#FŒðóóCZzòäÉÐ>»jÕª<ˆ8³gÏÎ+ðtd|Ë–-e/ÍÑlÎhµ´ÕÒñ¸N‹-‚ÊPÅ|.R­„uW­Z%·nÝ‚K—/_NM5BõÆßŘ1c4^Áy5 Зì@zöì©!hb;qâÜÈß/¿ü’‡rpõêÕuëÖ‰uË—/!O˜0» _Î646È?üðúë¯kdåÊ•‘¾„)\¸pëÖ­éLš4Iný†ŠäÖ+pfüøñœAfË^…DB×¼!i ˆjãÆ(öýû÷7jÔˆÖŠ»hJ¸‘ÆÅji«¥-,â_K»ÜnBóäÉÓ¥Kmèrûð”ˆ7ŸxNÁ,5j”xÕŒl¸ÜF׿ýl|Sʳ\¶lY¬[·. ؼy3¬¨gåλÿþ»wïFåj¹J¥J•PïPh®\¹ÐÀõë×ç$!áŠ#GŽ ¡K–, äÈ‘ãÝwß%ò5j;vìäÉ“=zôP2ç“rÒ†PO‘"E“&MhMx­Ž‘§)·uëÖ¨Û”X-mµ´…EB›øÇ8ÙІ¤.·Ÿ:ü7Ò‘‘‘\ãFj+ØÇÇçû￈ˆ0 C´V©Ü½{w㿺yóæàêÅ‹ß{ï=|þùç?ŽÀ†Æq*È—/4ˆ¨–ù¿ƒ^¶lÙǬu.ÅŠCKCÚ¤P^²ÑØ3fÌààúõëo¿ývƒ HC¡B…`u^‡VŽ…p‚ƒƒ¹—`5kÖ\²d é9xðà Aƒ²gÏ.ÛDò_¯¬–¶xrÞ译gžn˜%ÌN/”Ný£Tsg—ÛÂVñùGH?V19å6-±ãÎ;¼£ -tæÆÈ×,Y² uûöíKn˜‘Ø5kÖœ9sÆxR"çal³ÈeçÎÛ¶m3®ò©¼è[ý %µ µ“¢µ÷´lBLª8–+i2Ÿ[Lxî%~¨ž¿wïaäÛ|\t2þsÒji«¥-,p2œY¢D ¤,Çвô’˜çÇ”ÙÆ?Ý͞˜j‹x†©öîÝ+ÒVË¨Ê ·;÷{Õ²˜ùêÕ«ÎfñöíÛW®\¡YÔè·|@’ðAAA2D¹å†st…ôpÉÉá°÷y7ànÑŠõhÞØx(‘iAHÛ¾}ûhŒHá_¯¬–¶xrÈWNà%Þ(?Td-[6Ö¼ü¥Ì¨v8õŒª-uGµONÛdÏ ¥§éª0 AÆîW…PËŸœHA)g ‡Ðëß°aƒ¯¯oÅŠ9áˆÐôâ&µ×ç6&¯ @HÒé´îܹZ¾§oÝI9†$°ùõ 1¾g ÁzˆíÇv‘¢?iµ´ÕÒIUKÓ¥K—.Mš44ŽÒÉÐNXXØš5kd³!,\¸pÁ‚’¬.÷žƒ#GŽ„ÏEÝ\‚Á2gÎ,Ò†ùµ îc=i ‰Çaæl"ŽD4hã,*H¶¤,“Ó"Óhçy«pRã3Ñ+p«¥­–þ‹C»5Q~tƒêsôèÑyóæÉ'¼ñ$•KeY¿~ý¤I“víÚE¤Øpž“7nÜà—ÚMÍݾ}{‡ˆSË7¨ÎB EÍÕ^NòÕ)¢ø¯Ì(à"ÖæòàäAƒéMyw²÷ôéÓ2ó Û‘ÍZ`( ½uëV2u­ sîÜ9-ßœ7Ä-k]¡bÖç ¼†¦ÉR)Ϩ*§Î a¥çMâÿp#™Ðji«¥-,fËB­7 ½kgíhXÖlãñãÇa~???n§A Ñ¢òÿybV`ç¬.g"##y„øŸ¦–V#ZÚq 88V×Ü1ÁÔŽÓ"k(Œ6EF)De y.iÐæãJ%ìitx„zÚ:\ÊŸc¢"~­ÁtŽÆX-mµ´…tŸUG4nüí·ß¢„òçÏŸ!Cÿºuë*ä… †ž-[6jJ±bÅèqK‰É;½J¿C‡͘1£ª§¸SËQä¨qÜHHj(Z]Zš“Ic‚³“¢ÞQë8ú÷ïO>h¾OŸ>œ‡Ó.^¼HÞ“‰…öß±c‡¡&×£µ*ýúõ·Lª¹Ñ“œ)¦úÊúÐmødZ;ÃÁoð÷¿ŽHX-mµ´…EÒ€i­òæÍ›;wn£3iÚ4@ݿϞ=MÇÕ"EŠlذÁåv”ÇoµjÕtU›Õ'wÁùZÆäþZ~’Y?cø$‰óIS-T‰:B®±5o~J£á«¥­–þ+ƒ nêöã?Nž#5!HÆîÚµ‹N‡<šBÔdZdddDD5—_Q7W 3dÈíoÅy§–ÖÏ'~`rþz›×C“°¨s%áéæX-mµ´…EB ƒ\¿~]üC#…Raf5^­œÊ(ÿ¥f ¿4Ð2L~÷î]ÎSy}}}uÉhWi³üQc¿ZÉBüZd[&¤âvZIc›'ËgÂs;é!*"óà ÎÈÞOSÚ¢‘äÉfƒ»h5H¿Ì°%µbñæÍ›ÎÖAƒ`Þ¬S¬–¶ZÚÂØ?»Ü#¨Ù²e£„ ¢uF;Poܸ±N:iÓ¦¥ü@T™­[·+V¬Aƒ¢ˆ^½zMŸ>߆ /^<{ö즾÷ïßêÔ©sæÌ!À¦M›ŒÀž6mÚ¢E‹ÆŒ³~ýú3fŒ=:‰BC‰d×±cÇ2f̘+W®={ö(gÉðÒ²eËÐÒ¢ey1•I ÷Be‡ ¢³£ ;z.ùòåkÞ¼¹3£4 È'¸wnà:¢ÒL®: ÁüåÛ†„„hrй ñÕÒVK[X$”–†{iËŠ-zôèQ¤&z• xÏ ˜Y*—_Ž  q —{088XƒÏˆÛ³gÏ–/_¾~ýú&rÓR‘¡2ç¢î5$Ld¡A"Ñ*˜Y³fMš4IŒ‹žÕ‹ˆ†ÊµÎtJéi K&ÿi‘P4æÀ¹4RÊ_7F?*nµ´ÕÒq˜}CÐr]ºtŠš--ÑåR< ã[-ma‘ Ðh5NÒH­'å Éõhà×´¡.‡I³t—±Ä£!Ð…†1nܸ!&ïÕ«W… ºwï~ìØ1"‡“ 4vìXQ:â±Ïœ9sÈ!½{÷†±Ïž=+W‹/îСÄxúôiBÒ(Ϙ1cøðá°e×®]!#êÌBȧ 5|jÐ[¶l)WjVÙ®>yeøY^[Õ(<¥¥= ¥¥MœzºÓäF‰1®¢6ˆd׿Ý0Ö¶t‚äiͬPóèRiP.#4cúMÜÉù:P3¤VƱŒ·>)Ò‹t–É Í‰†ÿºæ+±àøñãôvMM×7BA.\UL#ž!C†Ý»wk…á ãÇžðR;úW®\ñõõE'föìÙ\:tè4~üxþjŠÊ¬<þš/kÌL§@r—¿}ûv²¥K—.®G‹GЮ¦ |Bä’œ9sÑkD2÷"q)±ôS´Å‰)¥šÅS/ýW^yeÑ¢E%K–ôóó£Ã:/ä¤ìÞá^-`äéüj-:>)S¦lÖ¬™v˜?~Ó¦MùôuêÔ©R¥ gÄí-ílï.^¼¨/¢ïe¨@õí¬–¶°Hz0•=00P œƒ$X¶l™ ŒvuºƒF¾:=V­Z¥ƒ©S§š}¬ qê/­¤A£@ó ]7®M›6PqçÎsåÊEÌ\ݱcGæÌ™kÖ¬ùòË/çÎ&¬Zµ*y”Eíڵˑ#Ç Ò¦M˃¦L™B¾ñ÷ý÷ß·p/—’'O.ñ õrk)SÞD§«¥5ÂïáCCÃÎN“uU‡»wïöã@ýJ¾E4ZšK<âÈ‘#3gÎ @‰ö:Ü´ijYùèñAé+qiÈ!2ÂéÝ»·âÌ™3'ߎ¯öÖ[oQ(-Z˜ýb’¶–F!ÃK†UÔ W˜ƒx3,·ZÚÂ"þ¡¡9Ø"-\¸°è÷ÚµkfŸ…ÇÊ-EÑ’»P¡B~~~ІAo‹Ûúé'È ²]²dÉôéÓ Ó¿ÿ°°°jÕª!ªéËgÊ”©D‰Ä|øðádÉ’ùøø”/_þ½÷Þ;vì­€öõ&Io¿ý6ô.ªÔæh´æ tN¨yf?%È2døðá¤ä“O>ù“£ÄÒ„1ÐÞ¡$ Fû9µr‚¦Š_3{žØµ´´¨ ž„«ÓÅ ™ƒâÒ&wŸ§èjÕ•GïÉÙéÓ‚Ù=‚vóT{glŠôFh3 Œ¨"wŽúަ™«RþÔ)Õ ":tèĉãgÆ$~@ç}K|Ö¬YçÎã`õêÕN« L¯^½FŒÁ¶^R.ñ—4YÊúMçÉ™úõëÓ‰†ä¹B… ýúõ5jŠˆÞ·æÎd#­q?(…ºoÆ¥ÕÙÑÆRü&F êÇji^×lÓ¦.‰ZQ¶tÍÄr¼¸F-@ÓXÎ:ßF¯¥‰œYöç¦Ó¤I“"EŠP÷)ÆÔ2ÎŒ=:[¶lÐýR¥J­_¿^q¶lÙR·p^ŸÆXéü´4Y /©úky»ë‘ŸpÆàR<ø ´ZÚÂ"þ!]„è¥ÞA€—/_¦¢ÉÓÂp¤,p…¿ íP/ ¯¸8£Åà°±VɈ"?þ¼³mÕîš5k|}}ù›1cFQ·®jê¼ùæ›/¼ðBÍš5ß}÷]Á h5¦p#J›À(m­ÔͰ˜l¿ã§%…IOoÛ¶­YéSȉD|h#žéË„‡‡×«W綾^’ÏX‚ãIÞnîܹ´eo½õÖ©S§\Üåž„Ÿ9H™2eݺu¥FÉ;ï¼Ó¯_?]jÔ¨ .¤M[¬ñmΨÝ4™z™ÈÆ›™t-_Ñ ­h í×uLVÓH¡@6lX¥Jš?"/Y²dïÞ½'Nœ8nܸ±cÇŽ3†FJ.ÈŠ/.ëô$ ¥Í†bF£E&14âÊSõIÚ€ÌܳgÚ@½9e¬~¥ºåøKÂXŸÌBK‡ÈzÔ÷’ÀŽæSµ×òÁˆàIé†ë£Ý»w¯ñK“x¡A`r…|îÜ9ªê‹/¾HÛ]¿~ý÷Þ{¢K½ áÒºuëd”[®\9~[´h¡­®'Ož¬ÄæÍ›UƒˆJ«-`àI“&A’Þ´4ùIHOç Ê:šÖ~ååË—Ï•+WÍš5é¶séí·ßæSvêÔ ™]¬X1 v5Š-Ê%:M0ö¼yó䋦ĸuIòZúðáÃtýêÕ«'‹&µtM›6åéHYZH›\ur«¥-,’L“–v=ÚÇJâ®Gn¥!͆Nj¢Žôññ1\ÃsËwß}ÿ£U *¥¸Üj×®MX¶lYZ@N¢ÃS¸ñÊ+¯ÀÞDÒ®]»¡C‡Ò .X°€† råÊ­Zµ‚É9hÛ¶mË–-õD5m·ReÄRüX¦Ñi̇Wx’me¼i0£ÌO:5bÄò$Y²d’ šœ•#sræÌiÎÃÛôDô ’†‡<ðAi¦ ,˜6mZºmÛ6]=xð š íDàmĦM›Œá±<ŠsеkW$bLó&.ïfŠNÿ-?¸áüˆ·nÝBN8'8ä×1úO);^„ môúX}ûö¥måé2wîÜ$àÃ-*Nž<™%K–T©ReΜ™ª‚Š–˜åÆÙ³gM±á "©Dt׬Y!˜žjmÕªU¹Ï?ÿÅhúæô³&¯ÔEŠU$/Qæ«W¯&rÓ&“µeI¢ÖÒTùR¥J© RÙgÏžm²ˆÒE&› :--!W¿Oý»9sæÀ'Þ´4=tUþRæé‡"A¡hú°\¥öñwéÒ¥tçµ¢æ#ª¶îرƒoÇ%Nó÷Ê•+J<`ÀD5¬EÃJxZX‘.¹e6ír.ûzÚ@Ð}èܹs¬cpÊ3ÞkóæÍô š5kV½zuz7DNKÚ¢E $"ÙÕ½{÷>}úЧàïÊ•+µÙzœwJKSTxwºuëÖ2e oŠòDW£Kywš'´:M…u*ÁF‚‘ê²Ñ±¢Y¼x1%Gk ƒ‚‚ˆYƒ¨NÝÎI䥅žÈµk×ÌUZ¢o¿ýöÀçÎSÑ5è žàÁƒfL×í‡øÏ—/±dÉ’¤™ãuëÖß ‰dµY• l¡&"4“¢^‰æ°dâë,çrê®É/ 0Ýpå³|§HïI šâÍ™'N üè†oذ󚢢“¢!YõbT÷u¯ºü‰]K—.]:kÖ¬á¨Q£¦M›¶sçNx–X±bš–Έ&þΟ?y>|ðàÁô5cî”a¨2{i•UCãÃÆ_tÞ¼y«U«Æñ'Ÿ|Bµ¢èº–ÀÆ’Ê4 * ÜHœñ6¦‘àZšL#·) 6¤ïi“i2?zô(}ú‰Zz”š‘±ZÚÂ"©Âkž’¤ÓÆ(Pºæq©–Z •=’ÃœŠ„ –æW,­02êó‘ã’Œ!=³ƒ¹œx˜Á%CÝjšÍ0¸Ü\Ë\VšZªŸ»4îtä´*Ö¼µÅ‘‚f Mûⱬ’̉óÖ*µôåË—»uëV¥J:MÊ-í¤%"=|ðA@@À±cÇ\n›"ÎÓrÉÄ…i§´ŽnHªT©¸E>d@ÿ‹¹‘^…{‘¸32™A#8yòäµk×jlŸ,%ðÛo¿ÍUä´ÓY éqúþõ&§‘ޤñÃSÈž›'OM+¤L™R¯ëYŒgªŒ€ŒEéÙé53fÌH~ÊûŸé‰8ý!›.Ç”ŸCZÎTŠ;n˜œ×:ú8Û§?E¯J^Ú\s“(šú3®už-­¥%éҥ˜9s‘"E*V¬¨ù;1mñâÅ Ô»wï H0Ëî%C† ðEfΜ)§‚Þ´tT7rÃê[·nõóóCQ,XPÝõŒ´ÞÜp_Êɺ µKKBiiœ¡YÌ”)Ùî¤e2YU±^¯œg4d$Š3ÃSTÆk×®RÅò¤$ôèÑÃLÞ™oD>P›èÑkc«,,þ<þáµòõ×_ùå—ƒƒƒ§OŸÞ¡C¨»N:#FŒ9rd×®]ù=sæ á·mÛöÅ_ÀQtÃÑ-4jýúõƒµ>ŒníK–,i¤Q4õ”Šo˜-""‚ö—§Ó.UªT“&M-ZtõêUÃqh ¨õÑÖçNNãoëÖ­á+^_ä‡é” YgCÓf9åœÂýùñp盪­DCš‘™…SÔJšÏêú“PWkýúõè¥×§ÔñÜþýû«‡ÅßsçΩ-8p ¬îµ> ±¡AQcCË»P‹+&!‹é4”M%üÅ_”U ¼-w>}Z& hòråÊõêÕ‹2oÆî.]ºô?n˜oM’š6mJ¹-\¸°¿¿¿d3:_Ê’3zôh==Y²d»wïv=r:P…YË¥:´ƒ’³iÕ§‘VzxüæëðÝÃÂÂŒ¨nÑ¢…v`yóÍ7ŸvúÌ7åqäöŠ+´\×8£Nz˜4iõ®cÇŽ°q‰%$’Tn›6mèEnܸB†?µ3Ž@þ4oÞœ,2+“$œ¥W^zä;1>µ4Œaš¸…ŸQõN…¯ÑžXŒkí‹V4#˜i=%×›Vë¯rò¦Ý»wO:õ°aÃtþºFNk-^YXüE@³¨Q£;w.Y²ZèÔ©SÅŠ©†yóæEËÕF®\¹z÷î½ÿ~ÔE¡B…´‚^@9Àð„Ä&L˜0mÚ4ÃrÑ?×TdhŽŽBÆCþß|óÓ˜« h÷¨ÅòÎÁIçØ½Œ¬Y³š½Îã0(7)Î$ióGgªb¹ü¶‰iµ'—ëÑü ïh¾š8q"åþßB[ž™äÅÕ›š$%GŽéܹ³†åQ¼J$¥Q®n]n»ÙÅ‹KKçλL™2ZïTÍ(ù&SÄ6/¨m&Ð${饗ҤI³zõj—{ÈWC몷¢‰Äó»ï¾[¹re£Ïè7M™2…N“$™~ÄW_}U°`AùÓ€aΜ9©JÄ#Cô¿»Á%ío’°0¥…6—¢¥æÕŒ!;Ë’*)Ÿ[&+¼ŽÇ<}.2J]•?þØ8ðyª@W@S|§0ø+pµ&û¨¡|º9dÔi>ñƒ†(oÞ¼™<™G ®šÒ¨-Ç›–›]¢´µzDDÈÔ­nŽ]üZÄÇ5í%ïë\`*¯ÙÕ‹úhŒ  åÁ´Ô-î¶ÈÂ"N@Å÷]„h§%æ¼VzŒjRÍÞpœ —§S…ü¯¶rÈìmƒo5›€{Ukû<'Y™ýò¤¥{OIK£L”În‹¥J• „±%c9\ʇ¾|ùr«V­BzJ½zõdDá|}¾)¢3…Õ‹? KHš Š“‹™3g¶mÛ–~œÞôèÑ£d»¯¯o÷îÝÕzrêÔ©>>>&sŒöK•*UÆŒÑÏ$›.*WÖ¨AÎŽâMž<¹^⪥…SAt2ò[ ‹ x¨ìٳ׬Y“«ÕªUs^¥'&¢1¥iË—/Ÿ.åÉ“yOžÿÚÎCÎÎ*æì<:{UN« ,оxtè€{ŒoǤ’öؚܞÇÂð[KkUsR…Ĥª?DA?K´oZYkŽÃ /:þš#xî¹çèbÃ6r?U£F^½zÅ⪒Ð#_óÈ‘#Pq¹rå2eÊT¥JÚ³@nTžßÞ½{Ó6Éá¡ДmÇý.®1zؘ"›VÞɬ°bª ¢÷W@l´¿¯l4¶ùp|š»wïŽ3†K4 66lX=HÛâÅ‹ã°c†\Ì'·7nŒÎ¯[·®Ëmã1zôh®8p€çʳ¢ò‡n…l0ˆD;}hND…œÎ;·„téÒ¥'4µÚ/O·(˜Ìke©+3uµ yµk×®… 6oÞ¼lÙ²z®6ËVC™Ç Îzº1RªX±"w(Pॗ^2+p&{¥rúÔ©S¤Ù”aõkPЂñògª¤ŽyÙP¿üò˸Ý0(Z}oîÁ“ĺQÇd©®Ï¡ñjºoZEb çÚÎ)©æv8íÚµ+Ø6kÖL¦ãño/ ‚‚‚*T¨ -xq¥¥Í˜6µ¬^½zeÊ”¡ ÿꫯjÀá•W^Ñ'¦ÀÞªC† ‘kÙ£GjR ’tÖemm`õ…Eœ@í©™*Òúki$YÏjk9/³0zFÒ" ;=Všjp[„/{3í³€t¡]€4øM•àãÚ&OBBËõj/^|ýõ×á«nݺѾ+ñq¨¥óåˇœ:uêþýû?nÌ0È«óçχ……ýI)(Ÿ±ò*Æõïß5ˆb¼}û¶y}ŽeœìDÊ”)i¼œKóþ´¹nÝ:(ôÔ©SFÞk,+É[Ô[XÄàšTšB$жWe×Ї·Š¯³Ï ²¡i³€è‹¸%Qô‹ÉC>ä úa÷îÝ+W®Ü»w/Ú©jÕªÆ1—ëÿ74ý“ q”†ÑâÆèBÞÿ4(f&ÿc7î$“i¥™¨Ö¬Y“%KùrqÎAð5GŒ! %ÃŹv"'Ÿþytr×®]鶤J•ªQ£Fzèž={”!šÖ¬U«–Î#‘ߥJ•ªY³¦Öýãg43Mš°E‹~~~È–‰~JñâŹ+þüŠ“çü·ß~‹P|ýõ×eH`z‚ú3¾/LÁà™ï¢mYî|#Zº Èk¢vœ§¡Ã>WLáô ê4hPéÒ¥e1ž:uj²ñ›o¾q¹mõ-ZT½zõ 2ït:j×®MW ¥m"{¸9N±ŒúôðÈipÔŠ¿Zž< kMCF]PMq:\úó>ñÀõë׉ACÔMóD4¶z¸rY¯±ñóÀ¡š~ýúI`«««4ÈÁ¬ò[ŸxqÍ:‡@IsÔ5¿\RGÛØòÅb¦U›Ê—‘,%Åeï!é¢%งÛ˜ýòH[ÇŽ3fÌ8vìX¥6n¹ºlÙ²ÐòܹsÉ òÑHk½L(«%#Æfä™ÈaàaÆÉwÜ”)ŞáA’Ó“'O†±yMç(äS¾/¹ŠºÛ·o_½zõHÉo¼Ñ¦Mc£ûðáCÚ‹ÁƒÓF 2„w'Ùf?qNÒj Å7nÜØ½{wã;,,lèС\"* ¢ÊEÑnÙ²¥U«VÚ]ihݺu·nÝ\nc'cݤ!&J&­ÏÏ?ÿL]Ї–‡rɨù—&Œ\¬»Üv&™2e’Ô©xp¶…×1|óæÍÚAÁ\¦L™îQNw”åÊ•CBs‰.Æ×_­ó2¼ÔP›ÞÚ)i⇩4oõo7þ:fŸšì ó)cú”¦ÔbT2G£ÖâÒ$¼Odzà¡*CJèl¾öÚk[·nýÑ -ÝÕ®gúd±àL>"/¥Äó‚’ÍdÉ’¥`Á‚Íš5“‡F`P×b?xšËoâÚ±ÈÂÂâ¯8jÀ€vƒ Œ¾ŠC4oÞÜÇǧV­ZÚàÃÃAŠ““c·žZØmÛ¶iJ´S§N‡ñÊS¢QG\Ї½Zâ¡[Ä{]¸paÖ¬YfY’¬[·Nk¥±iŒb7cBs)Ck`òîOÕªU¨z:Í\‹-Z¶l)uMÚJÆÛ $Ìè4}ZdcÈѰaCYfªû@a ×¶zõjúôédŠÉI™£[X<ƒˆÿ½ZÌÔùóçåóÇ××QíA>¡¡¡±[`·xô?ÿüsTtÚ´i»víÊC@É0;mY-maa‘(€AcÀœ5ByÆ-QïÚµK[žÉEŠ)´Yž}ÐÀNg’OŽÇú? S•¤%âé4 ÆÄji ‹DÄØPÙĉ}}}áɧ¡¥áÆÀÀ@íÔœ%K–ܹs0`Ĉ•+W.P @=Ο?ïzd©ÓÈæÆ%ˆÙJ é­=üÎÑ¡›7oÅh¾`,üV‘'ºK޹8Ð.çÉ’%3IÐü…‡‡“ó4|È¿«iéâvßÌhÒ)wÙJê”)S.\ˆÂŸ7ož¶‰W¡2½‰¨¥Ú±XXX-íd’‡ž9sfÈ!rpÍ/ýSþΞ=O:5µ,v«›QË2Q»xñ¢Ëí…Oc)‰©Œò«•VK[XX$ h…Ú¤I“üüüú÷ïçZúêÕ«:uzî¹çÒ§O¿xñâ7ß|ÓÇÇgÙ²e°hݺuµªeÖ¬Y"ÒX°¥Ü5ó3ªô'aŸx®GûM#=Z4Îß½{W'å]*Õì.¥ŠF%ÓZ¶lub÷òå˧OŸFN3žøJ^›ª„††’ÂÿÇÞ{GWudë¾Ç&ç @`’ɱ &l“1“1“sI ƒ"ˆœsÎ&ƒˆ" 0ŒM2m°Ýv¿>ϹçûÞíñÞÝ÷7ö74GõÉX!K«þØcïµW¨UUó›ß¬š5gpp0ÌçOÉOì5óö¤nŠ1îš]J8è!€W<.mEÞYˆ†]³fM0dĈAAAüµk×.íïÝ»÷ën)…ñãǧM›–OMk'ãã^ñŠW’~ ðvp ǧN <öë×OùÐöÑò…S‚ò ¼õÖ[“&M‚Æ@t«V­ Çæ=4~ûY^XÕÍrèàŸÿüçäÇãuÎÿ÷‡|Ò€X";v¤Ñäÿcc‰ƒ©*í$å‹ìšÄ±*ß¾}[yX4~”Prâĉ֭·)°V¸ÐBXÛpòŠW’%—Fê5K|ñâE=zúôéŸÈ—‚à!áááü»ö¸´W¼â•”V”±÷…½V.}üøñ4iÒdÏž][ȺU«VŠÀÀÁÉœ9sj>Ä<.ý¦ÊÓ§OÕ,ê ìiUË/¯T '¢yþK—.Ùåè;7ÌÈë+æ•ý÷¿ÿ]™†*T¨ ï#F¤J•ªgÏžTñ›0‡?›¼ üô”¸W’7—†Hkçòþýûyn®\¹¾ýö[Ÿ› ß©ƒû®]»‘¶«—öŠW¼’’Úâ¿V.}öìÙÌ™3ƒ½b>@"3fŒþ É–-d[üÍbPx\ú…È e *T°`ÁmÛ¶±´€r .L:5ƒÇ½ð¿ÿû¿|iãù¢¤ð>€ñJ•*Ñ­ááá<—~?pà€²i‡/½>üù知¾y³âÿø‡70¼’\¹´í ”ÓT† dPGFFà3fÌ—Þ½{7ÿ"ø—öŠW¼’’ ”C¡Ï´&ž>”Å‹ó}Ê”)EŠÙ±c‡xZÍš5Áɼyójò0qÒãÒñ.ÿüç?üñGkœGaã\¹rÅT¹EÆ;qâDªT©jÔ¨!‡ÍßþòË/JÒýºÇ°¦ýõWÍ’)ߥÏ?£^®\¹jÕªi)„·oÆø ׺¼%ÞÙ$½â•¤Ï¥åË$Ξ=;†?Ch—,YÂ÷Ñ£Gc&?yò¤gÏžüÌš5«Ç¥½â¯¤´"ËX +iE"pébÅŠqsóäÉ“›6m wíÚõÂ… :tà8d Š«™ÃxÄð¸t‚ú §ý}vDA¤¥Ñ¾ýö[©û½{÷Â`!Ÿ\«Ó‰@øE•£££•ÔXCH!£-´×+ÍHÿQ’toxx%¹riÌRF¸_6lÈ£‹/>{öl‘ç¶mÛîÚµkذa2dà'äÖãÒ^ñŠWRZŽàB 캃¾>. Y»v­b+¹åOú“¾´oß^^yÔ*ç3=.ïb€9uêTÑ¢EÃÃÃ5 ¬pU´›ÎAù¦K—NŠõþýûháDkIa~öìÙÌ™3©@ãÆUs‹Ù¢/ Xnèùxx%ysiÿáÑXÇ!!!˜¨åË—/[¶lš4i *ôþûï¿ýöÛT),,,$ÝãÒ^ñŠW’ZùùçŸ-­F¿V.-gtA“&M²fÍš)S¦,Y²ð¥dÉ’… nذáÅ‹u&DÚÒØy\úM•~øÁ²Ò,ëׯO•*Uhh¨ 1ZLÉ\Ô­”ž={~òÉ'œ@÷q~¢e?Ù2Z®;wîìÔ©“¼†ÌSëì³Ï>ûôÓO¿üòË¿üå/F°WánÞ¼ÉåÞ¨ðJJàÒ6»bi¾«V­úoÏ•?þøéÓ§‰Ð—öŠW¼’Ô ”Žþ¯ÿú¯ÄäÒÑÀottô°aÀbHÎüùó7oÞ \‹ÿ(‘Ÿï—þóŸ çó{J,]ºôóÏ??tèêõÙ³g´§2†Ót $¾_¸paß¾} xÈÁ[·nÑ•‰U:˜‡y)§¡úœ'OžÌ™3ïÚµëÒ¥Kñп˜x H5j⣖ñFˆWþè\úÿø4ÕM®Äw˜ª€Ú6ê‚Ì|gä><(((}úô}úô‰ŠŠÓN´½sçÎ¥€nWؽâ¯x% ‚öСCÁ«¦M›‚Ÿ¯B,!ÃP©oUË£'ª, —Ï€/&ðµ¾'ˆ«Ç¥ªÐ/¿Y….{ðàÛq´<&R"TþE¹Ó¡ƒ6£ E㥠à¯?ü0~7oÖ¬Y–,YräÈ!>³gÏ_|ÃëyÅ+IŠKƒ½¶}س)@i­È<‚§s)‚ £v3«&B µ•Á¦àóÂoÿ¯W¼â•$K™ª®K—.nÆíß‹{"®ÀݶmÛZ·n=iÒ¤_üeÁ‚¡¡¡£Fš{ö ±¢Ç÷ã?þýïœ?ÿüó3fŒ3föìÙëÖ­Û½{7P@eð°°°£G&‚€#tgÏž¥°š©s"ljöŠW¼â•xCkDDÄÛo¿=räÈx{£AGåÞF O›6míÚµïÝ»U¾|y)…ôéÓë 'W®\ÚÆ’/_¾Y³f‰Ír¾Ç¥ßlA±þï˜òü£V­Z¨Ô¸/Ù°aƒúÖÊxøðaâTõ‡~¨R¥ Þ¼y3ÃåuÏO ¶ƒÆãæ ÎÂ… Ã.ªW¯Î÷ ý7¯Z¾|ùîÝ»õ®O3f¤NºN:rêøî»ïøüÛßþ¦Þä5j¤°ñó±|;¦Ø¾§Ü민).›Ç÷ß0›Á™®[ÅÁÉY³fÉK?-ÊW¼â¯$©’ >¹ÜÁ%äÿùŸÿ VÃÐÂÃÃçÌ™ó믿¢ Ûƒ† ={ÖøsÂniñ¸tüŠÚÄÜuä²ø›£BnÒ#áµ*Ö¸qc)Y¥\Ô„d€Ê0¤éÓeË–5lذ_¿~ñ«Dû7kÖŒ{êñÈEî¯$5.ÛÞCÍ„HØ>|xåÊ•7n D¶ÒôÍ7߬_¿þèÑ£ñ 2¿Fà‰4Bhh¨)olxÅ+^I‚%AöÎæMÊ k»Ï¶mÛš7ož*Uª-Z<~üX,7mÚ´<188xÑ¢Ešîã3qÒãÒ¯Rž={æs¼&~SwÿüóÏ´êÊ•+a›‰ããÁS²dÉ’&MšÓ§O=P¼>ÕV©öíÛçÚk¿«”/_¾páÂíÛ·7ko}Ù+É€KÇælò¾eË–êÕ«k×íåË—9þèý¯Žù+÷R%ƒB+ÙB°¾ÐhjL[EõtVâpxxxPPÐG}$VlÁŸ_½<|øPSÐ;v„ŸÐï¶ŒH¿+u¾|ù!=.ýŠ*ŒR®\9è±1R$t÷îÝÆ ëÙ³çØ±cwîÜyÿþ}ŸsPéÒ¥óæÍKÛÒ×-Z´@ÿN™2åüùóOŸ>½råÊ‚ BBB&L˜@ûó9~üøÐÐгgÏ2¢¢¢´ËiãÆüûÙgŸ¡4'Mš¤èˆŒCþåÚÁƒ9²{÷î\~ìØ1Œ/?UªT<±nݺ=ÌÍž€6f< <–!M5Dé¿ýöÛÈÈHÌ„qãÆiÊf‡^f] €KÓøja388X}ŠBt#¡aÑbq3Ñ£iIT*¶˜.ìСÛfK@Iº—w#IqiWYCêý«W¯Š¾jc¯¾>\ó¸tÒ,0O$‹qÀ‚ŸÂU ° xnذ$ùä“Oø gnÚ´i÷îÝ[µjÕ¤IŽDDD ¾øâ‹.]º´mÛ¶_¿~œ ÔתU«E‹óæÍCŠÁh34hЦMîÀÏŽ;¢2À‡3gÎð³zõê =aΈ?çL™2å‘¿ð…gµ÷—úõëwêÔ ÏÁ/ІÊÛ¬…2oB§½nµ¢Æó .Œ=òoÿZ4ÅdÁ‡1޼KL. VÃCÿÒt ˆWpiu«|¡Gn.MŠÚ?>¦±Á²Ç¥“‚œŠmŽ=r5wî\“iº\¹r,X°Q£F_~ù%ÄÚvçÎV÷~ýõ×€Dðð=µí¯þrëÖ-ˆœ±›‡Bq‹€™Ë–-ûꫯä¹k×®'NpüÉ“'Ð{®B«¢€\îO[¼x1º^c†ÑÅyJáðáú?—pgÂsçΩÇåÕ¯©A47¤ÎüeÙ^®_¿Î%¼)ÕˆŠŠ‚ŠÃWi–7;­ªvC[Aõ©ØÊ•+ÑeÔ“núôÓO9¨W{ÉíÃ\Z p7-îkBÉb‹‹Òÿ&Þ³g˜9Ê´ZµjÜgíÚµšÓVçêÑžÜ%5.-AF"ò厦†S=ÎàÁƒ!?…Ç¥“f¡‰„ot"bX¹re@lÀ€4p¸råŠR • 'Ô´ÿòË/èM<|ðàßUÄȵ…ªmÛ¶)Z—Ãè¸] ­{ß²eËÍ›7é\²dÉõ#èÊñ7n€ºœ,æ†úà¹ZL4Õ ’¼„³Ï%rQ²dI”rº˜’-[¶   `yò$­ja©`°`òýû÷u„“K—.Ý£G£Öß}÷ݽ{÷l’^V,h ~ '·ùÌ»wïîܹSpʰ¹té’V¯@]õƒ‡[qÃ9sæP™ððp8} ˜£/„ÆŒÞuëÖ0gÏže0º8™K¤_ÄCT%eIF}ÈCæ5‘·” M˜o¼_$#Ô™/×®]kÑ¢…Vi3fÌÈ—éÓ§Ó èJwVçå¹ôˆ#äÝÁýùbAò“¡³¶oß>yòdŒ;. ÷œ={¶V"¶nÝ:räÈìÙ³wêÔ M*Eïí Kš\Z…ä2H¥J•Òf› ËÇŽûðÃsæÌÙ°aCK'åN–+W®J•*P_±\ÛÚHFGG#ã&‰GŽq¯Ý±cí,tåª'NÀ™mÔ ÃU~úé'˜6˜iY)qYÍœbµehŒ'¢÷]m ŽÁØE¤©'l¤UPV¯ãà6jyÚÊ]‘T<+ýË'‚C?Z0I¯$ŽšÆ<¯°b|1Ù¦êæˆOïÞ½¥BCCézd‡'‚uëÖå ì ÓU”)•¬Ç¥ãW´ë/ò¯ßIøÕéÓ§#""tŽÜ¤i=óþÂOEƒ5j”+Ýà¶æ{%æš“DY3ÆÌE™kmFŠÅmÜ[½cS"\gnÚ´iš4i¦M›0ŒU¾0Ò°Êß~ûm°:$$$wîÜíÛ·—s‚4‚…Ža„(æ •ÔëìC‡Í!CÕªU5BÒ§Oo.Óoª¨Ñ„“è¬-[¶hAgéÒ¥%J” ŒW½#ß•ßÅ¥g̘a«E±,Û\Çœ˜ÏïZ#[ J&+¬K—.wîÜñÅDY4 õ$.épiº!AHž^§Nþýû¯]»våÊ•Hœæ»²fͪ5#K'ÍâZ»šC&`+ ]%ì°V×kë;1’|òäI[ªCl‘ßÛ·oÛmÁð™ÑÐ#<âÛo¿}ôè‘ ]ŽN±Óx"}*œ±û‹Ï³3fœ4iÒåË—½NŒ Œ#hÛón‡ªôûñãÇgÍšåµX¢Ä¤¯Š+&eš€9Sà'tnÛ¶mµËN•*Õ{ï½' ®T©¤üŒÌÑìqéxÏMé‹ÚÈ‘#'L˜IKQ©Ø¹ú÷éÓ§t–È©F†â~ðÁ\Bçòî ÷ƒ*Ó§çΛ9s¦¦%V®…•mܸñ›o¾QlÛ5kÖ€Ì|aìqÂöíÛtßþrïÞ=*¶ó¦Ù‚ d‚EFFrd÷îÝ?û‹*ÆHæ&ôlµjÕi 3L8W®\… VäAº^;Üå¾KUìW®\©^½:\q"»“qûÂõÇÄ,îtÍæÍ›åT,X/õë××_Tøeä(€K£þ¤L¥ãÜ•)ڮ䈜iSÞ}1ÉOÍ9¤hÑ¢ô©éM@^Îç/Ãù=.h\Z·›¢§OŸÎÓÓûK‘"ET™9rÁ«¡<.¿qmÕªU§N´Õ«WžŒ¥»wïž?žŸ .DtÏž=ãLJ•iNL^¾|¹zŸkˆØÚÖ6ÐþÒ¥K’_¾ó×Ñ£G¥|þ5å/¿ü 2åþ 4¨îóÏs0œ§€`Œ®«W¯ž9sæÂ… WqÊ‚#œ ˜kËF= Ó‚;ÏÇã…ÜFiÒˆ"¥Ð¡4>MŠÒD3jÕÕkºDæÒ  ߀TÐø ˆÕb ð“:uêß~ûíR¥JÁXn3£–Ðz\:~åúõërdýÓŸþD[¡7Ñž@E“,¶?åÚaÌmÿþý¶)‰Ó Ù $S:Qíò1„]ËÇjNД8·…ëæŠàFRÃyDêÔ©5âæAÓÄšÎÚµkW¨P¬Z‰Ìë_CsÑg J¡:tHNÂ4…ØæŠ+úõëG5Þì^9À‘l¢ªV­ªµ¤·Þz+88xïÞ½¿—ª=ÇcÓ¦MÚþ/ÁѳP¯îJâ?ý%„׿ô~ÅŠówÞygРAî’“žÈ§¯;Iqi„¡¶àcH.²6oÞ<ù{ˆWC°¡=‰“|ÐãÒñ+Úlغuk¬`fÑŸ°÷ù‹lgM_è*$ Ë\âf‹,s°¬%<9HkÖ‚Oî#lä g³80¾óÄ …/<BÇVä*É ¢Ó“&M’wL<mÅ݉I£íܹ‹Æ¶¡Ñqˆ' }÷f7˧L.=bÄp¢ÏmÖ%b²cÇPqÉ’%ëׯ·¥ÿ×Áf=.o¦/¡¡¡¢”™3gÞ·o°†`ÒeÿÃ_ž>}ª¹J¾`K·Bà *”1cÆaÆ©y-àó7ß|Ã9rè²ç»<«EÔµÏÅˈ'r0ÜöÖAí¤Ùõ“O ^#VÒõß}÷H)giEù›ŸÎy~åFmݺU÷çL1Ì7>J•d}¡Ÿ~ú©âVñÙ·o_q!Ž?zôÈ’ü..MCzW®\i³4;¯ŒU¥„8bȶñÂB?êZNƒá3xR¥JEU]›ËŒÏ+òMqid„žrûQ"iÊ7ÀlÔ £‹KpõЬ3ÞèùÁ n€TÒŸþùËŒêUMá i¾y«W¯¦¹7n¬­( øéó¯$ª…%ìêzƒA7²ôoæ˜PìDùHÓw¿é™ÉùT`Gø®èÖê÷ÿÇ_„H<{ö¬FþÇ|éÒ%[ItS¹iW×k݇›”‘I¤¡4Âĉ#""èY14Ô7ªT©rýúuލI]™R§K—©ñMôhasòñJüJÿþýºï¾û®/¾Á½QÈ2¢‘/ÓUÁ…D›åçã‹Ù{(iéUèÚØ"%þÞ‚t{\ú÷ºÑS`gºéرc´ÜxáÂ…/^TßÑ_œ3þ|k±Ù³gciŠøÖ­[ÅŠK:õâÅ‹õïܹsù.Y¸•M ?~üøÈ‘#r‡¦§ Y ¤ÿöuÙ²eæÆ &ìÝ»÷«¯¾jÙ²e¾|ù ÷“&MRÐcy%-]ºôPïs«uëÖq  ­ÈleË–5Eðï$BkùdÈT¡V Ë{÷îMŸ>ݶa¾‘¢ùv/ÂOø-½“;wn|ÕªUÿÓ_^,¤’E2ÄĆÀ»žÆÁ,;mN“ÊÚÿÙ¶m›îCõŠ)B™2M´ Ô—ŽƒKÓYÆ‚x–Í=>ocj[î3q7/$à¼Ç #8i´3Zh„=zhhyñr­{GÏ‚QòÆéÝ»7\ÚÆ ¨.à¥õ0™OR–‘ÐXþš'á ?5ÿüÂròäIT'7áþÜçðáÃÜGϒÞ–±4N@xžÈHc¶gΜá‹~òï_|Áw9éñEqc¸ðÚµk ä]-Z¤W‚x¨ÌÛÉÏ” &®áÙ·o_My™O¼þX±â©º+vÐ$š/ ˜{:e–ÁƒÓøÅ‹÷Å7è«Æ¶ETC4lZÚƒPL™2eàÀ¡¡¡üŒŽŽ>zô(bxõêUSÓñCi11«6ò¥Ðî—Ž»¿4 oaí¹†šÊ£M›6 æÏÀp±Z¸Ç™|ÑÆ¨µ–†Ô¨<‰³h-ç¨så¾emþäÉÍnIƒ»ù.9ÎÝäO«îEä¡§NbP5jÔ(GŽ…âo¸³dš*ÁL³¬[Ô6**Jûà"##ušê¦ÛÚ¼Šéèû÷ï7mÚS¦éxZ£Fo|f b²q«çÏŸKŒÆÒèÑ£‘w,G$¨S§N¡òÊ2dH‡ªU«V´hQ¶jÕj„ ˜o¯ïÅÿ¿˜¢aùÖ[oõéÓG(í­eXA ä_¼#Œƒ ’cè 蹃Džfÿòf IxA³gÏJ“ªÍNÿÿ¥Üºu˳mç*¹ÍKܾ}[sžº?´ë0våÊ·b—/_VÌ9jË! ’`Nxxø²eËlžGð¢DŠ 5T²¿ØõZ†Ð»wíÚUþW¹rå Ò ?µ–ú›«H¶ì•)òñ@_¦ñ_X¤^µ_LèP£Œ¹B… ²›y@ýn6TÅŠ,X€hÇ6;wa8!hJ$ï-Qy\:î¢Ðj3+ÖúšBÃÁ?éýµyóf3cѳêßÿôí_¥ý8ÑÕîŠ>µN=z¤ àä®]»GZ9Ž?nA•öíÛçóǦVÑ¿‚_áÐnÔïvsä®}ûöððõë׿ýöÛ $URLIƒM±°¼’ø\ZáImaaló,óÓ§OðÊ‚W¬X1-|¸É 2fÌX @Ò¥K¿Ž·¦bæwd¡à•€I£.®éÇV^Rë  œü©0¶lÙ"”@âÜÇë'êW‘Ö‡‚Ãæ9?µsá©¿ñ8ø—X øÀ ¹–Ó´ÓY‘T£££U:‘Oœ8˜Cã jO–â oÞ¼ÉAzVÑóŸßÍŒƒJháôÿ‡2×S+²S&¤5uä Ü6̧ P[Æ “òÒ/ál¢E3«Y³¦†hüÆ'B¤ adJÉ 9ˆÔŒ;¶C‡Ý»woݺu«V­ø«]»v(Y¾tìØqܸq‘‘‘JwÜÚØ• Es’ ÁãÒqÌKJ)eí¦Ùji~È!ßÿ½E—•Ó¬M*‚Ò®ÿðµk×èD xÔ¨Q'N=¦CµôoÛ½EY¯^½*çdɸ‚ì™2Å’&¥z`‚Aˆ½{÷n7à­¶íç¶mÛx(/Âqî€âÐÛ‰‡……1T0ñxðÜUÐØò;vì8xð íÃâ&bÝàÕÈ‘#ßø”–ø9gΜB… ­\¹RóQ½{÷Æ®±½'Rˆ/,Yeå/G#дóŠ+hõ²l ŽÏ›7ε /j1:âyïq­&¨1ÃÃÃûöíK­°¡°K”(áÔÒsÏ·êMqiÙ2¶Ho2òeœ~"(h™Ûr‘µ¿ä;PoªYYŒ^wS›@)K–, !cLýÑ‹+>ðä-ZÇŽ£¡´·—n êùºÓ­2~µ oJÐÖ¾ü3–¢^¸ˆ¬y»@m7j¡IfÝÁ³;ab£‚w¬U«VžÎ§ë“ùêøìqéßTÖ®¹Jãã4«ß¼yóýû÷«ã”ÍĽмw|19^0ŠbÇ‘7nÐ˧Nâ;’{òäIÛ` =<‡TÛ?€k]öˆ~à/š6¿sçöW³fÍ g>ÿ-Ch¸jgºò¹pž«Á¦gåÏŸÿwÞÉ‘#‡ò÷íÝ»æ¯mæî˜={våÊ•1ìˆ4o§0 oªPóY¥æõë×çEÖ®]‹ºÄFà;"LÛbV0æãØ#`rÊ! ²¤.ànöÅÆ†mÌw]\Ê”)Ó£G}w§Ár㤹ä6I/Ó¤-[¶Œƒá{%‘¹´è–ý„0ÛJý O Nnœ‡W/rÜMÒ³¤úm":((hìØ±^ÞùçywàÀE‹9rdëÖ­¾Nž>}zß¾}—/_–ûÜ÷ߦ)‹8‰DcØò—|ž…{Z¡Uæ§FÅ ài–¹Ï•âKA*#Á§2%B¥•±·£zOžùä“ìÙ³—,Y’šK6…û\¼xŠ÷Ót«R pç¥K—¾ýöÛo0û¡ qX%J”¨W¯žZì.*ùâÜŸÅ»¸tERC; ¤nß¾ì¸ûÕÑ4µsçNŒb­õs®…é­Æ‡éäfFöiÞÉ“'+nÖÔÍéõŸ<×ÃÞ7Å¥m­œaç¢XêÒ¥KcÏ2DnÒ¤Iß¾}y:‡ÎñÐÐÐ3f0är!A sõaBj<ºMê½±a²\«V-º©AƒÑÑÑZ.¤ -¾‡5 _FÃã£ekvô>g;&¤Ä•¯öÅR´Q2æ®#+ñŠ[=~‚šå†àƒ"jr¹ÖåŸ)Gmqâ§m —*± Nh(@;uêÔ5kÖ‚Ö´iS=1W®\YK\ÀjåÙ¤dÉ’¥J•*uêÔ‰ßKL'"k¹–àÉ,EÅÖ¨I¯^½·GauÅ ÍË:% ƒ5cÈJ%œ!CÅ»S[Íœ9sãÆ€'mEŸîÝ»wÁ‚òÂúúë¯9” ø`£®}úô)'¯ò-Tq°{÷î 1MmZaH"Ô+V¬×´7ä“#úòåËóæÍÓwî†RÞ¾};ÕK'JjIš²~ýz0“ù—OåáÎô5•á;åkÖ¬¯¬˜« ù³)“KJVx_Z[®/±ä]‰.ÆÎÒUéâÅ‹Óh ‰2eÊØ@RÚçgؼòÂò¼Ï›¬BF,\¥sçÎ(Çž={úþuÅöåË£Gl غuë xé;€7S¦L¨{`YÔš/b&J¶8iÒ$h’\ª~ïs1Þ ‘ç]æÎËm»téb´\sb2uš±cÇ=Ú¿´°˜ úWAr²[ó´®J²wä;ä¼’[»bŸª/Z·nÍMè¬wÞyçüùó¡\Þ¶m*!aþ\»vͶñ]“4éÇt¾@°¥=O\àÅêÑ5•¤æ"Ã&×÷ïßW„yX›ðº3gÎ<{öläFŸ°¹J¡pO{eK®7`ÀEݤ>`»^ÜV!‰Qéæý”Å!÷oø¿"G‰.ršë7ž8Eô^lbðôéÓ¹sç¦×x5sŠc1â……;ÈÚU‘švm+ˆôˆ#Ž?®fç`½zõ9ȯ¶+WgHäÈ‘ƒ;È¡•Q&#ÈZŒÒÚ^ö€:lذ!C† 8Pi†“Kïß¿_uΜ9é>0– VÃcCBBø¬]»vÕªU?ýôÓéÓ§¿JL<É)à0mÚ´:ÄÆ¥­`åQ Í8Ì“'ªŠVB„má‰WHƾ ¸$_V›E„¬"°˜½RúŽxöì™bGk‰MiÜéb[Õ‚ЊžÚPY?¾õMoº°‰nN¶¿B %Äù<”¿PÚÍ­^vqiKå‹ñÙ°´¶ú‹T%õï“'O  …Q ÐÓz(7Œˆˆ° tšo‘—ˆÆß©@‚§Jj…_´h‘qiÈBdœJ rK–,it2Ö¢E èbî¦Î¡µåzÇxðâK¿LÑ+CêyÆž¥ÍËû Ü – ²ÅûæÚ³f±x–ÄÄCÔ®?ÿùϰ,[Gæ*äȵâËÿ:¤ÝH‚¾0GŽ™ DYKMÉÚæ È/üDRØ $„ÐjN ´Aƒ¢:³fͲùœÛ¤hÒÛ·o[Ê$ÛKb™ å/ͧæCD;}1aaÜ…$NØd°. I{/”˜yýúuõ×îÝ»-¦„Ed È N}´¶ÈsMÉ40ѦW­e¨}¸?¤NÓ#õ‡e!P˜6òu*Ž%žØ¸ô _Ä~ÒòK7Çò† "q v§NÜ“i®É“'S*©-Hêë2eÊ`ÍŸ?_¾‘ÔPaô“ÏÓ¿Ò¥K#DÅŠkܸ±Ö)Ü™U%ÎóâäüfQ† oH×…&•ÐÐÐxß_ffª@Ñǧ­¶èYHœW™RÜíܹSàÏ[Œ;ÖãV§h–æ–®ÐÖXôŒ«üùóñÖÉ`ÑÙÅ[;rîܹ#FlذÁ2ÆZT"­‹ÑS á¬ô Û_þJù·téR&šôرc%kü+VŒ3†vVøhn¿Â掎¦ßy4L@Ó×b¶:t »#**ªuëÖšLb3&¥ŸÊ9BKiI¸´–3DÀPèJ-dóÒütç9Ïœ9ãó»bêg¦L™xº"Ì0åø!ÀÇÊËš5+ª¹nݺ4…^‹ükíÒX=CeÍš5-ÊÞåN¿Ö‚¼h¶Ó¿L•Úµkk'»ᆱ…&LðŤ3ˆ—ØÄý|èA´¤T©R|hRÌhA»uëæ*ÊáÇˋLa¸´^ïù¾Z¡[iD‰†BfÇß§OŸDæÒbS˜˜K¢ÖFºäiiÁâñ\Mnˆ°]¸p¨iÚ´il\Úbôieî ž`ðÒ2«V­’“˜26*ënòVߦ[‘n™Ï•+WvۖƱF<6{÷î•Æ§ËV®\©\Þœ>s‚ W#aÇŽ>'¥~jŽ4îܹówß}7oÞlR•YÎü ·¸=ü”G¨ñ7KnK= ªí‘TsåáæGk€VŽ»/›€‘Ï“rQÆ^­;l± j…6[¬nݺ}ôÿ:´Zµj:È'CËBÚ¦ÖKüÂã!!!Ð °TÑzãKt‡HËåË—•‰˜Oø ]SªT©âÅ‹oÞ¼Ù&E5-©•>XQèøÍïq¹©æwÞy§OŸ>qpiÔÓìÙ³Ÿ{É©—ÁÀ;wÂpÐA¼oæÌ™ù®L+¼)=TVÛ·o_²dÉ©S§IMA`õÀ«é;è­‡šsÞi¶Áxµr¿Ú‘ .—£´k×®B… ¦sæ EÀK].ÊO×çú ´ Þù‹›Èûn„ P2¾¸~õò=°Ÿ–ðKiø”ôÜ<«á$eË–å•¥_´$Ê lÒ¤‰¦Yl¥› -ùšf°ïÞ½«­yè×ZL.­‚a oݺÎCç,XpáÂ……ü…ïK—.•:‹£ü&—vÏŒ2Ѱ2½9{¤W¯^’b>ƒƒƒ!öGE]J9úüNÝÚÀ&(KŽÏ‹oæͤ¹Åp¥[“K«ƒ¶lÙ²zõêÊ•+§I“¹Ø¶mÜÆWÿð—øa&À‹.¤OÁdÅÒÜòûyÉ_øÎiÈ5ã°pá˜ð(%óBÒÁ|9ÂiOÜí]ÜÀä‰Ò !ÅÙ³•ƒj•Puæd¾3Áv0‹@ü™W†-PmmKää“'O"=Ú½{·|NæÍ›ÇÁ”æèk[cþË_4ï¡I-É‘Ün¥FùN‹'¨?ù·ÓnkÖ¬±HJžkÇï*4 ‘ù ¾)&^«V­$˜ñˆ×­>¥ï0l{÷î-×ÖÏ>ûL[ÂU=}QðR}/R¤È´iÓÌzÇ{)¹ž>¹aûöí}±ûxpÂÈ‘#Wâ“JØ‘ l1ÚßÀLëÖ­[ÆŒQRƒ êܹ34eÊå2ƒÖÒûsæÌ ;tè`wà¯ùóç+á;ˆ ŠOÚ,¸Ób4ب¼!ötKimƒM;D´D‹€±é_ÎqבmÚ ®k4O@Fôóä0`~Opï»ï¾SðR% M/^¬›(“´¶btêÔIF‡e¥÷9kjP ÎYµjU€sB"øjò^¼ÎÌ™3sæÌY²dI¤ =Bóû1K–,Y³fåç‰'âÍ¥ÁXé>;©ä§òH,lÕ«W1V`‰çÉ“Ç&ÃGŒ±råJ¥@u ^…ÊD#ƒ<W®Ã^ /6}¤™[Ú‡öÇpKL.-`8UªTÉ@;þüŠ#údA]>øàƒøÁ–)\ÈT OKS%‘”H¿~ýì ¥Kœ’=µVPÆòå˱[ßÿ}¨£$”Ö³9 éPTG4íÌ à\”;@z!N°VE Áäû÷ïs²æ hÆÇþ¢öä ¦t+t%°I7åΨÑ>et÷7 ~5&.’ð8º ôàÑ·o߆?£˜¸-ÃÕ—¶4"TI ¹4cŸ§Ü›PIjÈÓµ -Ãëp²"*óʵk×.Uªö÷WÍ“÷ …/ÆõÅf -¾¥yì¸âÆÍ+Òð.­ï¼3fÌ8p ¶’‡½ñ( <›ø¥//šJÉAÑhÚ´©þ‡‰gÉwø\²d ¬¡± RŸ*rZ8CóÂÂÂm&ý½Ïu§¶cܳyóæ&PÏï=¤¡¡¡ÛA«ùÉ ”ïh{:èPȰ6ù‚{h¢   ŒwÉË‚NE‹åßÍ›7ë|¹@Œ3Fý²sçNËôYäp å BJûËZ¡‘Á7ËgÉw8¨Ó¸ƒ†-¯Å)·û¸›–•»G«Š ª-8‚بoø›Á¯‘aí¶SÅ8ÈÉԜ˅·ÔŸaoÚv„ ¼]õêÕõâ¦Ðs ›@Ù¸q£Ü¡5mbʂʿݻw·­Xò0L„\Q µˆ Ra~Ö­[7µ¿È_Ú¢EÅ1ß—VØçÙ³g#›^­Û¯Ö~%ÕÒf"E8QûÈZq²u&›‹VmÙ²%5D3Jx™ÝùÃç&²¿4Ÿ ,˜;w.O,T¨Ppp0d~ܸq£G9r$uXºt)02yòäE‹?~<Ö¶_7]5/—6”æß2eÊÀÄøW^ &’Ún–ìç$Ïž=Û§O00G޶çö¨” >ÿâò…$ŠúrüôéÓd¨ §´ØîÝ»­•Ü ‰[·nxRøÂOm!w­ d ÈV­Zic,Êe×®] ÜaÝ­°ÕŠÌ¯îæ‰T$ç§e•Òdµmß²e —hë §Q´ê@;}x¦©¹]¹rEi\€¬M›6)^«6à$ã5/W~yS@»bÅŠà6¯o?®¥éz±JÌ…Û¢œÃµb¿|aÜŠ ™°ˆD(PÀ$"~wvA¹þâ‹/ ¯Ú!Õ¹sg¬ÑñãÇ÷íÛk£U%ù}•…)z=ša¨º&[@L< ê?ÿùÏz¢ÅŽK ²è8GÛ1}™3g†þ‰Ïpð¥Eº¨Ñ@NºI W<á+V(àóõë×Á7Í@ÒJýë_Ož<‰åeNõh^+ÐmMÚºuk/Û¾}{ÆŒ§OŸ.Ö*¿è÷ß_PéóG5¯Y³¦\G”ë§B… \«‡lÓ¦ 5~H øC´êÂ… -Z´p÷žó“ƒJò¢âŠæ¡gQŸß—O“l5’¦æ'0V¹?‡¬<ȃn+Ìá¡´*fĈü[«V-=W›°sZL¬ª#÷¸(F6;(,p»ví¨³ÔëïâÒÚÔ¡C‡ÿüs7jA2.Ú¦€í£FÒ–ù)S¦Ø¸´Ÿñ €=zÔµ8xàüÝ»wE‰iÌS§NYŠ4¬%IôÅxÜM˜0›Ø&ñ3gÎX$¨hHäË—Ïvî+šGÁ‚?úè#MÐé¹¾˜)r™f :¤µ¬ß ¹¶½£¡¾ùæ›uëÖQga _øÉA9Öy4ølºfÿþýšÆQÜéÇ+·rTTÔÌ™31îlªPÑB4¤-Jyâó‡ã4²ÖˆQyð+ú‚á¡hR((¸\:`ÊâÕ 9qâD¤àöíÛÚˆäþ‹ ÈCÞû½ì]q{dgÉuD)-RT® Xav,WœYšHmEË@Äàà`w³Þ?ü@‹ÉYB¥¸Ð6ë«^ŸÅK-þ¡¹ÀŽ´xç‹ñ² m?ýôSî¶zõj×'HÈÓ*­ö6J;ëZ—4×¢*MvŸ>}t¾ÀúÈŒR`L-q xRûY>ê©pˆ HýKM›ÁÏ_Ð{Ì|1QF Oœ8­<Ë–ÌK“R7 X”L±ªì]8!C†¼yóêg“&MÐe‘‘‘ò°ìHñ ž—kÙ²%w>|¸ºë…›Õ,'—u—)S¦páÂÚÁ ²©E}áÓuÞžñ¸9U"siºCK-2Ó IGº2 _|ÆÍPH H”EUµA’¢¸4XGS#‰ÖòBWX"¶FêÔ©CBB´X¯i(ËS£/Œ# g®ËŠÕ/ åBÖ¤•Ólyѳ~$Õ `ºé´|þð¶Y²d<±èË–-›)S&8ÊBw)tëÖ-žÈØ0-`]fOÖŠð '…Õ-¶MFÜ&‚0sÃõë×GDDH¡øbvçÙ~sÀGUU³hþM.…Ôç7+ßž:uꀷ .v“‡™É›Kûœg%ŠÕŒ´2Åhl‹ˆYÅc.Ÿ(€¿5kÖL³Í)ŠK •Œ0wU­ZU“Ò|-ZTÿr^Κ5«–hµÜ¦;&JL9mÚ4í‰Jµ¶=v옛A+Œú ”Á3Ÿ~üøâÅ‹Rcs&\—NŸ> B‚ä< ¿à¢ÊA¡â –öó¯ô, ­î>qâ„í;}W¹°mV($=ËÝ%¡œ|7nœ¶”~ÿý÷¶öÇ%h휥ðE™¼#BÛ© l<Ž{ÚþS®½yó&6]êÔ©U½û¨Q£h†‡¢5ŠNËã[Ñ@¡pša8w¦òÚÖA­^%\@ù¿cŠ6oÚy ŠŒJÒªšRFq 6Ìç¤zL—.'€±q¬ïhw¼æ„uó;wî|ôÑGÚÑ U]S+qD–9ãÆÉa ­^½Z 45¯¨ãº›¦}”­+@<<rÜx\úå ²láD–/_.cñ¯yQÆUâ;¸ Ç6/©„-’Swý+åpi‹F+× „‹W‡ ‘–¹©Ö°u«6¨ô”¦ÍFðåÒQºãWÒºlxÁ.Î!ì¬ãn›6mbH(˜¼â”‚š©!¥k¾ýö[aˆÏ 8ïÖêþýû–QsÝnšK»ÖÀÐ+ ð:s×dõs”¾V­ZÊCGýûõë§õ+ÉcO"í¬]N'yç*ò¸´y·nÝdímT*Ø Å ‘‡¨*i¼CÙ(—“Ɉlϔƥ…“š$¤5:vì˜6mÚAƒ)‹4 ¢8¯[·Ž¦Þ¼y3À%«üöíÛQz€ŽŽ¾qãÆ£G€n…nxøð!l\­DÛ‚Wœ,<äÎO pæ>bæW®\•â|ºXÙñ´SØçwºð9é°:u´9s”€`SUj¸gÏÞˆI“& CÔ àCm©¶¢ig?m®ÛL*++V¬ VZø£>*T°ûP±êÕ«çË—OÈL³ìرCÐ4qâÄ·ÞzËüd4Y¤àÕÿûßmY0c**åFQ¨µ§L™¥W>JqQªaÊhƌڞ¹~ýú8î/ wØhj¶lÙvîÜ)öB¿hOw>–8Æššj8[…„„¨Aô ý«W`lhiX3çžG’âÒ‘$ˆÞïÔ©nÛ¶-h€T2<0”4ñ›Éßÿý„z®¢à*uˆ‚Û_)pï¡bA2H´¢jÓ) d‡ø˜ {ö,d»FAÚ›l{ýä¶(ª/f»«2çÚ Û8sS© Þõ‚Sñ–aб´cÇŽ¹sçnذ!** †S·nݱcÇòèèèhð3`ñî4_=xð`Æ")wVÍÿx€™ì¹ôÖ­[à]á•ÆŒ'éÛ·¯­Gpé>úÈqÄOéȃW"†U«HÅ)ŠKËÿAß÷ìÙS¡B sð ÄèÞ½»¢ÀŠÚibФiíËC{¦J•jß¾}2Þ¹öúõëW®\áÎÚ¦¡„¾˜B¨]¨‘ ÀT8}0P¬þÚµk\¾bÅŠ 2Ô¬YóĉR±AîÆ`p}qAoÙ0ÄÆaÆ 1ÄDï`MÐÁ£éúûþ¢°¢>¿C‘«¨Œ’ÈHõòÂðÂ… W©ReêÔ©ÚE1¦¼ŽÑiªÊ…¶ R¸sçNê©Å5í¸qã"##•P ¡úÑM‰¢Ý¸Ô¦ÆÒ9räˆÕ®]»ÛT6-FmCBB7n|þüù8|3¬U‘Æ Àë bê\©9U# êNÀ},Š‹mä—W€¥¿Tö×Öãæ#GŽ <ÕÇ+oœKËŠ„i¤NdV3­\tëÖÍDPéÓ§OØG3ŒÝ“ˆ@ªo¾ùFÙà¨È5eù通3gÎpPÛ è ÿZp¼‹/ž:uŠÖ“aB‡îÝ»WF7ÀaõêÕ¶OáÂ… ÇŽ£‘B„›Ô(…víÚ,Xp×®]U>Al+„W‚ #æ‡ÆïØ±£À|Ö¬Y± öÆQ7¿®õ&ø‹ùìéîìÆñ€uk²@ãüå-…1ÈOËÆ(‡m°H&¾G0œ u\ŸádðY˜?þ|ž t[ú{Š/&ݘG!RõïÒ¥K]ç嬅jÐ iôúðÃååH˘ױl™œ²Ï/,êqz)#K6¬2Túœø$qøà‰Ñ‰ökDÑÔ !¤[ ¥HƒÚž¯í&q(e¸4æ73ž{\:‘¹´$š®ÄþUVŸû[ÅŠ-è:8@/'à¼ôoBºÚ!àà·¼H+ØÆ?*Ø”'ƒö”}òÉ'æ gºéDå !ôSÈes¥°¢\·&õà˜t]¨õD-;js7O½53¬bÅ·lÙ¸aà®’w«‰¹^sœ •ÆâÊù¦ÐåùìÎýºqÿı57b'¨ÍÏçìu[R«¢îAíª9åp.ÝÁ™@¢”/_>yœò9gÎ5—â@ a,òWT²HEÿ©Q‹ç§Ä_GaHEQà>¾4hÐ@K½Ö€J9íæ/Xm¨æ²eËú:3;‚ ôrÐÂfä§òw|ýõ×;wæ/ž«¤¨ èóóº¹4£™E`:y# † ô¡¸!Å”aÐÞE¯})´>`(§ßêÕ«‹RÚZ¡ã;.\˜:u*ˆ6¼î^ï‹/º§®*·¥9K»冡t‚žËA›C°à>'(“.ÔÛfÁÁÁÕªUSgq9G„r~°JÒþn=“Nq¡›á§ð üEeRùËøñãÅöß}÷ÝE‹¹ &Ñà)Ê%Äwƒ!5_µj•Ü4¼1:ääl±‰xwí‚ÔhQe¥Ä`šps~Z"0½©MC© ›©S§¦wäu#}¡ùv­)ˆqó P™aÆYxpÍ4𠹇N“& Z; ùûË?ÝÖ²žÅMðnß¾­áÁiyóæåyw•YÓà ®Y2:‹6T¨;S[x/úHŠÝ¶Ïµ­ÛVéÌÒ¤I*ƒLâsi¹H|´á—± …FLêÍ›7¿{÷.†¤jU¯^=K¿b‘W°9žÑø[¶lÉ!Í^¹reF#Àk2 ¯[½zµApèÐ!Ób÷ïßÇ‚6ð@Ž?n$©Y¶l™IÇ7nÜ(&¯™ÿÁƒóhóô4XåG§Ž=Ê ÂC89:ݶ«ƒü“&MªZµ*Œ:gΜ ÀòòÅxP€E€˜&5¿½yófÃUùþiš]kŽšoç ¶Ï+ÐJW¯^U‚Eµ€&lº8pÀê¹|ù2*@!F###©! ±E‹´’è4Ÿ›îm~Æåür~‹-üuÂÙJzw´|‰ŽÈ”)SîܹwíÚåÆÄV:Z;qÄæ-((¨téÒ Î¥±òj×®+W.쩈ˆˆž={ò áÇ#Î=zôÐj7Ág¨^7—€t ñºûK+Vî–m¹ÌùbÒ €¨ð®®]»:TÚ°hÑ¢QQQ4;DIä­.\h³©\ĉPñÉÝÎ;‡ ¯áqà—}/½¶×_ä ÍA þ¦éb _øi.Ê(ß%JôîÝ[žÌ¨f°TYHRª!–%-¿½wïžÅ‚“Íž=ûãǹ¼B… òÔÏV­Z‰‹ò\>6l×ôø™3g¶mÛ¦u@^‡«š6mJûàh£÷´iÓì)zeÎA Á䮬(èrÛ3¼š5kÖ¨Q£vB9àáØ,¨9m«(‚\B7¹ë,šN—?¿;ÞhÿçÙ ›ü…Kh@çÎZø¦†6l€gÊ=RwS›uëÖñ.7öÅø>ÉC^LX—U™tš5kæÆÈzù¢˜-~Ô·Ûºu«k¼°ÈØä‰Æ‚/& ©rVÚÚ««#ö×XЏɕÖ;Œ|j§¤ø Ö Ϥé9ðFrµXÛ^»v­}ûöª¼N_$5I-4x\:Þ3!n.uS»à³^9E§ =-à³vŽ3˜ÅBÉpik›7o§"Ïœu„nÁÆÍ kñâÅ.ICØÌh€mË£;tè ä¹råŠþBXÖÞŒqjîNqà Óä°·oß>Lf½‹mŠd\iM»fÄÒå*&oê™3g*GÏ¥z·ýEž„DïÈ{6á‰üä5•:™¡‹Fм:À­hx>ºFÀH­ÜÖh‡#F\¿~¬^¾|yÍš5a#ð­íò¬†Ý³€¥´p"LÓJ<Ñ "^ŠJ¢Qî’VÇdðØì›-ê èA¶lÙŠ+¦•Ù„}7Ç>…Ÿ(©Šò"nh DC¹ 8>Kë*9ˆ%B*ˆ˜5u0Ÿ@èPšéB… )¬4„ÓVýP…tİaÑgÛ‰†?þ|øáóËGB騃Îf\­5”CÖ°ÝdœÛ*tÃöíÛìT^ùìrUHd X.r*Ò‹ Cî+V«€½ØT†ŠÄºmðÓ¾+ƒ¡ôÅ‹·lÙ"ÈÕÜ5ªÄåÏ.¯+VêMŒËÉÄ箬…XýÙ³gÕ>îJœt¨[m5/%€!0¨ì´óçÏ.\¸xñ⊻âóǸnÒ¤‰ðÓœHõ #GŽ sæÌilÓTžªºàèÑ£È{•*UP7´[ûŒq®=­¢ÐòuWÈKǯ@µ±N™­`}Ø¡Ê?R½zuZÖæhm×öpß¿î'²Ù§€Pxˆ •"óVž¨­Iv^¿~}µpùòåAÎÑŒ7# ‹É_ëA¦2TSâ\Â™ãÆ“Ÿ˜Â„nܸÑïvêÔÉÅjÕÍb¸¹ôè‘T›fW¬¨Ó5UÅÛY|?½Z€8XP\×B”Þ´*1u@ ñŽãÇ×Úb®\¹Þ{ï½@¤y šN UÒV.Hƽ—$¡ŠšZë›>ÿB3«GÞ›>ÿ6wÓ¨Çf“B §› ,('¥‡è;v ßÅ@$\AAAŠñU­_7Å¥‘åýû÷Ã[`­'Nœ ¯¯hÑGû¸5ÏiøŒ¼·iÓF±cÇÎ;qà€FÉ’%ëÕ«ç:b aX{B¹”Ržó`"ÔQ}zZXXØÊ•+—,YbkFp¶¢E‹ÒòuëÖU\;Luø?•÷Ðo4 ¶@*ìîÝ»y¥Óòù7¯ÙCÝ9dåÕ|£Ø¯²œ›Þ1Q T m:`À€¼yóò¼>Ü›ãª$z!ax—д°PZÚ¡wïÞâ•*U:xð Üű/@¸Õ&¹O™2eйt´NS W³E[Õ&tMPpùüùó“Íš5ƒÕë&æT¬vÃâ­±žÖ¬Y#Õéù·… 2CCCc;ßÌÌ¿üå/¼fXXØ»ï¾;iÒ$Íó›;wÀUœé.­Ò€¼fÀÜ©èq°ã&V£Â¨ozA®PðCÐ@RœÔ09ñ¹´JÔ\42Á)A€H@µ¦nñ"<.ýòeÆŒXéÒ¥£aù²hÑ"°Eã\Ò!“Ÿf†KKBª]0wÕ œºeŠŒÞ¡û\Unþíº3xÂS t(„Y½i–Ô™3g‘sçÎ!q€!Ø‹ŠÒó õë×ó¯:‚>¬ÍÂô¢„Lùb6YsV6òŽ(T¨²2%B1o1D»ÿþ ”;ºbJ`PC Á.¸¨ïýû÷i :·oß¾tÜ Õ¿ÜÀQ4!í ÷ßõCž8öÒ¼@%·â'ü xäÈpÉâc_+*õÅœ9s´nEe†®ùU™Þ¼õ¼yó\jălÞ˜w ÿŸþ"„ å £#°eåΖ‹ÈŠ+®]»†Ž/(¨­º95¶½‡´ãVDZÎêØ ¦ƒørüøq½¾¶Ï` Ìœ9L?~|ݺuçÎËANSÄTÐ^~/šë«G¤$K—.åM¥>øùÁ¤J•Šúª+¤·Uk`F}öÙg¼Ô§Ÿ~jX´;ž; é5jÔ`dË–­bÅŠ³fÍÒ6ùß;5'fÛ̇JK*5^lë)úB=Qg;vì`ÂçÕA2Öž§I6ą́` !¿ÔÙ²e´§­Ûº9èãàc¾˜Ü1˜*T•éÑ£G·nÝ´R–ÔIŸK+]¬¥aÂ>Ö¨@êÔ©µŽÀ`Î;7¨Mcz\:Å6 !Ëòˆ6[kT[³µ4¶aÃÛ<^7ŽÑ« Sq³2}õÕWHŸMP+i¬\/À @)ŽÐ®]»àÆ B…Áðš@ňsÆ ©áìÙ³¹àuµð¨©ú‚Ê@2òFËŸ?¿ÅÃAܨ³NPM8'88XV²-ç;V–C°Îuÿ»è/¦¦/^̵7«:&(/ïŵœ,_+§ÒkÏih¼™ÿè8~j&áñãÇׯ_ç»Ùû0Õ;wÒþ¼¾uïÕ¤IÌ?Ÿ¤ÚòTúüqDµË,{öìÕ\¸-ÿ“d×7y”°°0­k0¤–KÓéˆ|½zõ´ê Ðú²§£ÍA ¥/ü£piè ¦k¥J•´$Ä‹(žÛë.¼$ª ͸qã†.Hšü4w°B‘Ä rñdÉò¦+W®"»'Ä 2¹iÓ&‘ÆÆÄÓþešôÿò¹q0Ž˜xT•ŠvÇãËvSrsF»Ô ­jZŒÄzeœ·mÛÖÍ[ѤwÀv Ž@fÐ(¦ È µˆ‹ É¥e1ù8ø¡í“eŒÑÅnŽc?•pùÁ¥­ÓÏ.]º0<@9:×õª¢ãÊ•+‡!É’ùÂxƒÉ•KkAË[fG(¶¼­ª¡fÆ Í›7Ö¦{P‘3±ôQrZS›ò®Ñ}Nû‹F/Ñ “®G0ÌÀãö«V­R¸QÝ ˆ >tòR!#è«?h‰ýðÃõ“Jrs-s+…ú”ÃÆæÍ›u¦ü"´"©|Œm m§ÅŸÔNÔ€* É»ó¦C 0(Ä®ÃÂÂP£@±.—L‰í¹ã†¼¯Öµ0 ™”·3êƒw”'Œ†‡r*¨’3gΠ¼$ƒtÙÊ•+eQyᡦbԼ๠;#Ò¤IÊ~N¹zõêìÙ³§L™»¦I5{¯7fó‰69~ü¸*söìY”¦;Cȃ´ iV*ÆU:š‰’C Eþ§¶tœfo0c©ØóQ;äNƒ„õv[׎ðÊ—KËcN-²ËŠgD Œ Eƒ ¤a“`L<‹•˜P0˜5ï7kÖ¬iÓ¦«x´õÔmiS§NÍñ××E"ÀÓy–Z’RªT©yóæÑ\@Ü®]»dcj?õ˜1c, •©4O«§@]ÕbÅŠq“¨¨(¾ßºuKsM`ìÔ©SmB@3xÈ£¤Þ]éã¡ÀÒZ$„¨„¸*ÏO‡[ ´ÃZÛ«â?\«¹ ‘ê‹/š×„¦¿ ‘rðã×rš|çøÂO5Ò^EùœÈHç „–[‰ÑM(,ÅYRz¸´äôR ¥¤œÚµk×4™¬)åäˆÒ‚ wl2ŸGôéÓö+ç@Íip²²Ÿ‹ƒ ±ˆ®Ô%ÇPžÂàá4Ä"9–¹§ˆ.úE3!]»vUŠv.¡ƒ4½¯°«TŒê)Ò…œR98­§Èíyóæ¥SäIºÒ×\ƒ!·ýŒ.OÞVŠJ-þ싉ªªàTæØì.q*ÚZæ7÷ÞïâÝ'L˜æÐø¶‹ÖÍtc¬[ºYËž=;Ã~òäÉØ´ ìÑFÂ8žèš‡ªµeÀÐÈpò‘#Gj%]ž tbbÎN¼ŽÍnÅoÖÅ+V¤žX»æÛo{ dÙý®¸UoÄÇÃ4¾Æ2+”+µº iÕÔ¢Ì3Êçd{I–\Zƒ÷ÕÜ…ÂÛž>£‚#kŠônQ}7n¬µ°FDW‡Z4ñF_Œ•ÏIæ«ÐO ËoÆŽý4ñq¨®^½Z»{#³^åò,ƒáŠïÊè•]t˜më¦èÒº'绹 ]ÿyÑBÙ°æáƒâ±ÿæ 7›G²Ü©ÏãjvñO-†ºâðSu3° d!žæ ´ŽÀ ^äY[|ÞÝ‘% èСƒp½iÓ&ÜŒ3°Y€q öZµj•/_~þüùJ¤h—??ù ®·^SÍ©šZ1U”!Ó^M-cÁ÷¯{a,\’íïöʈK¯_¿X†$>H«ÖRA ìSþÊœ9³´pÆÁH(.mÃ^ I<ÀR–,Y¿°hlO`G! ~o¡†rNÀ‚†ÚÉ- »Ã ƒã5mÚÔ0gÍš5@'¸n@™4¸âÒ dlIÝb Kû·oßmÈã4±‹æ¶Â1C†K”¢Å¦øìZ'ÒÈ‘S±’¶ÀC,ù 5©õ)µ¢ ¡v å¡)\ƒGj"îFSh£“ÞH•¯…ýT=€òôÅ8Þ‹ëBn¥dhèV<]þu|M)R´ùcp7[NUn)ÙõTÞ6ƒÃØLñ1éPÚ_sG2¾D¢Ô2îb¥a²öÙÓªßgÏžZ·nÝÒ¥K«»a˜KˆgPPPΜ9³dÉÒ»woÌ.›µÐ¨Ý ù:}ú´Eqo×®;è;nh^ ºüyß*)AÍfXÌ:å%Ôܵ B¦-yùòe­øÇ-’–/ŒïH âߥK›Ó³ŒnÒYFÊëD#hw-jáÂ…–oÑvµÇa ÛF`i=nBß™”uêÔIhØqðÔŽal!ùUÇaMØ*pëÖ­]-)'dmtJÊ\Ú^V éÒ¥ÃÞQ8n—Šh&ÂiŒ.~M^.IŠK+•ªVÓí1ሠµqZd°J•*–ÚFÓŠ¿qãFA.—?ð×_M#s­¦ ÅåøÂOó}bcüòi.»wï6‰‘V­Ze ÷ôѬY³T ÈQ&PJëAà!ï²xñbË""ƒ¿xe”ÈòåË-ò?c€Ÿš ל|dd$À"©a0ìÛ·ODWâ)o4IÿÊ“P×2º *$o|í[Q’),²ÚkÞWȬ69wî\TT”‰Ož«™±zþEºå[N—Ñ>˜9 î /µ` 9…^Э#–¡åø}ḱ^J©ÝQqéÒ%Ó¨rZ˹K4IeáÙUúöí«¶â-x#˜ƒ$îË/¿4}-gW$…Q%½#(*ίûؼï+U¨ióf5h&Êc¿,.½wï^$æ)½Æýµh®A‚Ž`x`, žÏ†öƹtÀ“£ÚÓ6N"õÿ{wú´oYx~:Ë$¦3Ѩ¨ˆKdSVQ5È*û" ²ƒ²) *JE–(‹ à}*"Šb\Ò&“‰qèJ'“îÎÔLÕLÕ¼éy3À3Ÿz¾õ;êê‡%IWr½xê~îûºÎë<óØÏc9î8†üt|Ն€›l²ÉÎ;ï\8¢1 À~ì±ÇJÁp<ðÀ™Ò7¿ùÍê¿ÅvR¶o¿ýö’‹/¾ø#ùȤ¢àÀ£ê£©Ï}îs•¦ï›8m¬ ÍЮ}ï{ßÃH …Ì{‘_óHT)¸á«—^z)æTp̤¸Y,åK_úÒg?ûÙ§½”èðÁèx૯¾zâœMl·Ývû/«µdà 7¼öÚk»³ê|®óBÑvÚiY¤È¿ƒ·¤ƒõŽ?ve}F¼§œÔüã˜óI Ýn»íFS*»óÇ@á{ÜêÒöØcå1wŠô\€3ÙßK’­wêAß{z$¯yYúdgµfŠ .c*âH“CÑ» Ê¶Ûn›¥Ùe±jM­'UÉ–7ØPê4j:òÈ#Ë™m£™0†=è ƒ¦xÂ?¥øvçJV·ÕV[1ÊÎ>ûì-·Üòå/¹¥=Ñaþ éÿ宬V9Ûwß}AO‹Q/ÙàYg•zð/M—,Z¢ S”®ËP ŸË“½ð Ç7¸lÿ=¨w¦íñh“sÒÿN¦6áˆ[ú˜Lì1Nit7Þxc”žE9ÌSÊš¦RW*îäü’þÖ„ñ"`e}&#ÍsBsíb&1ý¶Ü|ÕUW½ç=ïÁ”Œ?•:r•ø©¨!#ãö‰!rm×]wõy›m¶1ÂTLBD±ÇFx*]:å¡Ê¨ Y8 5Ä+¦g’éŸÿüçæé{x ¶•Ü7 ÷Ð¥'¨¦·¯éÌ2¥ ï-™à%(ÿ)”M`Ù#Êóe—]vÓM7Yiga>¯{ÝëBì¾ð…¸‡;ì°‹ þùé’øu4þüÿ‘Úÿ4g@vmlŸæ_Ñÿ½ëÒð¼è15zÊ)§Lºž²ÿ|téåÙYÜòðÃÿêW¿Z鳨øÃþpIîÏn#c¤t"Øøo{ÛÛè?dýå—_þŠ+®À“'À ã§åѪ…ÔD²–ìÙ˜±'ñ ã6ùcq§ž%:!‹Ð:ì‹?”‘÷TºtKÿÞ›}*¼¹î¾ûîªö-ëù4òòse5æ9Jß3ßiQÓó ³]–;[2æCNgKxÅ*cqYè5d,Úí¶Ûn| ­òsø_W¯ûšÏ¬¨PRl›Ô1w~iWkn"¹yÜGIæ°ªºï¸&ˆ‰N‡ç›+¯¼’4ÜxãÉ©=÷Ü“í@só,ýœž[†9h‹*¹Ïgfš ¸YX£kW+öñ…v›½z ‘ÕèWÌ% xú¨`KŽ«{ûÌTA›P(OvÔéR–VEºÌŠ¡A”œwÞypêâ'Gÿ£Í A¸î‡Kë•%÷kï|`<¦{ŒþQ~h¶ð'¿Ÿa²Ï‰ñÝ-ïüg®K§ÿ õ«¿ú«ø6ým'›uà 70âÊ2ø—ãñÄËÚ)i€33ÌAÆçtÎ%3¤>Åëå æÐÉNh–%î†ÿcõÊË=ýµ§Žzú^&- *œlê‚VŒ.ò4;8'’˜Ã¯ýÚ¯-“Ú<^  ¡5 ¹U¼öµ¯­âÊ"|ŠŽFÈD²Æ‘žÖX¢+Õ ;ï¼s5ÿ'ðþÔ¬Š:Íöë7V/JIGÝÍ~ŸR ´l¶&Æc±0‘ÖDMŒ†ÙAáÊúέÖXJTz¸¦×êÊ¢hI…Ò­¬¯”òþÃJ_z1#Û©ûžF:lʶ®¬¯ä9vG²f2CgLš60zÑ6ÛlC6åçYѵðÚS®‰7 ¯÷Cû<˜3–æLµ3Éîñ÷¬³ÎªŸNÓë, “Ÿ¨Óöq<íéá•vqm¹å–FóÍlàKbkšÚ<üðí«òË&¶¦nÉÊú\ï­JI*q7xöo|£Ÿ¾œæ¬t¾„ÑV[mUîçÒ/šÜdÂ÷öÛo¿îºë*„UÎBy3ç•'4~¢9\·÷‘kP1[xÉp UìÇùçŸ?æRúÌÓÔ¿ Ìà ß8dާÓ=&à短.m¥ãK·¨JXÑ`{íµ—u%ñ÷Ùgsø˜{÷¨‹5 ÄInºé¦N8aÿý÷¯¬¢ëÀŒ/Quî¿ÿþ4+z^©àI²õž{îÉëˆõ1â;ì°p¾#ø;W¯˜/Ýé6[SI V6ó¹ Þ…:ŠÄ®aÇW¿úÕï~÷»Õbr’&kÀÈ82H¥{®¸â Ê[d[pugau©&ï0ó‚â hæ…0ñoûÛ%È{õ?üÃ?¬[·®ÖlnËmR@K%þ0œŠK¬¬–¸ÿüç?¿ÝvÛåg£1bPMaNÓ¦Ò— á³ç=UîaÞÚ–é-§Ÿ~úÐõ×¾ö5ó}žâ£Ö Á^üÏ«—µ” ãÚi§ÌŸL.»­$Í œ &›5†Ãæ›oîÎcþôOÿ´"-¦í_¿b\žRÿê¯þʆŽÇ æ€m>.<x/¹ä3)YÑ~ûígž§v~B…žDòƒ:(§Êf›m–Ÿ„Õ÷€z‹-¶øÀ>€Ã²å-­†éØm"QÂkêþëõß‘.oØq¢Ÿ¹á†¼ëœsÎ9÷Üsßüæ7ÁØÈ³Û=üY×¥s¶üÙŸýiâñ7½éM(te}ƒ¿©VÉž{îù Î Ø]8 2ÏæŸÎ<Åmhìi•i5çw^z8&éKì1bzÉ›]Ÿÿüç‡~x–›7€NqÅTépæÐùWaø¶Ë{ÒÜÃ\¸%yQ°YN]üùë¿þk¿–Ø‚¢³DN:é¤xÀëþôy,eüÛ1 ³4FïXÐ5úÆ™sûêµ²¾ê²Ô{1Ir/Z#~åíÐ/?R‰66¢Ê$[@ÃfÇŸ` ŠAÊÊ0ahLá/€­3µ!œ^¦^Ù”³hÜ]tQv{p{U,_í½ u衇"™ë¯¿ÞаYæHßwß}+Í‘Óû'?ù ŽM%wL†Bx×]w…H»îº+£léú˜ƒE Ù~yæ™ý»á†’¼`òŽw¼2ÐÏ`âÏ‹¼´›1{ÓNÁÁ+vÜqǼëO…磙O*ŸÙz6CfètŠx¬¬æ³Cé—½ìetu¸,GÄÉ^ëøà©Þ›57“@<òÈ#ó±/Õû¶ãøã'3ëæù4þäÒ0Éâó¸¦ ¡ äÕ÷þÙêÒmw%|ƒ0 ·.숤.ölï½÷fþLžQ5ñ°2„L„ù‹›Ñ÷ É+í‚1Kéµ ÙÂçqk ¢Žùê!2)«ãm˜«ß믴šjJx°\©Sþ4ÿ†q0Ûl‹ë(@ ËK“%žid89} (oírôâ{dî]‘ƒ/—MHKNYs ‘Üb†*¬{–áR^ZÁÄûUŸÊµõÖ[g‘EYéáŸX¯—vOºwñÆb]ÖýØ#‰V1–ŠZwÂÛ¯“²¼¦–`iõ³YË…/ e,øÃ$z–ub‡Y íÕ…1/OÌS¶ äïÀáÒK/µMh³£´,¶ÉüchYõ<ßÔf/:ñÄá-¤}Z3ÿ«.ýÜéÒ+«5þ‡'»6Úh£A¡g·>ó³¥KgÄùpß}÷•ý”eºÆUUÃäsýBü™n‰(jÀ»coÒTQî&Fñ¨øg%£#ÀŒ\*™Ð…oM\ëøHÑõòÜ™iãEhÄL®ÀæR>ó45ñú˰<Þ tóÍ»Þõ.«cqO½¾Çî&¸Ë+èNfeÂuβðqvùàß§‘§øÿü °œÕå˜:umƒ 6`J‹Ø8ø›üØtiÅVçñqt›O ­d E &\ ›;—E_ó£3ÍÇL–ÑMþVæu?÷®öºàjcn³Í6¸%í½Nä¿í¶Û†·7Îäþç,¨Û7õ§0SÚ3c©d7Ú1ǃޟU5Èï¶Ûn\pïMrB”¨vŠúЇ®»îºÊJÃCˆê§JÛ=_zÎÈ4¬½i¿â¯ÀùS9 l¼UL¼QÈ!*h@cRêŠTy]lmë ⥠sœ~' K}`D,Gs†ÿSN—rè]vÙe@šBÂ$‰ GMúg^Ç£‚fqÎa‰1¨³Ï>"±ì _q_6"{ö©zVþòW}HM&8Ô”'ã®ò …¢ Ö=1¨f8 [Œ’!gZHd;'_ñüâT1½~ðƒ^xáä£j3ÕÈn–\6Ñû!ŒŸ–E>øàT´3y6&X†ëÍ”V\¬þD)|ë[ßlœ:ó+ë˨þÅ_ü…ÉÙý¡Ù”Ýð%:mn›l²É¹çžïÝsÏ=“³“H²¤ÍÜ þð‡“¥û•d±®`E“j;’†OV³s(gHóLŸ¿é¦›šaŽñú_çèþÀ>Ð9Ü4ñ–NvÚDƒ²˜yêÏþìϾÿýïO2ȺuëJêo¾ùæé}ÐáižbØ:«ÍRάÚœŒ…rðƒ|)öI½¸÷šèÄ%äùOÿé?!™áiSE0TÁ¾&øÐP?Y½Æíðè£Z£µäÜþÙÏ~fÇ‹ôìŸüÉŸ¤Ûƒü¿ÿ÷ÿþcû2~þóŸÓs&G»+«ª<Í4í‰oÜpà O9唫¯¾º¹e–±[³RôB(¿í†º€-}ƒ–è´£pÔš]Ó…]eåŒ|O™¸£è´Šè¡PÞ˱Îf׌O¬x°‚]#‹öœÁ5ÉÍ št¹,¬I@h¹w–õ՛à ”ÕOÐÃÈd.2§eoy¶øá,·¡³ýO«yAE) µe‰†çT—öjò~Zf¾‚ñpšÃ”d¬ro³²GwÝuW•Äè¡S ­Ü´¶òàƒ¶´£Ž:jºMµü±vÝéÕçw^AP49‚ÿW/8ÿ’—¼ä·û·÷w×T§/aS2gÂ)å%F2ì›ü«e‹¤<›0ût/…§9Ï–RÌÞò–·Üyç××¾ö5˜‰ùÀô‹áOì4:¥V…3Ãòo½õÖAWœ™:Zlp†*£od&€ó¸9gq¸Ù÷Þ‚?WEªGL-”^Gü=òÈ#‘¾ ±;ËkV €{—èñïà}éK_ZY”ù*1Ú'L÷Úk/Ú€§Éÿà?Hœ%»!êp?üЉ‘‡<¶ V#¾1Ã3ÏùdÀO9‡6Ëbà`uØa‡ÅßZ…YÕÆ×ã᳟ýì’ÿ/«×ü«¤ÎÝþûïïß©IÛÑF·%ÓéH^ÔæFÛd\Tÿc?äCjh'ñçøðñÇ¿²šVœég³^´zÙY{Dä-›ÑTµØ•EÆò­HülÖ8a¬w¿ûݯ|å+Q\.¸*iGn¦ZªE:|Èdàp{çþ'–θãŽ;rÎ/ÛЯ¹P=Ú=X1–£ “Åcm½a,VÍ`9öØc“¹ÌÌèšÞ'ÍÊ™X–Γ& 4uý òÏ›.Ô˜%cŸûÜç°,¬;ÅǨhêÓs­K× jeµéÛ¿ù7ÿf:kàd áàV^œdª ç2*ö‰/J9Ï!píêuûí·ÃX|oThèíó ^ð‚ÓN; Kœ >|á _W-††­Mã*èj4¼.¼¥Ñ³ÂkU†ç¾,}µSÅåÄbbáÛ·¿ým”å6pÀ¥-°ó¸µiPûÛ3'^7Úh£ßú­ßbr"ÏJÙSª?ùÉOŽÒëícÕ×\sñc¾ùË¿üËdi›žÁ„CxìèÖ =†Ízu½ -ð­o}«WcbiSÈÇ­hH²Ì‘¥7±—)C1v ¼m¢AL#A`gýÅdpæô1¢Ã‡µÚ…q ùÒ«MÕSn‰›¥Æ¿õ^±dS eOaûã?þcŠë’ùŒßÀ¯&9J{íÉ&”+H>ôÐCóÈä¡»ÓK‘˜YØ“IÞ‰OJ1]4¬ÇAì,w2@BÿvL.Ê„Ñèx¾ùÆ7¾á6ø0§HZú˜y‡)u4˜yÀ|á _H,¦fãÌo{ÛÛ.½ôRK˜^ Í m¥~¤Ì—£ÝùÝ4^j€“šºd5¦ÿòñ›^5£@ L¥•õIîk~'MÆ å@-ÀÙAÍgé·ôÈgcç†Óã8ŸÞÊú~m9'§¼›¥ëµ§e<$üGzÔéç(ÙFѸHpˆž\rÉ%^º<ôì§çZ—þõ_ÿõÏþóOã&‡U5åÊ2¨—îÖ[oáGà`¾,Yƒ£â]ŒñÇ hJ˜CG½¤áä¸Ö½óÎ;ãx`ò‡ø‡¦™3 x„ cõ7Y') éêø3*6½úœ^xá…ù(2¢©FlØ•õuœà|>íZ–hP§?òŸ6õëFÝbªA €¸Í+’ÅAµô ”ŒÁ¢+³—Ëü¿ŸÇ—.ˆ-·Ü²Ü5M,r|˜ÑíײŸ­ô®¢«RhiwâxVÍjðˆÛh¹¸%‘™×"ÜS÷azTyE<¤VÔ–ãßZœ¬¬oÞ±²>/µC½5¥$Ö( ¥þ-B!ðÁ)´IóÁ ‰Âêý;²ük"+ú7'U\½”±Ñšû'‘'į¶ÛöYÈx¢j Ÿ_úÙ/2n³Í6wo·ÝvKFÐ'>ñ ºˆ"„uï´ÓNïxÇ;:è  .¸ È`þ”üº úPj¬Ï–¹¹îú¸F4½Âw—ܲ`sä ª#7ßÿþ÷÷Þ{oX:ºqƒÌ³¯ýë™Zî4¥åÆåBLî“\ñs/¢^Uao&” ³6ÝtSZôÀ0ͧ±N‹â6¥AÍœGK|þc<æ‚lŠÍßøÆ‰e¾½úÕ¯Ž;¯Ïµ.=—iÐ;»™ò2„'}uÊv'5Ëø¢È­¼¹Ø#d8á„à!ůp¯Âž)W´ª/õ FÃÉ—"#š]ÆtMD¤¥ÚÕjªêUл ¦Ù‰ïŽ=2’/¢ N}H(¥76K<¥­W•jß LtGúÌg>Ó7©7©mÕ¯¿}>7S:ï¼óH¥Ã?¼bѬçËøô܆êʺ<¸YVß2 ¹UàÔœ½qbtǽ<ú^Ã.«å ,]3fO:é$¯6U ÃOF½I<­¬Ï)N01š°ÉäÀC~øÃþï«—ñ« …h˜¹ñ“åNªd-_ÿú×––ó9ÇÅ„rÅÌ}ãES‚5&Sö€‹(‚=ŸjÀÀh’•‡*¢žÙdr¥úwäll*áÞ¿<ðÀ¼ÈL˜6õ%­¬â{¹ ¦â´SŸÞ Ï=÷к‹ö™cz Š@¸:•{Ï=÷¼âŠ+ट&¬}®C=”°FDô ÐûÀ>€uøÃ¾ÿþû±ˆ»îº‹öİœ•õ¹·&<Íè#\BÔq2¸1‚ù<ÅÀÆMÆY÷¯ \šÏEÅGЃ´LÈzª³ù<ú w–i& $D pѳOñøÌ.ˆqÝu×½lõä)AO;ÍÍÚOßmáÙÕ¥\äi’«´ÁÚ  µ*[E–½îu¯3ÿã`B;ŒÇ›lÜt„P s0ôŽÉw ñ¼Ž}G·l@€·¿ýÛ¿KŪvôrï:2Io·L+ …¬ÂP“'¾²Z¢3÷|p±˜4~RìÍŽ;îØ#ã©æ›‰¥-¤ÞvÛmv*àxµÑ¼ $cãT‹à#ýÎw¾cÕSøÂÍ80’?çœs,L~y¬óðã©ÆñF`™5¼Âa€ìÔY£Y¥àý¯«—‘azÚTªGài†Â.ìQì7aä©äZ{Tè`˜` Ìmœœ5b˜‚Ûéÿx ¥Ë犬œê¤‘¼ˆÎ͖߃… ÊU܇\©Zùž^PD!U” ÐÁ™ýèGí>Åxâ =뛡 üëKpðÁþv¦ìû›o¾ùCúE×BJ©Š/&s³|¨`hÎ¥å+0™é±›‡Ð’mz…½ëG?úQ!ˆVæ6ñôÓO¿üòË)ÏC¾øÅ/†Ø{ì±û±Ô×)H8Ÿ_ûÚ×á裞Ÿ0vØÂꤿ}ë[ß‚2ÖÕ!2eÏNUûz¬ ðY“g „rÅÁ®¾úê0³Z÷y*·ŒjÝÉѱÇ;¼zMð€mD¥­(Å Sn‚F&JsŒ¸è®½:Aü£Ó)›j÷¼éÒ³|;H"T†F=þ=(qæ™gæ%~ûÛßþ¼éÒ¯zÕ«’cø,_¦ZÅ!“ü dEPsÿºuëªc-»í¶Ûä š3YòjšÃ;ßùNh–”/§£°|ãàØÈÖ–U‡þC²ÍãKÒâT>G›x îŠcÔõ©KfØ)' ÈéùH~© žxâ‰Yd/Ójð–I%ÃÓ*OûýéOjƒ~ÿ÷ÿ¦›nÂü;o Ç:Ñö:óïüݯÕÎòeD‡@PVê(FQ›ª­Êß{A8ø”Fmp2DgZ7ÌìÕÅ–L£ÛÜ)ÅE›˜®B%°„#úhé-K§úùçŸKÏ>ûì%Vøid&‰~#üùê5\ø£à…Ÿ5Cô½ ¯ÉóëuÎlÝÙì‘…LêS|¸3‘„Ô0í 3qn-|©äæZ“ÛKpd<w4ŽY&6QøáøÝï~7îúº×½n=öˆZ3ŠçJI>ðÀÍÍ+Øb(ôo|ã)§œ‚Žè~©ë)çÈ ‚í°Ã¬`@>è ƒ˜ó¾Ç®­‘y‹W“ÅðpräÓ¨‹Q4 §n¼ñF&¹uUKŽô«óÌÓhE1ŠÏ}îskÖô"´‘Yµzo(²àùÔ¥ç(ÖŽ´êÞ;ys!ö…+úõyðK§ät(c×@þôÓO/ãoà 7üò—¿ €„cñEkŽ9l:-’ì[n¹¥ µÅ<ð³ô¼óΛ‚?Uœê¸Õñm¬þ´ÓN#éb¹oûÛ=âp@¸Aè',°”ßÿýß°Âó).qÑêåƒ}ii ë>ø`yj>0áÈ#D˜¹ÈÀü3Ÿù yD©8óÌ31Ìj†3äŸu®[¦álrVgÚDÓî×L?}™EÛo¿=˜|ñ‹_<묳¶Øb ÿž{î¹0 [@\—SÄtš«aÁG>ò‘þµ#\pëoë[ßš‡Ø‘ ™KÓÊz#}`â L‰Yô­o}kªNa¼ökt¤òe -2ìEÔªrúF»ˆœÝišF Ò9çœÓ*&ÒBEx›•íKl~¤xØU;S"› ! !•Ød iEs‘áW¸tþ^£ab4Þ ¦aJ×\sÍÿ³þZY-¬”Ü1Bå=óÁzÐ7ËCuF É/ð·LŸÃ;¬XÄØEúZcªDï) ¿zùàߥµˆ¬–±FNEÁ¦,»\ÚÎ`ã €÷sÌ1íãž{î9›’‹¾SÅh/UGÿ⇹|°Ù51|>g¤ ­= ÚȹèÇ$qÀiCOÀs Anþ­Áo~ó›šo€ëÞÕ«/¾ÜxãÑûkW/ï%h¨Ž´2¼Î$­=.¡Œp•9ˆÃ&#u „êX´ùƒ>ˆ †Eüä'?yÛÛÞ¶lzHõuO<œU»p¹Ú=´ãÓæ²LR/V CjWÔaÍùÌ.ÜsÏ=•òî²(”»P4zvHÛŽ¸™Œ°Ý!†/š;¿ûÝï"UÈé›qršæ_wævÿ„N°MxfÜ)7¼%ËÌÿ-oy åyÙf¢“¤a½ìn¿B Ì:]¶zÕÑì†n eÑð[0©%(,½í¶Ûa¿ÃÃuëÖá-PÑYçóYÇ#\µ_•Ùìœ}2 c§”4º4aô<èÒEæÁøßøM6Ù$êÈ÷ˆ¥ ã„Ø. Chkh*qóÄÖùfJ¨UByyàۙù;¾âZæuz¦y5« ùäEtÃßBB-¾í¥Ë’æ9RŠûŠÉcnÐ ¹'×L~ö½U¤šáM7Ý—ÐÑh5<¿hÊ Z^“‘”DÀüÁv’Ñ\›o¾ùVOôKÇ:&B{ÙYyÌÓ.zè¡Guø`ÎùŽÖL @âü?MSl jµÝtû"iׄÂâHj³EYÄ Æ>ßXÈ»Þõ.Ó?ÀdúŸOi£6ZöeHÁó%I÷o|ƒ,(@ñu¯{2™R3J¿÷½ï%ð"ˆú›¿ù›»ï¾{A,›nºés‘{èílå‰vyp>³, ¢f\<}³žg+ƃþ‰o€LîŽtfÒ/"³Î^{íUž üt饗浰wM´RfvÙ¦>Ø‚?2/¯>°¥XÍm¶ÙÆ8c5Œûze}¯„¶ÀFã!fÒ m$ÈðÇ#¬CöfRy¥R¢ÖI °4³ô¼óÎc@ÑìÑ0êR{–' ÍaY ï‰,hÙ cùëäŒL‰†í¶Ûða»‰U›z8ÛDy•—$¹tYLטev@½êÓ»„Ïîî6ƒSùÖøfA9´Ìetk¼¨PùòjbœYvЏ\àRÞMrГ¢èš,†r"lÇl°dkB }MìVá4KÇuY6k^‘c³µWx6ód¼ ñ´~¦ÒËDqŒŒ ò–„Šq­=öØÃø„~¸ÑS±ÓáºÓx%Øö$«Œ6Rƒq¹ù‡?üá,3¸Ä¬š Š3ÕÔc›Õ«ã¢E¤,±®$…Z·—¤3½Ë—ÇúóHž™ø‡`,~&O07g†IêÜADU`zÃ@¦ÒÄRjˆY8n³Ùf›U$|Ž]ãÀèîØc­2áÖ[oÍ.¦uSiÑsìõ¼éÒmÍpæ""Ìœ$bÄ:ÄyÕ«^õ<Äx„~x¶ P—_~9ʵva¿FèC®s}èÊTêœkb&mhÕ¿C¶b0J9GÈã©^£Øt¬ùÀÌnn»í¶ÀÅ`ÏÓµ²hÂ5}½£áiEwøfúpAQO•Qëb°D;©ß ïC^˜ÿtHaÌvØ}öÙgO1½eíôÒKyXr•|ãý˨Thã@<î,¼^ …8@ŠY¯˜Þk²Ñ]Tüœi@£f`R§«°7üdje¤MÍVf_DT ÷¿ÿýKY³¬'¿ Xe«·áÞèˆAZ+ÃŠ×*WtZ@Õ·ÓLÏ2f—íH‹uOE;›H,*»0›¥¸lS¿;kC\gžy&Ãù+_ùÊG/Z'¶²¾Cî˜áôPë-f[¹•š²…6Se”ù4ÕéÌÐ I·¥6Ò©Ä’²:¥]¯8”ƵL+Ë…2ÖvW_â©jâ-É68· OUo ¢±cìaìR÷³Ø¥:‘ŽÔq¹›‰Åï~÷»_]½ªa5æ3Z3óÂøÏ9çœ)î´²¾)[ÿ9k‹I»ß~û•ƒ¿,AðlÅK‡‡sÕJ«&AÇ“Q\¶ÞÓÔ§}¶téq8qÄïyÏ{Ž;î8Ë'jרñwÜq®âÎik ²šÂõ5ƒ +ÂÛz¤¾ò•¯$LY¼DYÛo¿}ŠbÇ“Ðá¯oª*ßláª_™ÀÌ(R{ ®£EÔ£Ž[o½•g‰4‡|8˺ñ L+ÅrÖøŸÿó~Å+^1Ù8‰û—ÅSÎ'6 (¦•a‘W³CùN¾J—N™)®£TúÂwgsË;»í¶ÛÚÔ[(²K/ʱӫ$à2œžçg(-wúíVõtM©aà--£Æ;\[Óe”R~rIM)­eê¢; 8'¿ÝCÄ{¶jEK#"k%f2îâáüý[d]¥Ûb¶æegŠq°°>(l±ý ÏIÞïð.Åczå´ƒU}衇FŒÒ{ öÈ%’o¡~gýóäéáªÚg=|;ë'|GW'‚LÓ(A)ð¡œs®@ñÈš28¦c`ÁÉýôÞ©›¶Ð þüÏÿ|¢Å̹:9§Ÿ~:½×î@•Ô¤6èŠ+®(¶ðæ›o>ÿüóTåÝRQ0%£åqõ`}ŽTÜ5m¤ÂÓ;õÔS‘óÅ_L㪊xt}ÕUW±pAuË-·¤Kð‹_ü¢/½åšk®©„ O@“¤ýèGi†¬ïX"^azôó—¼ä%F¸ýöÛs>oºôãVD¦}ôчZæ@ÄL úV[m5*ÿéW´<Æ[’ËK¯ÝS®ÀÖ%ÚœúBs?àCŒSN9eúJc¿ù§&a•øÉ4ñ42n_ÄBLlã7¦¾mî½÷Þ£˜ݸ¦Ø©Lm´‘}ÔJ¿*&¿¢NU ­‰ÊÔ~yÅ[l±²è¡àWÈ‘>ø É›ðDübìV]Iÿw½ë]e…G¤†½à‚ pc#ßÿýSx$Š€äï{ßûÙ7·¬^Å㡎Òx‡­jŸ}öé3:ª÷·Òv®¿þúuëÖNhQð0s†¢Õ¸ˆÏ;AJ#ë·„3Jw0Z–ô7Þˆ:¦CMþ¬³Î*u±¢‚DÆÉ'Ÿ@b‚EY(…®Ñ¬—vÊIǨ‹@ã±Ö|5>TÑ4Ýãïþîï(Sv1«Dw"j¡ý¨E 5އ©ú)™^tÐÁ§ÍÜÀxö³Ÿeƒ/s7L´Ï8ã ÓÚ«ÑÚ‚"X™oVíužZv‚°õÌö~Üæ4‡Lßyåã?î†÷¾÷½µþéY|lªÇø‹Ê>äh7UE*ä7UøOU…Ƙnþú׿náëWÛ1-àËÈ#Ö'vݳ¤I/…œvÛ´•†BÂHƒMÚ©z•1{ì±F} ')·™“n¦HÀ¥Ô3÷C•´K6Ú_üÅ_cG`bCþE¤ÄÇŒì×÷ïþ]aQ–àEÆ|ä‘Gе/_þò—I„ÀǬn=öðMCÝsÏ=8¹§°ôö×{‰Èg1n¹cßÐ Lf%VpüñÇ÷R*îÄA=ƒñ‡B;& ëá§d«¤êØqÇGs†9‚ŽT‹@òvØaøI{YœtÒI½o¿ìþ84¼â²Ë.ë¥%.ÑÒ§g<êC1U…f/vçé"—‡E›á•Á•MG  ãÅEÀ%œªˆ[?Rd÷¬Î÷,©”º4IBp²' BÂpŽ:ê¨i“7žº|¹=>àiUæ V°ÈZ*4±DøìjØÔµ@#)-£I²FFS2œ¯¼É‹_üâ9Ü,µ;…Ò#‚§ô}‡¿÷½ï!É=|à )© †ÜIPÅåLØŠ0ê¢%ï¼óÎ"Ò]ÀèíXúì¸@ –‹µ0ë©@mÚž¥AQ{È ìº¤È”|FòƒçíSÐ=5&CÞÈU)ôSÄâÅ¥ šÌºŠ¸ÇFLi)¸š;¥ð? §Ó’¸éK_JÙÈÊö8Lc@¥©ZNþÆâˆjÇSÊRe ÓÚëPå·1" nIʰŲÊg!j¶óìãÄT%H7È çË)N~eµ&Ð Ûâ!R÷ã~UK;úÄ'>÷zü…/|!0b­“Þ9Á3S¶%d%Ž”æ¡>eHeF•ÛüÁ€J<üðÃëÌÒüàiƒã.Ïø¬zÔ¹’†LºUm|øã±ŸÓ a ±Ê_ö²—½à/xÒóèg÷* ·¤]ˆ mñeA›ßùßÁ?1 ÄžÁû ]K3±ÁžØ¥½C–jÞvD8.²åÍõâ!V¦^¿3œñÔ$k”‹G÷`™bAKgþÉ›ÛËŠ³§q-(Û?rÀ@åd¸Ç,³Âk…uºan½z™ýNÊÕ¦›núÚ×¾vÛm· L²àºPë=ïyÏË_þr¸áÁXtVöHŠ9˜û]T t:öØc§õÏš2Vÿ”kyj¶ôMšp'z¡¦Áð§ëâEÄ‘ï`’ŸØ!f¡S“öÛñ_]‰§ŸN·(ŽÙÂ)ãW­º£ðT}´qdßëUMó®^ŒŸ<8Hxé•|Uœjë­·†ZÕ¢ì{;k “\9§jŠí»•VHÊvS²í˜S‰2ÍÃízF«DÆÄ Щëòd!6¾²è—4¢™ÆUW]•^b£ûY ´ñÆÓÊrÒþô§?5ó) Yâ!8wn›èq¹¦}Fõ'GŽL§E¼‹$%øL‘† Å΢/ÅH‹|6TM²bA“¥žF]-ëòøþÄ“ÄmJ9¯ï•—‚yÉ}Ë3ÜlLJKíÏ!‘ýÊW¾²žùQ2»Ì€-FÒÙÞûÞ÷²@çìãåÕ#¹žt Ë£"œÓyo: J yãß8äqÑ9äE•yø£ û^Xègƒþèþ(ššüqÓ)Ôýú׿î{#4=¦\ÙÇcëÛeû"ê/|á öÅÄúžöH5¢Štš£(\%Aíºë®‹_Eø=ôÐÝwß}É%—`¿&†¥Ó9b’•4½ÔHºYÆÊ|ðÁåcF&“ŠXhq½9¦8Å{yŒŽÝsýÍßüMR°½\ÚÌóPbW¦fÂÆx8Q=Ýɬ¦C‡ÎÐ~›m¶±#8Ouì{„h[šœ7Üpà åìu•á• A+¶ïÅßšcÅaæµOÝa‡h/ïÿûëmzä‘G2mÀÁbÍmŽWV[ 1gÖúÔ¯ËØ·äeDV‡aΞ{îYg‡°…mR~PÄþï|§·ðío;ï´å hèqÏ=÷tó—¾ô%<ämo{Û²öÑÒðô,¥zHæ«_ýªwM# §£¾Ë J­Ê鄚Ò÷¿ÿýáßúÖ·Æk„@ ([8R|üñÇi­þS öÝw_Ÿ½”hËëâ~AJ÷Ýw_E`<ÅŠ y&/µŒàΛPV:9¬7xøÀL ’dÒä9n“q/XlU%c FÄË^é/Ò;ùä“í£é2µ!²Ê7Ž¢ËÄIÀ!O·)ÀB.»ì2vÓD‡ê V¯4Þšú¥·ƒOI[¦d|°jo+«EewÙel oµz=»~ôhæåŽ;îˆÛüúêÅè>è ƒ0–I(˜öp¿¨Sz \!°p°ì²„ûðÛ ÃóÎ;’6JôCkƒ ·ûT—úÄÙ)÷'@Õ¯ yj¯à/l©de!ʈô®»î:âˆ# ›,©sçw†½nøë¿þëe.*\š”çÎ^—3­ªÂ^d>I‡f6~®¼Î_rÎ uÿà?Àh©1^]­ŒY“Ìòíró¹çž;Ù¸^D£ë$¨¾‡þž,¨§c€¡§[ °p¦D­ýŸ«êèÐ'€Ãd“Rü½æšk^üâå+_-kÒØû‹Â™‡á[;‹„ÓIÌ-‡CøßœéÑ/þ3.Ðb Ü_©Ðϸ'ð¸‘íKyU¼þúëÇ$É÷[Ɉ²ò±J²¯Îk9æ<:7¡\+«uVWÖ•]YßK}Z£V$øÄ'>áí¶81BΪ«‚qÂv0y×È  '¼ï}ïà úÞfE}£·d}“V#Ųm'Òz,}ÎÖ®n?é6ø \µ¿É¡W™îþŒà&Y‘ÛÜ‹-çùtˆ˜¥PdžôZF=)u,Þ¿W^yå!‡2âà ¦OÆ17œÇÖd§^YCµ6~‚Ê<2ÊžµÀRó§ÖVš¸°¨OúÓàÖ^µŽX¦@ÄDÚ,}…' ޽ýío·­£ü[;m0o’-ëÔ‰”¬ÿ“&Ð=»×šü ó\&4唸eÂKŠÝš%b@¼RŸ@rK ©:£I«yÚ&d£ä¾XHüô˜ˆ¬P"–¸ ”òv¬žîQª‘M4«f~í–b,pÒæàŠ½”ô ©Üìâë‹ñpÙA:Æ…^h›6Ûl3\½°"‹²ÆA­ñ‹ÆÁüä¸Vn$Ùho¼ñDäV%nž´#pÕ­Úœœ)Q†êNHÀ¾ŒÉ.6õ[la|„S§ã°+ceô.K¦âÆ$ãQÖÏùl–QÁ±PéQʲÆÎTÞ0·Ç(Ø-(h »¥%R E)r–3‘á ŒÏX» -5¬~ÁzWOi‚™G›?*µê€ªõMÙ¸£>ÝA9’x;ùh»?õ©OùÀ†‚ ¦G¬3ÏñZñIr‡ZuË*\„4o&[³c¨H—£#Å2ÒØòñíÑÿ+®UÓC#øw¯½öš’5]špµîI(rÜU¬r5g.Ubì3Ñpúé§§‘‚Ãæ›oŽÜ:›ÎÉ7c÷ O¢”[Ffš…áöèÐC­&y~Ë¥‡ÎP0çT*ƒ`S“¶£™lTö{¿÷{:à 09.Ä`¾‡…xkο0pà*z§ãÏ«Óà”4ÓN"ääY¦Ø: {ÖYgU­ ˆŠ 0{¶øsÓ+ë+4Ò%P¹¡‘5™eË”¥_4e¦F$¹ `ZyFáódL¬¬–'Bq7Þxcª± ªâ,]"°}Š\ÅTlžó‹âšfQSš`äuNÙÞ‚ðKq]æôµöt} —`δ°ì6Jr#Xלb>;í´“ýJeªÃQjUû;Çír÷ð!{ª˜bzg .º ^áíA-­•¼ÓÃ0£îe~ل³è”ITÆ’+þÔSO…rSñ&õ€üÂåª ±ŒŸ~ÁBõx«ÿ¼ m]¶êxªXЕõM‘Í8½N€-èàƒF›ø1¬:×XSÖ•‚Fµ( -¤Â1ìàœO3Á!¥rUÜ3J¾1Ù|6Ü@€ ¼ÝÜjŒ#w²¼—Põ%¡Ö^ÇXF£ëĤ>F– l»í¶ÅéáN • eMúä²×ù26l·ÒŽ–Î8ãŒxã¤y#ë¤`2OçÔ¸„ýZld>“MÕ9'ÇA°lÆñ±—G0Q¥•­Ùeèg‹#®ÚCfâ¥|ìcË¿]©Û¡¯9˜‰äÁ0°ˆýˆÚAŒV‰TÝS÷É|þ‰¹9º´œêGµzÌ‘DÃI'Tô‘+Û³i¼üå/ÏÓîCÊäs¤?¯É‚TO×®y“føË¸YŠ1¼_¥Ïa A{Hcx†ÃØÑl°õÖ[SZöÝwß=öØÊvØaͰ;Šj*´#Â'.™ðçŸþî»ï^ó,úpºë>ûìƒWWÛÙ†.kµŠ{Ÿyæ™ö·üЇ>ä]±–«¯¾zb›sVúµ´/L›Š…â:D›ú%êØcÝe—]Ž8âl‡UEBøf…T$„vGPVýϵýöÛ»!-%>ƒ §ô=¸ É<üðÃf¶@ -Ë2{Ð+°€IÑ­Pê³ZU9¢Ç†šÎGÓ_ ã`V®Íßhþ›Ì1Çó+¿ò+(ÀóJœÚ01߀°™§í—ñÑ„ýK·!ÌR2ÿì³Ï&³¨R“ٱ뮻¢‘[o½uå¿m:ârÙÕþbn¥â6\p†cV?þxïzÿûßÌA†;VÖ·>Y2^:ðŽ;îhëM»ãŽ;,¿++šCa|H5wØaÊùÞ{ïaŽ™Lk’I+Bè$t68Ó쨣Žzå+_éqºAþ#l¹å–i­>wsMU*26xç§õÇ>öØc£C–±’P(OÇøbšCµp|ðA:ƒÏó¯¬/ìIâäçöæ›o. /YÕ_õªW1²Þþö·Û‚þð‡43`fTû Ó Uwæ`uYá­USVíÑwÞYª)½šV”_½’¼¹ÈŠ]žÖqð˜žB¡¥ÏÛJL†2<–¯·×ddï´z™ú± }ñº‰/Bæ oxÃ+^ñŠg‘?¯©TðDOH…‹@Ï`üòg‹} ÈLÝe;òrß&ñª:9b²,+õF~îsŸ ÙÚ…áWqfŒnljG5#ã–Ú 0ÂsKÊ6àSþ…šz2•ÿÆ7¾‘µheÆ+Ê!…ð?{0d6+BÄîT ¼°¥t-o©GXÖ\I¥iý M›Ý—>YC¸›­Á?ÿùÏ×á¢J ¸}‡ ©_þò—“eõƹì kˆ¥Ö¦›3¥·¨"á;R™öL7ÝtÓß®^æ€ð¡Y™øĦ±Ožª!qˆÎÊAŒÈ}iJˆ]¥”‰° *A”Vp '¼óïLßnOéc6‘ü%È’˜î|ú†§ìÕI$ ”¥¾´%kÚøÌ&Ó†N64ÙŠh³lÍqÇó‘^[ÓöQG‰ÎQS ¦|>e´%v³Å[t*M/᪑w~!9¥Ž¬ÌÏŸ‹Œ°Ãý’}u«÷ù³Ÿý,wzÛAû*Qd3pÀ´ñeQµG}”VV$€72‹®½öÚºìÝvÛm¹”Ù­È„Îæít:9Ýeg]ô ÊB€Õe<ÔqùuÎ6Ûl3ŠV½{\)?à†®Ý9>F{ç'HNá¡´0ðaav?,6&K üÓCr2€'èYò{ßûÞë®»…¶c@ab”OÛt饗¢»e^ ïÔ)gTäl­®¸Y`Á+p6_š¡­· ½ÎOþE5¸뉒3¼…¹džÇŽ´k¿ó;¿ãíu³·ÎépH•ë)Ï•)a@ê³Cð¦|¾þõ¯R¯Æë(¨Œ,Úš]+Τ±# ì IdŠ%®¬o2K(ɱÀâ‡#g“/:eà 7̉Ñäý;­¦B¡O<ž$ÝÀ! Í?üá3»À «§ïåZ)¸hbÂcqÜêX¦&¼nl¾ùæpÌ®á3ö•Yš :äCªu¯¼òÊŽ³@üaçúõÍo~sÝoWÖ÷îÀ®^5E…ÕŒA“¬5 éi6.g±@–q³RªÍz#FǾ¨‰˜…#Cƒ)j‚cå¼S§ÅS,ÁÐÀ˜ð¿ŸL ÂÊö%ÎpÚi§ÇêLr¯½ö²p„ÌÜs[LxÓM75Žm2aËÇçÙ­¶2€ªÇ¡ ¼² äËE]4µøÐ‘WPWÀÓ³<Ö†"k\Sóä—¼â6bšæ ϺµûKÆ¢:@ (ÇÄ›R´ùRàÕ•U°:ùä—ýˆU³.Q0ŒgçX¹ŠÄSYqD_~[tÐAA²=ks#. À=÷ÜS¸Â(óönlÏ&´Þm80‚M1óö”¥¥¥2¹&$ùŽkQðÏ´w/špÄ&T[¾RWÓã TÍRSBãûØÇjz[¦6Ò‘z1 ž*%¿1£•.á¥yŠL bÅiAv'q\¬8„D‰DC¨‚¬2¯Àõ,§šl¹³Æ Xý}ÒSW‰ÕE×d2$éŠ:»ñÆÍdÊJÐa@;²47˜0• àOj›ÖB«8ÆŠãH&™Þ…lk0G¢ÞR-Î_,OY ƒc_öE#C¼=YÙ«©9+ê,ƒ_U:;+Þb ×1a°²›xEáÝvÛ-\Ý]Ó°/é„us(ÙÐOÙò®4|tžb-éN|J±a—‚uÌ pç|àËp&2W§ÕÀ:«Ã“™rHÆmÅÚ2 (®Ñ`Vád Â(¼÷àƒ·vêÕ§š¢²È=’Yºœ?ƒ4é„züxs JšDÑK‡°-F5ÅxMÆ›}éܶ•ø0Ö –ŽÜö@H2.Ç y êÕW_}ôÑG›01ABU‚ j Ï.O~*]º¸Ž9ïÈœ¯ï^g©õBzfIâ1À)·‹O&Òð:-“¡þÍ Ð1"õ#9¥Ò@eFußxÙË^fG€±’©Êèˆ~!Ûå⑨Þ˜{p”5M" ˆÄÌ$VŒCJÚM¢|M”¸Æ1׫^õ*ÆÑšãc ³1Í?Ù:5ÉQ oMÌ+A_ ¥!2¸¦(âÊj!úŠù˜¶¿PÈ<[WDz» HUßö¶·Mª×è½î|žbFùìDiÜkn#nLúaÈH»>eÈXSÆ)°C׺´d!ë ¹L ÄlþÐÖ´çó—âd]˳ïq°&r-NE«‰Ó®©É’©aàÙöU»¯ÐeKî¬aüTãÚ€OCë0Ô°Œ&(ÇÂ33Z—Eìs¬Q½¬7[´ª‚_àòËÍÚj*ßRh™üuc ]ÛG\ñ;ßùN 3¾Êþ‚ +Øk§ÌªÉ#‡ªü™vµ’ÒŸmÙᇞOL¡õihËÆQБXë_hœ‚7NùÌ¿Z‘“¹Üì‘å u¹a¯Çãn°×d} ‹%SÂ[h½u;ì0¿Zc5Z×\`K™·×Äz´wí±Ç´LÞ —I=CémÐÙ¾xï²ïa §øªi˜[N‰À•J¿l˜ ¯|¨/XqJÓwyÜ+À‡!ʱ@}vmMàÜ/¯K—ß·&_ò‰§çOö^¤< 4ë‚`<‹ùi\Ò¹ŠîÇ?þqßè·bSsd†ô¼¥#NÀÇrñs{1ç ôI6,IÔKÊhàiœa2ˆÕ{Q)ÕF  ½éMo²;û쳦EW}Âòý¥_ÁvO¡²¢×F°:¶mÌ–’6%àL8i‹¦ˆ0+Ýÿý 𤋮¿X«Ü`æCTZwÍÜ6s¯î¼²*U—¢u˜µì;ß!ÀŠÊ+Ñù­b*.Ëé§Ÿ>VmáÍb’×l7û‚aúåù[ÝÆåÌ s,§‘ŽÁÞuÇwø’âŠ@@;¥…ißq!ΰM¦àm^£}÷ÝתáçT&YÊ8;e#ͬÙÕ/²jø€‘ÂùÝwß}¬E?p°òølQÐÀ§Ndc®ܯµE^2“GÑ6Ô«¯ºê*T_;¡¦ Ü{ýê¶É‹QUÉ‚¡ÀƒQ'ØEäÕÉRöEó!² …0Šig§ŠÝýó?ÿów¼ã~ª3Þø‹Æx,5ÿeuñ‰—+ØU=Š_tüÀoñV ²`ëߪ ÑÐL#&cX¾#ËÒ¥!³[Fû~Ô |̘õñÇ ¤ö`t—ªÆJ22ø£5Üi)¾QáK|Sï½÷Þ¼"n(ê¯y9üGtKlŠ)’ˆf›ÐŸê>°‹M~xYìu+×|¢™ÐúŒœjgü™!±âYdnVË“2ãw2bwÎ9ç«»õÖ[SYq6ô[ùb¿6[« ó;: ?û•¶ßÁ™%ã„íÇi‰èç?ÿyXÓRÚNFJ[HŒ"ÛË.»lÒjL#S:£M]‚Al¼Â>Lql`¤˜+•71ÐH•š&ѾI¢ܾ[c©O.¢°#°òìûÞ÷>Š+E´Å~ï{ß³¹ïÿû+²M«3)¾í©NgjS^45Iáfo™ ÷âº-–˜C»)U÷–Â:ó)*ŒŠ[€—™†Îpà^|ñÅ)í´¯01Pºùæ›!Ʋõª¡:€ˆ*'UpT_ÐüGA/¶_³?ÜæÈ#üô§?=ͱ .À<âˆ#Ì„ñˆW/íÛ‘?öØcá?ŒJ}Š/e!ÂFï­CÙÊjçb¯«¾SÑ8ãúÀ9Ù¿ÙÂÞ’—Þ!XÇ£! l“`ž6 ‘,m„©mÄc„Ñ‘/ ì~5Urß<=ÓÀ-ÓryùÕd¦&Æhé£Z“Ô"""?W¿à‚ ²Ê“h“<Å‹!}Òº0S"°,MÎø/yÁÉH¸ Ňw"_-ßšMWÁûz*Óoï½÷¿AÌ3)IG9ÉÏ3—…Å R½üMÂú€Lh_Ô]T íí8ª*ž¢4>úh˜Ð™Èô› ƒáœ™¨&ùøã‡pÉO¥‰}õ«_w¥=‚Höe ®Fw?úÑ0¹Ò‘ÎØ¦ë®»®ÁZe¹ª–AÝ¡IñZ¸.ô†`7HØæ(A/™WÔž)xu÷Ýwǯ½öÚJ‹<òÈ$¦ V•®¨‰4` ˜^=*`ÎS.lN]G© ˜&ø|Nˆ2ÃWVÛŽSË8ýÊx¹•ã÷¡ýêƒi× Ü@ÒrPJM]©j*¢;—'ª¨©(ßêÌÇ+Ì|JW˜…Ð11ˆ¤KëøÇ?þq© “OjÒg\€ã½åÚwÕç:¶LD ôŠ/~ñ‹É 8“Æž!o u˜«Z7ºvÙe &þI´Þò ±hà2g¦bžŸö±¨4m¨NÈNþÊú:º.f‚ÝùÎw¾c)äÑ7¾ñr9YâÅXZì„= sòt|M•Ÿ‚ÏÞÞ€ÕŠ4>3 ªÍÛKí Û _%k¨FL]š•MŸWÊ0@)ò^äf/m¢¤*M zæI¾O:|–FÇðñ+ã—ˆ¤„@ï)ª^hõ,_ãcžð9“'ŽMœQTc¿mh{Ú¹޵ŽXÈk¢°^¹zð@¬²Þµ·ÜrK…Ù£úÚOÀÉñLš*`Nßœ.Ä:ïAc’élŸq Û&·QÌvÜqÇNðÉe"ž›áý÷ß?Zkev^ýêWâeo✸ÅžE–ZkJ¸4üYæ¨>U|c³ /ô  .ZÞŽÑ™-JÏÀœ-A²òªÆp/ü±¡H‰t#› ;í§3¯¿ÞRת¥é:P³­r`цÿïú«*p“2ïC'éœíÚÉ7˜+`²Y+p:þ4“ÏW3gdfX}-x#Ž—:—Æ[ÕÑÜRõלÕà¦xBú)€ùØèÆöåu'^Ñf5£TåÙâˆx˜p§àÙ\Œ‹«~To’” ïfüx¡‡axKææÓö+Ì©]lBÓœ)98g›Õ^㙓–îsgî­r‹±eˆR&N£í3sˆ„íì°Ãõ웨Œ´÷M7ÝÂ[ŽU1%œŠH ¾è¢‹°k»SÆY ªCņœ'ÿ4‡ €Ðæƒ uMæÀ1ƒºÝÏ!†@ˆ¬²}j²Õä›'zŒ‘&fUŸ‹Ñ$s‚M\kˆ%¦5a¿”1ŒÌ©"4ùÁº5‡My8WÖ7…ùßV/lÈœO¥"ÊUúÿ²Ïé/­éÿ8A¿)ÒÏL…^“FÊü©Œ|Ö1Ã$_V7Àá©q}ÔQGÁ[@µ†?o¼ñ™gž™-éûœº3sƒuÔƒr÷ú’V†K¸‡v ž@°¹øC¦Í8ÓèàO’2¯±q{]Ô}©ëÓtd½&ÞÕç±@‹XƇ³×–Y 4®å®!ºxi,´UÔÀ´zÂfeÇ în¨ÊÝ>ÿ*[¬ÔK8/™óÌÍÈ´²e›’4bO1íîÒæz' Ê,)~Yô)ª´M¢â]½tj0p™ù눭ýöÛo‰“Si!(-}wþ…çÖ•¨í'ü³Z²!ù“¶‡«&€«`ìã¤ÊíßA²´L¡Íª>•îËvÖm ˆ`[vsnúç˜WM{¶Tt ê¿®^v‚«é“éxӈ܃ÔQÀüä³ôìà̺uë2`§x਩5ƒèÈ{4ÛF^¢âò<«ê‘€ðÀéêD§ù·ƒc¿ÿûßÇÀ‘ùlY Ïüîw¿ËÊ;ùä“ßñŽwPæÇ´!ÓO8ácæÜN’n°Áùlí#sŒŸKòª2¼W›yB¶ÌÓG}ÖeË—\fÅG• ̺ >‡Ï©¬ŒI½4ÿšU…ííæô©‡ª÷ôúЇü:U—§["¶@—NjxN×H뚬ùé›S¬iŒðó…’Œ£À×s$]+æVöPáCý­ÜGuE²éZ¬-Ρ]ð-;Ô=Yåp«¬Ö🈫ÐðæSÀRžMdØNá“¡à‡`£8à(óìòý¼#(íÑDÁn»í¶ cƒunûéOZS¶j“RÿðÛ±àHØN£#pÇÙ^ÌÝwß=5u¸\e¦ÚÊq°Öm·Ýv“™Ÿ§ŠÏ%æo}ë[Ô†hÄã&O[™+¯¼Ò^ÐííZs€ÈjDïe•Nuà 7t3«Iâ+ôk8›·WÖ|€1鉇×w£z2nèÔcÉÕ'ѲƒærÖ"pXGÝ5Ú¤ DAvððÃÏk:\Ñ«G[+Ÿ.Ö?ã ‘æ“K Ûw"‰g L‚Àýg2°LW/á1·ù%À„ö¤ƒ<ãÜÉŒªÞæÓ¾{f¹êÈÁÌÏ>ûì1ŸAÉŠ®½öÚá÷Ýw_~é¥ÿêê• „Iv¸ãW»C®øFÍ+“âQßFoì@„™œ~[0CÀª±è$`5“‹64,”ŽáƒÏõ,9¾ <ì“m›í ‹0¸µØ'Ö¯¨³§7‹áRÅgÜcI0j™gòe¦1¬£×U‹»ƒàªÙ, óNQ¸´ß*ðO4a¯½öš£Õ:A°8Ò“Ó‹ò{¬©*t}®Øiu3*Dݸ¢Ègž……Κçt$OôÜ™µû–·¼ė Ê5=*qÎ PªAÖúðü-¾Ú™xµY²õ‚^)ð•K«š'ÒšIuû‹þ%yÁ9liïÒIZõ´__fã¦Þx…û'…ì ÖGŸ¡F⟿û»¿{Ê)§Ìž2êG½4~•cCÎÊxv\KjÀ@šÃˆiW¶Ã`{ ½¢y/5£ÓhF¨_ °W õ›ßü&4xík_[fwúv±ÔΣ€Þòày>¨‹.º¨6Á“E?Y¦Æ(ZàwÜÓ†æá§þ€wK_×Ñ­;«"ãâ?øÁ;= lÇ`ÏaÄpþª” Iü±ÓÁ¶ú6ÅX¾ÇSIg[æ)hSiWáˆGy$é¶´tžÅ:Kk®iCLØ#¶¬¦uøØxã7.«)¦BçM÷~ÿy¤QKJwb>tÔ ƒTËf: "¬8’ ßþö·ï¶Ûnuº‰6½®£|xRpÍ¡jEe½u*TS³×¼æ5HŒ†¸bª†]6˜nSµ.*O¹h^òWüä'?yî¹çâÀ¿w#kRÉ2‡aÚ#<2¶$Æ;ú†]žöX[mµ•å²å£‚^,çŸ~¿ jÃ’2>ø å°æèNæ6‘U3ˆ .·- Z~á _è 7jËï„%­¹}ík_@ ™Š¾IÉï´ÅUÙ<“›Y~NãE†ÝÐ#IOqÙe—‘›Ði°hp`Röæp³ÈóòCõyç+L;¦gòæ‰SðòmÎ9¦{˜ÃÙø“ñ½ >øƒ»’¡ ú‘–PÀ'd+•Ì_Øeì._ª·@dK™48Ž;y°êk<ùqÎ+®¸¢ð‰ÒÇ7ÜpÃBñÃCªû‹ºÿþûó{, –) ¥Ïtob5,¶¢˜  |B†»¾ŽQ®pf¥½&[«n‘ dæ•‘|fù,ø[Öª>a4¦V½QÆÇ á݆¦¿±¹lÁu×]7Qèˆp 6€ÛXÜ„…xäÖ[o5Ãm¶Ù†mÅ@ûÔ§>eO¡nŒ4Z@¶{±}4›¬Üi§R{ýM+ƒ¥˜sêDÚlñ!…-ß<÷Ýwß"I˜?ñ|K#}Hýðü²˜Í¶bhøvˆÔ‘ÄßøÆ .‚ØÇs ’ÌO2l²É&&Ì^FwÔ¡`EN ÉOå/ø˜³ŸRGé0aš«Ñ iû…§ÆQ-¶Z4 ê`›=²Å[¤ÕTÐ8˺Rê w±ä—JN)§ÿ²z¥ú20š¼§Ì/5Z¨~Ï=÷xq—KËô¨·¯Á÷ßL¾#NƒËEÅ»`l¼:u¨²œ%jç²Õ+|6m/Í×TüÒuÚ©©£[]ùPð¶B i2XÊ®»îjÓ°Ã÷6}:[ÁFׄâÿZ½VV‹–§d‚s}&(çüdt.0iï…,ŽjQƒÅv¡¬(Ã_ »zhvš …ª>…h*VµFì«¢.qWÚ}8¥«¨¡*iBHÛÄ “¼ú+¯ƒi#ýzûx̼ȞBì‰>ÊkÑ»ˆ¿ÊÕVZ°º%£‚³×Un‘ ¢Ã (öØc7øÐ\¶Ó"t´µ“N:©Å·2K÷xöŽ9àÌT0Ä|üä½y™Æ]Ÿï7Óò‰€ìþ‰™‰ÜXCPqγ| %ñCùпK·RM¬š¥t©§ˆÊª+äR(æa,”$¸SçsŸûÜa‡F·‡iÞ?þøN蔎ÈMn¬9-Ê^+á®c#ȹË.»Ô·pÄKÞéø$˜ï³Ï>Ø~t½²¾³^­¦Ç¥c,T` ùL:’+M£P‡ò8Rþ'§äém´Ñ9çœ3ÁÒA8kÚܘ¨yŸÆ=L:Ô«>a‡boù‹›©d&ö CBüö3Ÿù iBNë®SžvÚiÉkrßëß—ÈÆ"R§G©†‡|0 {ñ"7SPNÖv¾zOE’Å* 5…ÆÃ»Hítiš[rvzT}=‘3ñ·)×PØg+FW`•‚ÊÐ8á„è ùÂóªˆ5Þ­xø2%­Ÿ¦l¸] “Ë$Ž_ÿõ_‡Xî,)A·ìˆ¤â]7ã9"¢éa¬N`d2l»í¶4ó$i­:Æ:€$ö.ÖµÂpˆ‚F¬@¡ÎµÃÃ)³6ì=´dhvgüÌž_k-Aõ…®Œz[À>hÌeÐT3V“3m6z͹væjÒ>ò‘ÀÉgKûÛߦ,s €O¦éM³ìgVÏ–Ñ‘`Ñ$TL)mÉ–i&4ɨ‰µ¿¥¦n¿ýöÓ ô¤Ø"'žx"Ú)„v¥–qÄk’:QÖdSæÇœ™ ÂdòTä!m‰ê("Ç]Å'U°&Ô1„Žo¬Ñ°Y“G5þvæÛvG;ãªOʲòpG‡!C._ÈϨÝvuq¡\d‹Ão½õÖÎé6˜…bÀäl¹Tá|)ØKÉUž©«#Ý7ʶAh 4˜^tÕUWeÝDÙV©^Uô5HaiÈ¡X T¦ÂA¬Ú×MÞ—ÓN½®y 1¡/%Cï ¸¹/´8iEÉ9묳ìTýC«­—F×aVZtŠô2­¬ 1ÕetJ%Ä—êt¹s· òå‹_üâèixoRë³bÌß =MNçÔÉ—F‹õÞÎ Eü9Ï„y衇êmÔæ.¹ÖaÜ„±ÅÐ˜Û É„L¬9)¨9x½ºabÉS ÿÈ#$†šsò¨sØf)!ÀŽìVrèÎ6“œ2¤)í}ïÃüc E…¡= ‡ïå ñÍ¨Ž•^7Th“f˜ê2ê¢aÍd2ÙJIFQ5Íb­ËôÌŽ“ŒÆÏýöÛ¯cÊü§õµU¿ô¥/­dî¶vÉ&á@ÁHæ_Ëì´M Lj،÷Þ{ïX‘f[œáí·ßþ±} Yáói,Áð'?ùIE×M•QCÖ—EÐU~ÂTVÖ7¼3¡Ö«éäiÉYV¾ý²ÑGF° —s r©v ƒ23÷ø²¤3*~ôÑG‹«tÿºuë¦ }ݸìE«(Åï]ïz—™Tx³‚UtóÎkê\q5ílÔM•-İ•77BŠ*ø¢½(Îæ×DUU¶|Yû`DÍš¶w 8"nr}ûæ¸ãŽXƒTlm2 Çæ2á œÈ«œÃ§(Š_çkÀb\ʦZÍ™Škîn¨ç¬íØ‘È4{jÙÀ±LÔ’¼ûÝï6s«š5úò•œªÕ]y"„už´¸j½³Ý„Ë™gžiã¢,8|Ì1ǽül£ùÄÌËÐœÎæHµ¡BżgsŽÏÞ“ijP[¢QéÍޤ-dÚx¥ÿÜzë­æi]téO|â oæÐà¶Ûnóͧ?ýi´†Ãø ¶Ôªø›ßüæE]ä¥l1– :úüç?oäýèGÞ^xá…¶8«ÄPYÖü%/࢜КØtðyï½÷&MvÜqGäù@ªK/½4þYAûgð ³-ÊwEGTA¯€q*VPtçf\ž‚bæ¸oõšC:hcC#ãÃ¥ÊX•Þb»a)-Œ¹J×öwúbw9Ž&Ë{ 't’;—õ™­%›ºUyùv!Nˆ!Ç\)oˆ?€Lª2ñ¬Åî´ÓNðÍ¿¾ùÞUG©üß¾ÐsþèþhÜŒSu§‰h¶†ªy˜§eØÇ?þq,ˆY·O§ãÑ¥:ɃUœÓìZziý×|ƒ^pÁ¾¯—G!:™<&à¥S`Ðöùé¯W/"^$oIp£üñ6½®Uu9 á½£Õ ’Çl[L† Pwyp¬X—TÖ+ #ºœ½u>ªYÉ8@€Î»pc&LåKÞ‚ÜJÙ˜à“žYr ¬]dSŒ­Qp]ý¿úÆ4:t®QQ)ðt][éž´­¬o¸`ÉvyZY*Œê:$E®þLú?ä4‡LóÏ>5l‘¥v@$C…@hÖå_2wÿý÷ÿƒ?øƒ‡~øƒü`ªiÇe«sÎ98ÉQG…ÑéæsÑ’{î¹'Þ’†@£¶–Z&Mï›çâJÉ‹NKÎÅg–©[à@ÉÏ}j 2aÆ™SW…§ßÏ!q8à mìûX7™™å›S#LÔÙ̪8“qG)­—V({$~Ÿ—ÅÓÊM^Yßa­“ñÎ㊜ŸTµŸ \vö‡?ü!öhßmñ]«×„QUèk_ûäLÏ÷Æ<5NÂ"¿šj ɶ˜ªgòýÒ9ÞÒYØ”• ­°]vÙ%W§±J—ÓAŸÄå̶g •ŸaŽÑ'j©’×tєà -Ml=»ÐÙwC·IVA¯›ìõ¼7¥%Æ—Æ^3@˜ñz»»ßÍG}4Q»ÌóÞémWž)¸Õ í¯¨:d®i€„QmUßð†7À.úÏä o·4ð aK/5“Ê5T)¢cM *ïe1O7O#€×cq²Š¬‘ÏÉ8,šóÎ;á#y ™2Fqµ 1Ž;ñp°ÊM ¡_Q‚æIfÅÄ·ÑTÁóæ›o¶›&yË-·LǺn«KWµ¼b\4fµ,aºÌìÈú˜Žê˲L«òZçXq½QbÔùŽÆý;±ÜãÑ/_áýk^AˆwÖ™ùYêÙQÄŸ§üԣݬV›|®¡ A@’–ùûå/¹è¬Í6Û züÆoüFÞ]Ì"‘€ðmœ¥ÌTl“ù K'êÜF „¶É&›øÐQ) 8¤²Q`;c<“`á‰PÜ‚=êf¤‘pŸ^Æs 1"¬?EêMסQE`{;žbïs­½kõO¬Lþe1´ÿõ¯Ý;8È; 0âM?¤ïUûhÍÈ×N>ùdÈ0Ô´ÆÓ…E3u3·ÆÏ~ö³ja¹–ioeÞÍåOK”0g^¬ƒÃQGêŸõÖØŠ.óÓ—Ò³wjA>ùÉOcY@~ŠAÝâ VŒæfBœÆRì/3¯Âí4û>í´ÓjÀMÝjØÔ3ú°iÏñ=.Msè uðzÜqÇè( gœqÆÁLÐ3-Ï<óÌÙÇÔÑtׄ•)ùŠW¼ÂýÖnðÉ^L‚ô¢,ÙNs*Ý ¼r˜§íÄñÚSô•ê•L©»S~]`\fÍç°‚~ Ij°Ÿ:Sèhµ6yY:³q킵˜F9t! K°2nt×´Sûþ©O}jyÒÄšNjÈYΰˆàÆo<å,‚¼‰­IT.] ý¶ýRwæ‰ò+°…-³ØYÓˆ´ýµãÿ÷ê•÷.´ hƒŠÎ[…6Ëpo(V|Æ~*èwÜQ3n÷{/XU¾7I³üÉò"P?E¤F6«:¼ûeÙ¯…\t¶BÍëôM,ÓÉ;´ g hVÓÑ4X 6ÖåC,©Í´Úƒ[u]‚¢XÍŽ‹hç±ÇcB¢²Ò#ó\Öµ+}2G«¥]vÙeôQQë«—ÇË‹1²I—ñCËúøÇ?>‰Š‘ŒWàW¬]BЃÈÍ´«M‘íCÆ̰ÑF=ݵ ˼óÎ; f›°|óüÄ'>AÐÀù¥_ôåÿÕŽ;餓Xüzè¡PwØšÝLÙÍ)¤V/û]wÝ5þ–ޱi§àXi,“ñZ•Ú~Á1º“­Á Î:ë,8og½1õ ù<øàƒ(tÔ×?øƒ?°ƒ8LÞ6Ü8·p'h^4ÑÅyz«Øu|饗f'Â.tNæÊ#õ¦7SF½Ý4CÛÚŠð“ñkÇåpϯS­êv9 HUýðáØc-Þ,ö¥/})œ)è9tœ]GuCÕ«Îü#Rß§èFËÙÈ!mêoöÛo¿cŽ9f’+Æ….¼tJšx¼x­ÂT]³GPè/W/2^ ¥RÖi åvú¼ ¬ 1 Ê»¼´lA7ÜA’bB›k®¹½k” Êzýíó oxCÎÒÑu‰TÌŠj+¦ÝÒ_~baåž’IIv¼wÏ=÷,mª†ã6ÓNÇ(w¬²‚“gŸ}öä(Á¨|õ‘ÞÄR>§— Ê/ g–¦YdH¦ôœùkÑÿh—<Ó\rŒ¯5*wý¼:÷ ¬â•4dóˆÔH3ýÙ‹}“­¾‡½ -€?EÔ«JQÍ4šÆÇ>ö1LÀ' xÂn-ó‹_übÿÂv áœ^|Ÿ¤þœ·:u†E³]YßÐÖ³Ux˜%c,ÔÅvüõ¯=þO»î_è7ÒßʯatTIµHf|¸ŽT®Y3Ž×½îuW\qÕ!0³ôM2yaVa5QS*ä>ì²:Ìdö·“ÁtBÄn&9ÇèÖxõÕW_uÕUÈaÛm·güaxYØ*à—rX1™N+ñTg|u)e¾4ÀeÒYX”{véÖbñ‰Fƒ¨s^3&{tìM£ÙµQ“š¹Ÿ*¥²3ë²§švöB•$GÁKTUJqÍñt>¢ÙâH`Ѐ‰±ß~û½óïÄE—}ŽXøçÅ_œ«›æ/›l²‰_ è_yŠë‘Ga "p¶Ø²I >³‰è?´ñ©ŽXç¾ûî˦ŒÙèg–s÷l]Âæ3ŸIùŽý,Æà½æ5¯Án¿ývûnGK½…ýÅ ?è ƒræÃÆ%W0á—)!’šWx>F ÅX–™ª„i’ïbPS5‹Ø‰“_ýõãý^&­/yæX|ù‹:ó²´)³Hsõê8r³êñÔU~miÚx{h {™„ÕÖËoì]Ää&-í·XåF@€“^W±Ê|p\9f‡í·Ò]wÝÕ®ÑùË1O¡ZžgÙšI¹]sÒUúdüª…gF¡ôuþÒ—¾´Z²%”˶ÌiúÿØ{÷pëuÿw‡¤å|*f9DŠ*)T¥D"‡"*)"–ÉU("‘³H¢P9DBÑA3è\³9«Ùœ³µæ^kîuíý[û·÷^¿õì×5^׸¯Ï|#SƒÁ˜Ïçq=Ï3žçûý|?‡÷ý¾ïÏ}ˆ! ä4ͯùB FÖÎ`¹p^ ƒØ¶Ö 1æq@Qaߪ|ŸHªZµ*¢ÍÏãHQû•Ѭâ­Á&¢áµÊBô™ïòÉ'i½¿4N? ).ÐÄ@E>.Ã|ЃbE‘šÀÛp&wÙX_ÞøÇ”æE¥¿³Ï>;RÇÇÔ‡fí£cW³3(ÛsÆHc盎›îO²âžÕ‚ÒÑ´iS6ÔùçŸß½{wþ"UˆR¬6êð±Ç»à‚   Èz„¾,8âʼõt’Ìu!f lÊk"9F’|}#OõÁ´Ð€Ç6¤ÿHêAƒi_å¾:tð\oĈ¤m¯^½œ;ÏpY,Z(4*Lán6lªú´iÓÐkdìJ“´°ÂÍ”…jÜÿâu¤?ÕÈ0gÎ X¨ç\Çm.(±€#®åˆ¥têÔ©Æhøvòäɼ59êGy-^“d‰ Œ<]Àu=úôú<½òÖì##¡,TñÕW_Yë uŒ-ÀXÁ:Ø&}ö,XÖZc´ÃA IÍ7åÒ¬4h¶9š´)eò’ÐzÖ¯³4û:rÛÐDÐ[%®N(šX¨1AŸU±PÛ¹,/˜>&Ñ“8}lB}°¬C`éÞ½{=¯Ôo$j—HÛâäH3,ý×Í#l#Ti¨—‘8Z†i¼à-êm虩!!¦M“Í.[¶Œ+[VÆ,Cqm‚kÆ'RúoÞ¼9jôh¡)°4|ñs}¸sÊ•-çÊ8³Ù‰>÷â-eE0 ì¦Õ’GÁKW¬XáÈ0àºè+.R¤¿Õ[Of‡½Ã7MÇá¹9??~<»fìØ±<ð*’CÊ66-JhD°«´L^c2¿f ‚iƒ!V™?À«ÔU>gÓY^|ŽŒï(B‡ä#œKéfÒ3F˜i’Vñ‚¹F†""o¹å–ðù×ë)¤mœ²ÄsEnOR}ôQ …­®ŒHyô(+ĺ?¦›£cÀ©N õêÕó¼•~¶nÝÚÐï•+WêÐ † m—/_Îõ:ž‘ÏMda–`¾Ã^QÉU«VÉgX*¯½ö;‚gÄæBdˆøË 76–WVp@þ­ñaÎêÐн©ËŒmÔÌÂoÕÖE!î`Ây[!1R 1 º¯OŸ><﫯¾Êçfl0X[NÈ_¤ ʦY¤<eˆôBd#€  GÔG£«•*U2³ÄI'$ϱTäE‰¨ž,Ö ³2FÛµ1eÊO” ûõm,€ð„w1Àëà–w£¯@‡,—é'ð(à#& ²6» }3ކ‹.!¸.Ì·RŒ ½RQ&Åîe¦›ñgîOÍ>`¡<~üø_|yʰÇFSð¡B…°Žò—¡C ›nôÿÝO‹ªOÿõ·-$µ†¾XüQ¯!…ÐC—2´Ø¹4c~饗šÚQ),©6 zjªRƒÉpÚ´ô ¤ÍܱÒ,qb:‘3Î8©×¢E‹,Ÿ vVZF6“_FaõêÕ,HVP ª)Uˆ$W—9®u6H‹zÍš3Ø{$Òa¥¥˜Ü4Òƒk…{ï½÷ ñ܈ϳÜÕø¹‰[ÍŠiŽ8^ðÖÔpÁøí´iÓ´Ì<þøãæ.ðsNÁ„•ïLqñßç5ÓÁé¾Â†USŽ>óý¨G``rø!Óè¿*’2dˆÓ¤6šà¬³ÎÒAÅô„é‰Ç•½‘§±ìhƒIÝË&ƒÍäWEyë­·ì€çqÌ‚ˆGg4ùf¹ÓìܹÓg×§B?ÍîÁ‘"&`£ÎàÚ¼–ɯ3È¢…ű€a wÞy'nذA[=½¢ú1Z–¦£lÄYhjÓ¾M3a ™Y„©w72ŽIAÃÃ"¢4*¿Et"tÕ†¦Ê ¼…¡™õȹˆ n“ý^pÁNÝ?Qoá ^f×4jÔHG‹0&óÔ¡lú/õå—_[nÒ¤ ßG›F/X³f SéQc èghÉ8³,X.¯zÎè!£ZúßIÓ¾ХŃDÏY3çŸ>Rƒu›Œ®KÓAˆÁw²¤4¤I–kÓ>›¹R™²ðJå/B'U¨üY›m$@SœÙ :á…*Uµ"¬K›Åßtò qψz8Ôéh˜¸Þ¢TRHN¼ƒkÜB_€»,‰Àø‡ýÍ£ÔÔ¬Þú2±¶¡‹,x–+7oÞ ‘EÂ7mÚ44n´Ú»ï¾›]ãÎ⇲uëÖÔÏמ}öYDwg1Yçwž±*Î;”õ׿þµ¼—^q©eË–™¦•e¼.¯©ÆëPÑRï»ï> Ìé`ïÀêͨÃö²6oÞl6ù/ÝàFìz:ÃÞ™3gÿBÛµ²ËšD‡šP* ‚ð‰è¡¬uŸ\e–«…u‚ï#IOTZiæ^¶v† üah<‚AÁ†½ëz7fÌ`<2¨ð€piî¢83”Ÿs5>A<…£5¸1sæÌHxÈEÞ~ûm3§é|¸|ùr#‚•;ö ‚~×qÆÆ(µcX¢j¹e „^ðÖYS}²©O®47ÅRn:qâÄPŸ+¯¼Ò\²:H÷íÛWOÖê›o¾9eʃ½BS¸å–[2ù¥|ø_vÅÒ7æ©Í+|ÃBå@´ªnÆ ™5ìœ}öÙ, ÆÄ©•JÎ|Çw¨õïßÿž{îAÓ¤Ÿhí÷·Ù š2Üõô9ÝûaßËJáeÆcÓÑÿŸûiºmgŽ®˜iÙGåxAo^Áó—xá\šq€'0ãè8@Ä“O>ùðÃ#¤xýÏÿüÏp•#FÀTY‡|‡×EÅ¥ÁO¦o¹£kɅǪCR§yÑÓc8¨”!ˈ¤ÉT%ŒsÏ=×Xi7Á^ …@cî6nÜhhˆ0«M›6éñ«ÂÎ¶Š  {-œ½ÕO4-¥| 2\·nÝW_}Õü]p<~nPƒáZ4²MâLFÕ«WnÌŸ?ìu;h2•KG8d&/t×®]}½?.­c6×cé¶ÕŸ U°ø¦YLéÉ ýI XqNd2“—ƒ‚½ F±?.íI?1‘…ĒшŠNêS/sÄeaf@<Î~ã7ø¦ ð¡¬a^C£?餓¦OŸn…&öhÉ$Fzœ—óZØ @~)—”¬ǵÀ/׉Ы¦Ûâ_ .D‰ÞL}Õ1¾fµÙP=aš\¸RÕPD­%æ£È²?G,ª ryRîÅ[å5¨¸i|V®\ =€-X Ä" ¬®J•*ÁYÒ¬P½OŸ>,Z°bÅŠi­¢:uê  `Ý( =lA‚ZÐ\ÃHåk3K#éFIJ3ãúAP]´¬1‡,®d¼­j…û+uïWá­a¼|&¿† ‚™|<þ.¤ÏÜÔ¼=¬g†ˆAkß¾½7 Šù áÒ¼éw4AŒ÷Þ{¯'ZºiZ<ËhrT5ÍíóËáÁ¢ó¼!EÛ%ÆÐõWÖjYgEæô¬áäµÔ hŸBÄ ¹¥E T…`×H4ôT…IÖt7ÁóÍ ŸêMaó¯ÁȺØŸ4aécÚnÄ¢B|Ä.fŒÂÎä—¼ájá×äÃ{¨Ö¦CZØ9£·™$¹hŒÒþ|<Ô•¬¬³‡›¹©zƒã~œ1c†ná†>*>?oÝq\Y0Qyá^ªár¤OŒ0ªèÖ‹80±àaÚ1Sϯ˜ k|guõ޼0Å·PÇ1/'°¾•®Ç”ñ6ªP¥g¯nWõUãP#Ð`‰U”žw˜”ŒGp£Ë …;vìxÝu×uèÐ!N‚n½õV–ÇÖ­[Ó@¼È{ ¯öìrÒ¤Iƒ@ x0nÊçj¶JƒÍÓãÚH-óËE×±·>¯+ÍzOaYÕ5g…z[°¥¥mãƒvi’½Õ¥Óbå”H.zŠGqq¿» 3ùeP¢Vže/èã!*:§Ó¥ªkª§°‘á´þjæÌ™ˆ°«¯¾íÀ/þ”f‚.ºè¢Ø×ûóñØçªps9›  02£Ú ÝG^e±NhÕ°ï¶õARU¡j«Ÿïo½…õ&¶s,9==Th ³i]o'—>õÔS#9€'ª|'‚©uƒ—€x|nc­ÒcTuðH¢FP>†½L™2,*Ó•׌߾};¸¿ØC7¦¨¨1P¾´Ž•Gï=÷ºuëæîsa(A¢€µ–ygê‚ .¨Y³&øÃSßtÓM’@g\G…;v€Z¼-áá1ìô„],D;f4Õ‰¥qŒê¡>«í‰ï±E·Ÿg ©O‡pÿàƒÀ^qÃ`À?ç5+ZøÉ’¸Yñt~Ë–-ÊY™'”Œ—§¯¾ú*s2hÐ DG–«‘ŸLŸ>½AƒY±´`#€ž €©¡C‡B˜ƈOO#4yLËÙXñVó»;BSlA%=M_o©õw¾é^3Z3KI%÷ ³^Ö¾ ôûÿöÓÒƒ'iX” ŽL7Òú†qø˜fP)Á±‡ ¬Ë¬­ Ã<øàƒ,7cÆúó`Üîõ×_¿ñÆ mvƒÂÀMÙºþ"aõ:æ[Œþ¤F¶¬BíZã×!ºöíÛ·ZµjåË—/W®[£S§NË—/»Ö­['ÙÊx| BY“ž°+¥|ÎÎÕäÈÛ{ï½Í”MÇר’¼E!ôÜ#ÒÃa¢à oÃw‘§°ÆŸÀÂÕM[®ÇîáöÀ¿Øþt†¥ zCÚáQû‹=¾ ü ¥éé§Ÿæ Öææ/b†ùÖÇÃYÌ,é ño¾ùfì&¤˜˜¼Ñ+¯¼¢AÈG¯9iÒ$˜ÿC=ÄØÓãî!ÐMøÏžóçÏ7q—ªW¯Þõ×_Í5לqÆlg¨T"+H+tɲe˼W\qß„àZ«ø­ž6]»vEÁáíˆ#x4¾†gš8(—mݺuAEFkL$Eϲ+>¢o€OÇ¿•¸¢éT½OÒn=bgAFB!,¢ÈJí6®±ppR[á §Ÿ~:zôÀc Åelç_|±Y³f– >Àø8Ë«°ÐCõ-¼ƒöJ“å½#ãÒ1ý“g̘1räHõ÷ŸuºþåFiϳ,ÞÍö¼ì²ËÚ·o\~ùå@ÐÍ7ß ”vÚiŒä¡–M&óayäÇæ ÑæÉÆ´º´«+Œ0Ú²mqú ¢m•:§cŸî(pªx`̘17ÜpLaàÏy áa.^xá`Ùe£|Ññ# Yµ€}é± H1¹“îñékþ»råÊÄÂ%UEž],Ÿqa~gû@¼u½^vïÞm¯ÄL<¢2yÙ#¡ÄþrâÑ«8”wU˜Š“4ÔjÁ%Í}÷݇nÎ"q‰F&í4p‰Nš‹ƒ]={ö-Ùì]ºtá¯z}4ÀÓÒÞáõäUÇúT’*Í™eÖ¯UZ£¹IñÌ1=ÔÐEÁ¸N¤­äÃïóšS¬q†{ùÍL~õpy)—B9BEl”ÞT¾åÖ µuZ׬Y3`À€sÎ9G3ÅwÜáœØÍ›7GN<ì5F Úc}#ó°·€0YI®@BÏRŸÊägáKÙ¬–™Ô—ÕÊ¡©a?.ëÁSJSÕ²^3œ§×gÜ P³ìÿa~ùïý4Ï¹ä¾æE±x™‰ˆ¥¬„ÀÀ^¢ hžâ &¯3¾%yjs«jE”;6²½Õ¯_=þõÕWëÁßÛn» •VÉø!ÏRh‰µàQv¼sT£F ž‘¹Úp`ìÜnݺ…õ@oçtíÅÔ§þr¡>h¾ Ó¥~8Ö¯lõ…@:ßÿýeZ “ŸÖÕE’æñ¤E’c ã¼À#Kx yR&o,<¿ecêìabÂQ:ÂÜÌ•ÉOôý÷z¦E<¾ÓÑA·B‘œ[Vég#â®É 2y°5¯“O>Ù…©?ü©§žŠÒ‘º5jYJSYIÂ>¯û\úá!mBº÷b•–Çﱎ[ ƒ‚ç&šµŸù ê¹ ¡ÅBÎ[×$#-Œ°Vð >&ó¨e[^s³gò²¹0\í,N–ºº$’e9bíœ04sýѰbûö푟ÅÃ}é‰{ŠÆãpG—‰§žz åÊg­=m;~ï[ËI·óàÉ‚‰&}D¤ÏÐ`™4kaÓ=(%W[½z5C*nóÛOóš…\Åp~'×ÈDúÌçn[®ÉúÔcÊ”€Vp²€nF ´$:¯ƒ·“ÂÐMž<9 ]çRZΗÁUkNùó™3g:Pêª k(>Ú´½TVœ#šEhgiɧêÕ«ŸqÆwÞyg˜Ùs­d´CÍ¥Ù>ˆõMÒ7 ax“&Mêp.Úç’Œ!•"ˆž;>|xjg>t·íäÜËÃ,ZË–-„®]»¾ÿþû{°ñM›6ņåLÉìÈÌC¡ž@l¦OŸ.([¶H0Þ‡zH :“ñ-Ñš3gNœW¢GG]0®wáRà̬Y³L!µ=ztÐiàqÅŠfaåC`Ê2"a$yæ™gà“Q9Ža‡×)©A*°Ô/k½\¶l¢9Ü$fÏž ,32JÇ‚ ‚H#wÀð`8 óZ&?w+Ä“¡ñàò€Â…xÇŽéq-ò+.Ä—b¨¹é /¼€èd„ͳñøã#þ<¡ã²–ÿ[³f Oô±Å¿ÌZep<ýØyU—i»m…&Ö¿Z¤Gc–)lÓ¦ÍùçŸïo™Ä™ö(Þ®_¿>r&·k×βzô …ñT&êÁ¾¿Eˆ‡2•žµioç¹X*AàùÊz*âd_y啚5kÂrÃfáîôže¨d±¥I¶£´(Ã¥ƒTß“¯à¥ñ}¾ÌjÿFOOÂZÎ h€ é©`q!3Oçtüú׿Nó«D&™CaÖÈáaË”+W®téÒŒêõ×_ÏJcKN˜0ÁÌŠ´ÈÀ\0î¾pi"£&@šõêÕ«E‹µjÕŠâïìÓ(#ÙÖºë) 4 ×Êâ\²dÉÖ­[Á!”_ÍŸ?_îÍÂKùÄ£I=iVâàè’é7øn‹–ü–ËíäË`ãâÅ‹yôž t‹œ¦Â{öÙgYäÊ\¾Œ‰2ÄÜxD: ¯_ú`å_pIå/¾øB?7f×ÏêFhÅ@š–Ëêtê¤Ú¯xFFÃ4ÎtcÆ ìbµWžˆÌä×e£Ï 3Û?Å<Í  ÈoA+jq—àÒC‡e„ÍKɽxÃûÛß2ò–*v¨S3#‰ÈÌo¹å–¦M›V®\yذa™¼’Ç­ZµB-íܹó´iÓ¸oTŽë¹–ãÒÒLß_wÝun·!C†@Ûzôè¡]:ÒDÝßÅá†ìqˆdÀ~˜¹´Î?éá ÕŠx ˜&jP;÷@¶fÍšÑU _¯¿þ:ÿB±e`ûõë÷ÄOð/Ï4Á(cœÙ¡*µ-‚™F;ЩM¼#Õ=Oo%м‚.B½ø ¢„K…S+·Ðt~ãî È ð†9Ž×‘íùk9€.b3ùiå""/$ðèoÞ"µCX˜%/­Í—õbéÒ¥:Yi(†þ±°ˆ*`Yƒ7Òû:|˜%TÚm À©]»6Ãk=묳N9唞={¦'Âôе.v–B³“[Ÿ:u}Os*}Xÿ'tŠ•ÿJ]ßyaðàÁn!wäÈ‘¬¸•žxÀ-[¶ÎY)7 á(põ¨«EQ³“8hÐ ¦Û"Ýé ƒ›ÉiÃ~a‚DOÖ>¨ÛWƒc¬É8(ÔXkƒáúþûï™)¿d’¨ænÆŒfâE¥ÒÃ0tÛ}FÞ•<.mŸÞ\7ß|3·†@r-Zd•Þ½{÷ò…Ö­[ó®B-9;Eè‚RŒ\Z‡Ï˜wJkœ F¹êÖ­ »fµð¯4’"Ò¥%utÞâTô<žv²,Áy£_uѧ™‡Y(ö%¼…Íö#]4”,ÒùZÀ7Ð&dJꩨ3Oå[+(1ë Ü´²ðV¸Ög8=ΰz«d "ê' óE–QƒÜu²ÕvíI½‰ã4›´'lÎá†g^µ¦ìL~m”ôˆ3+ƒ XìÛ ¯ƒ(‡Sxî"söÈ5\F%dÆyÁôñÍÝ»w3hƲ*ô4«P¡BýúõÑ)6lF§áÌqé_ÒŒ]Bµäu—.]`³06Èo¼Q¥J‹Ñ:£Šê¦Æ„Z"'2!C¹ã]wÝ•ò„ÃãfuÌi5cÀaõºDÚO«®°õè¶Jë„ äÛáD$fB«êÕ«5²¾y€¤ø¦Ëw&¿&˜C¸rõêÕ¡Ó‘ÒðØã°)uhÙö°bÅŠžÈÇaVtQˆ>p}Myf¡¤ç•*UzôÑGSB¦˜ŽYÌ”«Ñ½ð€~¹Ì•MAûM_ï ‰,šF«u×ß à=N⸚êÃèÑ£QÙäœf̯×ب1ÊÆ8É8q¢ÚÄСC#Ä2“_”/£ÚHêø//ØJ©è¡†¬ŒÔúüöá‡n×®¾Ö™¿­p±xñâŽ;2à<~èÜÿý+W®lÙ²%O¤ÃÖ•}š mK:A']‘è,€‚5õxF¹½Ç‡—,©Ãò6"ˆÛ”†¯RNÅó_lSï—GÐ mk¨(õü1Ï"gÑ\#EDaô:íL‘ÇÓ™\:õfÑÊaÁ£íÛ·óèö_îšÁÝi¶gõÓÀ¥õ4H—A–» @a šÝƒT³mE–Pµ^lü(kŽJ·‘G¼5Zи¶ÈÝáªóŒÌÝÇZ}ÿý÷=½Ò!\ Í…o¦‰õtÕH—·’R»Í÷õ]4ñNx»ñ¾v ¡>œ¥Ö¨¢ºvhǦWæYBëµ ®Œû~ýõ× ©¥,GËO€zë{*F]Ù͘¡¼vÜ„ý¥­ê¨k_DMjbJM ¼9Kù‚±‡sçÎ5¨X¸0”ž¡VPÚóˆ÷¾[¶l‰|œŸ•ü sþüùÜF‘Ö¼îÞ½;Ÿ0ï &ì±ÇZ¯'-^,êy®•.†5äÜF{&­k×®U«V½ýöÛ½cžw|ÈÌsÏ=W¾|yXkzL|ظt÷{ì1öWÓ¦MLgoŠQà ž :0’ã·oß¾¨`¦ÔŠ*Iͦ•’sFÛk£×¾}{ÖÀáLàÉò0wî(:TkP íÃaèñÝwß<'õÊŽ}'1€*#ñ[µj¥O¬ÿb¯Y—U±Ï ÿ\: ÿÔ³ëÁ”Jy°(ø°ž„²e˦>KÑ·"Ô;Š‘Kgþ¶Ø„&‚…­5v½vHFìÎ;ï4E8‡4ªÙAABë5g½º&5™²Ë"Îy›’.#æâ\&€7ÅŸð^Žd,nX&Ë/€K,{©»Ù;[ºá5Yƒæqt«N#m¯·¢‘IÒt·pšš7o¾wïÞx¯Àõc$MïyN"QGAsæp‹¨Y/xzw]hø¯ô˜Æ•áÛŽ¡ALQs' îÄpíK§áÒéb [þÐCsÎ9*T@‚Ô—\r Z ÓŠ\›0aú” iøc æÈ„œ<&‹‘§óiõ–\ËqéäÒ:rLŸ>ÝVØ´É 6Lr•Åc¬HëÊ6° q¸/…8 ã†bUfº<ŠHêPá!ogžyf»víü\ª]»vŒ`ÂSàh`¢†Ž;ŠÉúÜ ,VW rüë¿þ+,ï_vÙeÀ;5‹#Œ.qÂÕ Ö¸gÏž–Ïäg`H1î †n.ðÊ'5&¾¡­¦ Ð+#ÛefOô Eá,ÉXzši{ôré4eS$:¶(’SúªÝtÓM:ìÝÿý´5,¸T8Ö:®äxsPXêÚ6ÒV= ÒO“©fé¶éÑ@ŠY2=¸®ÊQšîÚk¯EQ2;PÖhÇ dõÁ;òø=zô0mˆ™+ Ûx]ÊãEÑÀÒ„04&QœéׯŸ©H” ÞÅú4zYìøš'øBhŠ½Ì oµÄvêÔÉC½,x4a`\Í·üJ³ó£G®\¹ò!C"e™$?X¢iÜ4XvÊû¬?ŒÌÛÏ<ó ¬›MÊ£«>9ºåD²ÐÂëUmܸA©²ƒ)‹fÒü0¬G2\ë¹;¦?¤Í‚w¬Ø¤‘3<Ýà;wî4h•¬V·WEJÝGµDõïߟï÷îÝÛëJË—/÷P,¢ò¹\‘]àÿ#pé0¦±0PEQA‰ÅÀ²¬Q£FûöíYZà'ÊH™2e>ûì3Ð EZÃ.J—No”2gy8ÆŽ†‚F¼CóæÍ=¿Cº—mÎ"é@±yóæ¸F,06,c¸xñbõ=ǾÉk‘Èhܸqà'_ Ø}À>ÛPãLoÖ¬Y[·nuË3ø@‡ç¼z9‚¼e/h`S¯^½Ús=m5ôJ//%(Ú±cG `äW~ÍÔÄ\ðÓO?¥c\ĺ‡@–%¿ÙS }… Ð|­¿ €ˆÃ\Ǻ‡}ô‘v'Òß±f4„ À>å‰t7C2ƒÉu¤µÚm,}Ë¿¸oÔÍä%ó™9sfXϘ Ç¢ZfA±îá>c¹&Ó$Åå^#GŽd£%y˜¥˜)’˜¬Tš{„ù@¢M›6-Ž5YhëBP¥uèR\æZÉãÒ«Fp Ȭ¹sçZÇä‘Ga¥™(oðàÁ©á¨¨±ÖËÈH ,¬[·Nû*;4º.&ïbûLŸ>]ÏÕ EQr‚N"ÅôWÔ]v }ЬlI `Ù# UBejhÑL%2ÑhPÄbÛ¶mz6=˜NwŒ °Œ1"h€ntë­·j©ˆ3/€Yá¿òÊ+uH€.Y²Dü7ÈK M߸÷5C)kìµ×^‹J‹™<‡´M›6…»H¤¥o`Äø 3‹% b0ßÏk¡°<ÿüóôÓ2Œ€#vaDÅmK Z¨ÿZ·WzÀ!hâ¤XÖì y{ðÁY$އ}'Nä‡íð<;Ü W:¡7ÞxcÍš5õšc®­‡rÑEéLnŠ*u F‰£pX@®9â[¦Ö‡JwŠõyùòþrâñ5~nånSü?¬#Õê3ù.©Úa2ù!Z¼E ótÜ®C‡"¬_¿¾V&=Öb»YÛ%ÇBs\úK²Øºçž{2ùå¼Ù­0I^´hÑ"¸Slü_Þ¢~_lvS«qÇn¸Á’¬‡“K›¸X»„[Ýr+¸—ÓlÒȯ(xÕŒT¥ìÐÔÿvíÚµ|A7ãL~føô¾©{ð®n‘'0ýrz¦/e”¢ÏôâPëÜ+ ¾ôÒK™Ù=z_µ‚†Ù¹Ã…¯›¶æ›è;~ÈþýöÛH(¸w NVŸÆ}ZÆs02§EþêpT›)›">’åfò+dòs>h“7ïlYcEµjÕúôé“v,¬3f̈2¯ãÆ„! 1í—¹ DÎÚš\ì›Ý€Æ°SÂdÕªUú/™”/½u”µÚßfäç0Ét½©wd‘¢Ô–ñ¹óÎ;]Ї—œÄáÇ›`9NXbr=Ÿå­nAb:, Føõ×_÷,RĆý¦'›éöíÛc§­L„”žY`Fø-÷ÕîðÒv É÷ô–g9ýôÓyÒÈùsàM-VsöÙgkƒêœuÖYž<¦§q&›k9.eüS^‹Í[øáÅ AƒØÝóçχžñÛ"wZ¶6œ#Pì&žÁ$mH•õ8g•uãŽ@xË~W*4M·Ýï‚À]wÝ4é ‚ôçËQ›íÏÞ”?0_ £ÞR…5kÖhdÿá¾}ûÞzë­ÚîÀ:ÀS nÄ5ÑÇC"ŒO>ù¤963y§Þ –M-»Fç† ®^½zÇŽF©-5Ï‚{æ! 3÷å)ø¯@úÉ'ŸÌ›7/[ïß¿¿EÂÍ£1}<8â;¢ü´IŠ~Ñ´Wgò£o»wïæ; Sÿ裚2Tiba;«¼ñåÍ›7óÍ7¼e)òø¸”Sñ˜AáÉ“'g’Ð?•Ú Süì³Ïœ˔)„j¡:á„5jD¢|9ÌÄ c¦~bLÜ×ï[‚6­rEg:wî|Ë-·H*/L(‚à vÍß›þ—§ÃÌ#’å”SNÑÖT„ùv §vb…£”b‹R/öá‡Z+9kLö·ïPš6mZ®\9ÛA¿BŠÿƒpé<üðÃQ¼2jµ§QÐ3´õÃãêytqi90 •Á+²Ì`e¬®ºuëª ‹Ná1¥c3 °ôgœ¹°µÃ¬¤Ã’¡ݘŸ-åðóf_"/1bVK´ÔrZœHOlHõëËä¥piÙ²¥2Ý€š°XŸË£^z6UUoæ(ΆømغEË@T iÎ F ”sUû—¡·ÿš×|ŒÂ u¡íf’ÄJ¦ú‰b‘iÚ%þåE|vnžr1J © ðٴݘdh  z×®]|éÆq¦O¸V®E\šÅ•ì¶mÛ6uêT‹`x7Ø YirK—ΪžFgØh(×P\£ •üesi›5…§à›†Õ[&ø Døó5@,U^Ä“¶ñ‚[›Û q)s³,£¡4þÐÄÎi†“£.^4ŒÕÃ3ùåÚSž¦LÉäŒè6=4X;K¥ {Êú¸T÷îÝ8-É?ÒQ]½0m agÄ®,SRAziÂ@ÙÁ1§1—ÒAÅËFþT!g–¡F…pF~Q½tøP‹¨ÛÊãr¦2 KäÊ«V­âsæÈìLqº*?Ü´iÓÆO<ñĪU«êZiýß»ëáÙ¤ÎuT(¤A¡K—.}å•WfUª=tÍ=Ë83&åË—WJ¦ê€ùÇPúøÂi§‘¶ÜCš¢M·}î;Ï;vìÈ4IEV„Å? —ö„gÊh §¦Û-¶çáqò\²dÉÊ•+ ¦½ùæ›qV«i÷½÷Þ ZËÛ7ÞxÃó8~»yóæÈ¤ÁßÝ»w§¥ ™Mt”/ëÖ­3b”Í‚Žoú&Å%ß_¶l£33JtM„Ÿdä ãéÒ3P.åA䯠®‰¦ÍÅšÉKÊ_æauÛ`i¡V0t›O\l<o®W« ò–#Ý+C!aД¤ó¡ýä¦ .ÔK'“çÒ6cÆ †HXà‡á…èãìÚµ‹‹#‚EòÎ;ׯ_?¨ËÁ£ ªo™z#£3yêDQé>ÇBs\:m®OƒÎ¦L™R£F-ZÓ™çSD*Âuu¤qéÔÅ×á2·­^.–ê Ó.€€Äg-ZäÈ\tÑE†²÷ÿ#¯ÙP €¼•*U ”ûöÛoçÎë>þøc¾¶uëV ná2eÊ´oß>ÅpU¯~CwLØã`‘úÕIæágžy¦çVeË–Üø&`ÈhÃÍÂH>Cü |`ÏÅÈ¿üòËï¼ó½µo0Cט),XÂ2(M7@6ƒÎ:Ф3Î8ôû裸i„]såµk×:Ý\ Fj÷>|8@ŠÜ¡ŸÚüŸþùp`±ýæ7¿üƒ12àŽ€}K—.µÿü„i_  OdŠ*ÅÐŽ;˜5V~—.]èí¥—^ªS.æj¦$¥3°8& FÁdt àÉ'Ÿ€WiÈרþŠÐÒ2XL¨eù°W¯^µk×v½)† Írv.%'§‡°P¾i4<2??ùä“´œ1J­-èÀ³¤ùo#Ò‡b'ÆCy.ÉÛÔ-9N ^ Ç)*ªDØ«yÈëÖbÎ%ºÞÑL¹OÛµk7bÄ®ã ÐÃð¹c<xÓƒE”Pžçþ!¯……Äôì9 šãÒûllÖ¼™î@BÌávèðíˆâÒYÁ,Fáé¼Jƒ³ÅÙ“¡>‚ˆW¾3\&L`KÖªU Åùµ×^‹ÑCLJ!ëËÊ¡ÖBØ/ýâ‹/,‡ZµjÕ›nº)­1 Ì2¶ù²e˵ƒAC©×ç„¿¢Ï?ÿ|(¢);n¾ùæn\Ÿë„¾o…YPË tB«™[Ò 6àû‰hi÷, ¦»ˆ>ö0ù| É…,@ÖÑBHyÄ%täöÀQµ"r´Z®Å@•\|®9Ža4WªŸƒ´MãIS0•—\rIùòå™ îÅ•™—(OæÙUˆ,sÉaÀ‘ éEx±ÿV~OÝ3yÙ<G74hÐèÑ£=ÚÎ$þÌFÐmIˆ)hh…ñÍ‚Ad±ïЪœ±V²H#ƒþ¹4ˆØçDõ©ôº§=Z¸´2tÉs€£aÆùè°©kùR w…³%Óåj"eà§6U“rX¼•×24V5`å!¦øiø‰é/øüúè£`¯‰èÞ¨Q£ÒÜGsçÎ¥“!+¯¿þúL^j;ËV¼¦tÆ em íÚµ A'tÉ“'ó˜eÊ”Y°`AùÍš5 Qxà 7¤‚ØœxQ#LìmÙ²%¿õÙºíu×]§à;|` v”5•_{õ~ImDÍAƒÅ^pXXóHm6ÎÂ… £?úK¡­ê¸¿}§ÖÉú÷¸äDæbáÒ4XÎÚ`ܟ׸ûĉùÖ2Üyç=ô%;s\:“ïãa‚‰£ð¿ýöÛ,t-ˆZR¯¬êfZ€ã­ä"³5É ð®Y›o¿ývÖ9|ö¸Ö«¡&\|ñÅôÖ¤LYÓ¦Mé¹ÅY`€'Ÿ|rè#Œ6:Ÿ#Å¢«æÿ7ŸIš2qÕªUü¶sçÎVÓ>¸-Ï ¢é<ÿ³Â‚Θ$ª`¡C×Ôã˜ýÏ>ûL›¿êƒÙ<ø¶”O¤éÓÓ$ɱ®ö·ï²5X<,˜b¬rx$pit4¤@5ÐÖÕš™wÖ6ÑþêÔ©c-ÏÅxãÒÑ%u4…š.1‘/º`–fÖmýúõ{õêõñÇëŽk~ýgTö ÍpU³2SO~ýŸ3IÊhW…ø`1î´žošÛ“×{öì ’¦f@Ñ€FoæðH¿)FÃÃÚCYÙÊ"àRîÑ£G{Ô%ròhz³—°®hóùçŸ &öDòÉëÈpþÇ?þ1pÉÚaaçAT´#¿‡"Æò¡²j%f©Š!XXÞ7†¥Ä¼˜‹ÛÔ|&¥7^@ïǃX1û>W»ì²Ë¬Î–Š->/š¹V2¸t4Öáˆ#¾:uúßößàõêÕ»úê«Ç¿yóæ"Lâqriq,Uã5÷ØceƒËœÙÑgŸ}vj6t˧º³Â”]Ù§O&^½xñbÇ|Ú´iag ™«×Mß¾}abš…M±qãF@O@ãj ,pLø/7Ý´iS&χ ó-t R eï¼ó0%²8¿ùÍošÀdÜ2V·mÛŸä:.­p4"{ëÖ­²SïnÜH΋>úȤ|\VWüÁƒÇå.Û·oר‚™Œå‘o»í6ºáS8¶ò®+_}õ•ÉcðΣÄónذÁþs}dV&q’Ï:êŒkÖ¬ Ø7ÎE»´Â%8<@ê™ù "d¼þúëY&nuHy®¦ÞÁÔ¤6–ZµjYVþàb„ît»J•*ÌHä@Ûgã /¿ü²å]ø2/gÑCÑ<1ñµ²LhJ}ß{ï½fÍš5iÒ$8ƒâÏ%O´¿}—É/Ä›×ðõÉ¥d«±•õ=÷×r\úà(¤¢R¼dÉä õø-×®] äšÍäôªÀ2ûèààvˆKÐüŒäêüä FgŠf³‚pX:ÈcNK ‘›¾ÿþû±œØh­Zµ26w»ÀOy{&ßË×â&™¼HúÉí¸5½Z´hQÙ²eCfÑÉÔ3¡Æ­ÃÉð믿¨…/(‹4›|‡O€eŸˆ=‹hà·‘šƒo2 Šl“ ¿ÊG¾<}úôx¢wß}×ó,ƳjÕªW\qE1λ–ð´òŽ>ç9šãÒûTÄXð<òÈqyíÔSO-¿ŸV¦L™Š+6hÐàÊ+¯3f „§ f¥æJ3sÆŽ...]ˆ¼`Ì«U«ÑòÀJ‰fFb÷š1hÌKºõÐî}ôÑsÏ=·téÒÇs Ô–uûí·§ ôâ1gΜSN9ZºtiT dp^}õÕ0PÃIF-¸q/è(¨ÅÆ×ŒÙávôM+1³ 7ù’É ^xáð3*8†áÑmÝÛk¦ª4›ßB_ð0‚çü\žÃT" ´ü˜×&ò)1>ø òW/eíõ´¨ŸÑn`B¾ ÝÀ"5êr0ófòê’#q¦L™âuL’ÉÏhv ¾Œ4LKZ0†l ÔËp‰…´ŸvÚiLb”#ßg ß`tUíÚk¯Í2¶k“ÉËUøªc„5<¢yýìú¿çž{ø&œòó;ÌÓkÉEöHj‡7YйJd+øó!CX‡ÚKµìíïl1Ç¥Zæš}ÚÄ)(‰á¨*Z$Ë·Ú]£€Ôž={Rµ_Ûµk—äV©-dr~¨£E¤Öç'ÁH‘§1Ü*Àüäì³Ï®_¿>Hî‘PV·#…Ž4ÕF&/PÅ#¶š5kN:•ë¤A.Z&2²Wñ®Ã#[j0“ŸîC ±.mØ´u 7gcdÎTÊð ;Í&Þ6qâDD¤Kè¾ûî+Ï[¯^½Ðž`;Q Â"ò9šãÒi‹Ävxâ‰',>‹Ð߸Ÿ†|œ“מyæÞ"ý¡õø)`Òu¤qiá€^Ú mÈçwž@ê‡BŸ%JÓrÏ[¶l+úôé#VÔ©Sr€2ÐÈÈ` á4Žk†Fï©wÅJßJ ¨”;E–`ଘ¿ž4-¶ó…ˆÔ“ÖÆO„AÓe§Ðaw~Hz(¦Çf>i£«†lßrË-5jÔèÔ©Spf~e$£e t?Žì™¿M³,!·ªx&?$ Y0{öl¶ÞÑ“'OösÆAƒ¼Q“18ܵE#‰OÇR·ZZ”ó¹çžCñDžkÊíJ^»vmãÆëÖ­ûðÃlj§¾R]!>x±œú÷ïߣGný³Ú¨uи—ŸžôÂ8R’O[nÁð?1o I'ùWíÚµ;3é…ñŠ·t†»|òÉ'_}õ¿¥“B–ÕÀy^—ÇGrmÚ´Éú›ÚŽ¢¾ =§ÏüÖ„Ø:o G(%é?o‘¡ÞšäRݺuëСƒ‘,•+WFIŒ²¿ÅÒ˜ÜÖ­[õQe ÚSŒÜ>׎X.­’Ⱦ\½Y¥… 66;ˆáIë¡x4ó]{æK×­[w¤qéL~îÖ'Ÿ|²cÇŽ .Ô|É’%†'ÈHë¤Ã SÚ[È• E¯ºê*ý.¾øb7)TyܸqPtã ĥŋó+†ðE·nÝ `r°  —–Ád>Ü3Ö¯_7–÷nÞ¼ÙÄÑ™|çH&×ÔYš1ç‰øCmòO¾É't€N§áX²`ÁäX@è£>ª‹…LxÆ âªÎíÚµãFz8ó÷õ×_âYÈ—™3gr©°~3ž‘ÑÔ´Òf„³˜ÏŽØ’Bùå—ãÇ×ú¡¸6lØÈ‘#Û·o¯-÷’K.T3É•Ñã'Ž9OľöÚkçœsާ¨ºÇ±‚¿•üë,Í] Y$Vó¹ÌÖ\À2ÿâv^YG—BjiÅDX¿, ±ÜŸ1<µð~Ǿ‡®yÂÞY×\sn¬&zðàÁ¼=zôÿ‘×rvé"i <'S `SŽK-?/¸à‚úõë÷ìÙH‰Û,Š¥[r&‰°SÇñ:ðI€ÑJ1™Ä,LÌ’ÉvHDÃj\ 4›DŽþ˜’(-ÅÂZÙ‚ReÍM7jvèHIGŸ}@«àØYrßôMqñ‚ƒfüˆ ù/¨û#˜ íz¦éóÃ?B–ÍСC—âÒÈŽ\ËqéØl.Åf™6mZ ßì§¥¢áP˜>"ÞelCèåÓO?}riÛ˜1cèÛÙgŸýꫯjgÈä'Î$aº¬¨¹g™dÛ¶mË$V¬X±_¿~°ß;ìYFQº $a HÖb°ˆ¡sÄ"½O¬ \#*?Ñã"€Z×”€qí!~ÓàŽTˆ*ZÝ o‰ê]\Ö”qZ•«T©rÌ1Ç,Z´(ÖÒ¶mÛbNÓ2q “ú8F 2#æ7æW†`›ïnÇŽYA=±†S.Í ü•W^ñªñIˆ Í;Fñð}ˆqíÚµ—/_^ÈF0åuè¨ PzºtÑEÁÕc18³Yç i‹’å*\fÍŠúæÛK/½TªT©2eʸ»‹0keáÍÇ4­)¼Ž?þø›nºÉÿB<ªW¯nbÀb${%Ï. €dq˜bŒÇ,Á\:“_w›} ¥Dïþúë¯çÍ›·jÕª?üpýúõ[¶lañ‹«á,Ç^`Ïþæ7¿á;(þü—Ñ£€îX ÿ;ï¼ÌêKî^š²ÃϵHó_OÓø$A™êÒ¥‹6(£ivíÚ~ã7¶nÝjí*Þ>ûì³6lä²H”\…éÚµk.áé6×HùLž£¿UqeÊ^YN%]u âGŠÁìt;•FÁD™³I“&q5Æ¡V­Z³fÍò¦G‚+…™Ê—/@¹ú꫱¢˵’Á¥å¬ö?üáÁ¥ É3`%…ÈãQä2:-âušìØÅ¥͇löææÍ›ïKë½lä`Á(ã)S¦Xȉ ?þ'Ÿ|[ø¤I“&ÂN@4C´lÙ2`Êðñ‹ K7mÚUTøm°AÖ Ü<¤°, V–:ê¬^½ÚÀm¿¼sçN‹ªˆ½À£O$Ð!M%\œ./à!— ××_~“‘jÔ¨1{ölż‹ûÞ}÷Ý­Zµš:u*`Îð}/E'ù2 Óæ›ÞÔP:ƒHBÁKÆ_|ñE] .¿ürtœ{î¹'5š2"•û¾¹’éÏÈx–.]ªì4ugwr¹éc=F ‰CÑe=ÍÑÄÌ^xá…Ìì-·Ü’Ê‹H²ÏÆóZáË/¿<ñÄ+UªôöÛoªÀ <óÌ3Œ°zö¥C½/ê(̓´½ãŽ;ÂÏÄÊàô§`2«—>èÆz8õÔSÙªì¯BÔ±—þ…MygBéT¼í¶ÛêÔ©cÿ²eË¢_ƒoP\6)ÈÀ6D1gËŸwÞy¼8pàØ±c{÷îÍk–-ùÈ# :ô˜cŽ9ýôÓ;vìØ§Oþ¶mÛVTéÕ«Ú(D%´e^sT»víŠ8Xºt©oO8á„Î;wïÞýœsΩV­räûï¿gIÜ|óÍPSºÔºuë ¨þ_ýõ0ö•+W^{íµ't€|ÜqÇÁ¯¼òJn4|øp ¼½ñÆ/½ôÒFuêÔ‰gäs]¤¾:(r/6ø¨Q£¸¿ìnö8ŸÐmFTç"ãÆ«_¿~³fÍÌuyÝu×Ì<Ñ 7Ü€àC((þ^xá…4W&ɾ[Œ²^›<¸mlïW\‘«{˜ãÒûS´Ê,`V2«Íø³j—¹­4襎Ϳ¼é]*9wžÁ»Ž4.m¶Š>øÀÈnî“ýùx(M<äÒõ—¿aFfüÍþ0ƶÀ¢¹ ÐÇæ9s&xòôÓO?øàƒ «¶V -:7B O9å” .¸¬ëѣǹçž{×]wA]€‚#F 0D¥Ïýúõ3fÌM7ÝÒš×+W® ˜4EFª :ÄþÞ{ïôø¯'NœÈÝAo®Ìjy衇Äa~Î@ì¾}û"`€ü°åv\Ê€hÁŸ>À˜0÷±}|«xë;Á oß¾4.S¦L½zõøäñÇ¥"îþñÇÃcî[ªT).ÚóN½úá‡@æ4”ô;&Q*ˤ˜ñ/“ïD f[1°.0ó¨{l𮤕"µÝ“[pq%H| -ÃlèMéSˆ‡É»2yqú ‹ág¹YøÆ¶}ázö|ÙO~üñGø?#©nÓ«—þåÍü“©Ü/^âZR¹tà¶þæÒ ÄèŰ\}ÉlT qïÞ½zNºßAð: ªŸþùÀ¤fÍš|â!/`ÅPP@øw¿û×ÿÕ¯~š•+WæÉ¯LúÔ°aC0“ådÉ0_<½õ´iÓ>úè£ñãÇs5¥‰Š·àðܹsy @Û›Z)Û(\ôd ˆ$–m p¼–É äéÖ­›ŸÓ1Íj¤€0à Q7•œdøÛ´iS¿É2@©·¯^‘­y÷úë¯Ë%„MÍçs8A,«”M™2…~úm"©\Ëqé´éÀàp6T]3$ì³eIêHÎYTÏeFˆ>öjÅŠG—†CêO«BmÎj±‡Yµ×õžµt¬¾Ó\A8¾@6Þ L1Ú¿bºµTªÚØÚÐÈ &0J>ú¨ÀÅ'€Ðç ÐZˆ%’+ b§žz*ü¹2ßAþÒg ½qãÆà*¨+ºòÉ™gž©Û škË4€"¶‚ò“O>iÞ¼¹V“-Ó1~‹Ô°Þ77=ñÄé¿Tð­±.‘æç€-cÈòâþûïç⨈ Ó;£>´hÑ‚28êõë׳VCšÐ>×nƒ>óp¹Ô šºUD+:™rl¦Ì0ÒȀʯR"ÍÛÑ£G£Œüì:‰~©{UTêׯό |qe«Ô^é;\1QÒn¸¡7‰M›6Ñùø‰b@Ó!mî_ÈwŒí‰ÖƒFlÜ¥sAÇðÂc6s\ú›ðk„¬£“—. |"I£ÌÐÿ‚±O<ñÄ!C¦OŸ>gΜuëÖ…x]¼x1‹áÉ'Ÿœ8qbÿþýÇŽ;uêÔ°¾>ãÆ»ýöÛ{ì18y÷îÝy•U‹_µjÕ²eËžÊkàÿ½÷Þ‹þí·ß*>^¶U‡ ÇÈÈÞÎ;ÍÆéÅ¡|ÜtÖ¬YŸ~ú)"ù9¨Yô©ÁEš5kÆÅ·mÛžuÐÚ?þñ~ø!—å üö¹çžK©86l‡AB0œ[lݺ5“Ÿ ¸{ùå—'MšôÀð°ƒíÃ'AÛ²e ODè3¿¥Û}£<¢oú‰i…(FŸ¥ˆLÖºvíÊp!Îî»ï¾ Íqé‚véð†E~lñ‹CŒæ•Í$¡èl(XÓ‘Æ¥ƒÆH_ÑåÏ?ÿ| …ï/'^AÍš'Ðé>úH›­ÉŠß~ûmsªŒ9’¹6]FäÇ)bÖZã‚Üúé§Ÿ¾† °ë~·`r÷ìÙôr¨' <ðHÇR?j.øÆolܸÂÜyôI»)¯÷jH‹-zî…A8º—É+txÊ)§XæÆ›òý[o½UrÞ¶mÛ‚K«&#©1?õ3dlÿ’×âºgÉ*´¼X3Öp¿øà¼æâiÁ>iʈÎ-á‚.cáËí¥q©ÂãP”˜úöÄ¢åRÈ‘† rÈÿ»ï¾›É/‘¹¿ÆCñÔî$—jW![•ΣԘdÆhˆÃfÃÑ̓û"—é6âxРAª„öØcCܨ­íëYHÑž¼lÙ²X!|ðch®‰°^W?S³õ:øô\G $ÚoûÛcŽ9¦R¥JÑÿB˜•Ñ‹\!KJð¤¾p¹v ’‚ñŒä“O>ÉJ«^½ºSÔeâŒXŸ:'"¸tn^²šª:ã[o½5bĈóÏ?ÿ¤“N>|ø_|R Í:«yªð0ù\;üM#íÿÌo:? (á]µjÕ*S¦Œ ŽØœ‡– ÎÊp«åPwëY³f­Zµ*“”ªm„”¼L;Æßâ}^d´Šý3<ýôÓ›5kfá郣åì»»ï¾[ŽÝ»wCE¸à¹çž«‘–a1Û[ÉXÏbŽuU`#<cˆJxÆg¨þ«(#÷xüñÇ{÷úýïo™+®¸âÆoüÙsše@`ùœõƒödHËŠ+RùeZȬ ßîØ±C×ô_|ÑKIQ¤©,˜Î;£…ÝtÓM _ÍYYZê!jÜÎp™Y5q²Zêg¢«6j>dñ¿ÿþûo½õVÏž=ÙÂè}ôÑå·¬uÊ8ÿîÙ³%«zõêóçÏ7 ʼ1.?V#;… >öØcÒx—äü0pi“Üfò wìØ1Òú¢iÓ¦lyƒ1KDó,›7o^µjÕâÅ‹Y¦ß)I\’ ‹D7¯½öZ¿~ýtÓ*]º´ÑfÇâ‡j|;(mÓ£I¥íPbråÒñ·7ÆÍ-guVÈ}ÕbÝwß}\ÊSÂÈq›—há µº]jÙÐÃÉ…kYÔY˵b׆âõW_}5gÎèVãÆkÔ¨<õ0±L™2ÃæùwÙ4XHÖ¶øßó›áÏ™¼¤šC† 16¹lÙ²rŒt‰úP’ˆ&®_¿>r$¿êª«Š1³Äýò )aAÏ¿þõ¯ â*Uª´jÕª^½z­[·îÝ»wñ†®ü_yí—ïSM Ú휽{÷Ââ.¼ðBäÎîÝ»Ó ýâå–EÒ„ ĨϲiÓ¦:´lÙòøãG:Gü!¨Åk‡?ùä“K—.ýÖ[o¹Ìb±ÑgV#t€lÐ\ˆaаò¯˜ù\:­;‡gµFSB‰÷»ßi’Šd±¬q™eî0ßø›o¾I÷PL~øá½+ÓÍx¨M¶Ï_¸´Vñõë×÷ìÙ¤b›6L#g‰Ág † ³á®¨=öX ãÒz¿G µ6VW£F*W®œÅ7 BÌùx­~š&B§NŠn ضm›iWµ´žhmõêÕ,×öíÛgòÓä¸t– O!Yÿ5LjéûRÎfá¶Ø2%@ví­døx»Š`x¡+ZÒx.õ|Piø5;%ßç“ø}öÙgÅkÓ0 Ò×Ö9hÓV&ÏÚ aæ:Ï=÷\$?¾·à¯©%cU›3Í׳gÏ®[·®>< .”h9ïÅé¬1ݘ‘VY阖-[Æç×\sM2õ?{ºâL–3Ç.ŽÒŸañ‹# ¾ g~ê©§Bûº¿ùæÖ Ý3fŒkFå4 \‡zÜ Vöäí—_~yÏ=÷ :T?ú.…G{s~úé'-ÌË;ï¼£q Äpi¸ÖŒ3&Nœ4¥æµnÝºÉ )}à²05çb‹ª™]9vñæÍ›¯¸â [i„ùýï/8œ@ܹsg©R¥N:é¤Ð…s\:m`òœ9sêÕ«gÕW;ꌉXk×®]¡B…2eÊœuÖYO<ñ„±ó“'OF‹,_¾ü!C<†Ëµ#¤í±‡¡ÅŸþùîÝ»¦ABN8᳑ü×ß¶í\Ú@Š—H§–sŽ&ô_xM†eÔ¨Qú—²yxààÏ‘¼î¨nð=Ô~÷»ßA±Î&ˆnܸq•*UÚ´icüÿ'¯¯nZÞ{ï½t2RRD¹[>Ÿ;w.â",Üw‚ û}^K¿˜¡È¢â¦Ôß#e¤‘ÒÖ"æ3gÎDÛ²Â#;…N²Tèᆠ:wîüÁpY—ePèÃsn•Q¼€äÓ¥¨øi‚܃3£Q-|½B-»%†K—+WNV|É%—XªGfÝ0 råÊ,¼/󚬘ˉWäF›ôí“O>i}yƒ »Ç.ÑÓ‡~Xºti Ê¥s ñÒ&ì3JM›6Eé˜4i’;85]€Î6žÓžzê©SN9>óøãçFïÈiG{NAË?ýôÓ~ýú™P ]£qãÆ¼¸õÖ[z3"¸d@“†UZ3½F–Ö8pà‡~˜*ÅÒ¤×]wݨQ£„ÄX{7Üpâ x f^IøŸÿüg ñ̘1Cáˆ:޵¼`rµÓ.Y²Ä8Ü;wfÙ¦t'`Á¸qtÛ®X±¢|>ÆjРAÆ Ë!dqµ’W«å½÷ÞcK~ñźä…"écìi*›4ÿLŽKI‹j ŒüƵyN™2¥oqÞyçéÀp8•µk×Ϊè¾ýé§ŸÖ­[g¶Ï¹sçF`ø-·ÜÂ'W_}µ&²\•–—.*»MVö (ÔbË–-áJJ·EÝB¸“…;ãôÐâz%c*ã•a™={öÙgŸí†•aΜ9Óÿ– ÝÁ‰Š[·n½í¶Ûô–¯_¿þÈ‘#wìØQŒåb£ij;)¯­^½š…ƒe¡òyëÖ­o¼ñFó¢ácy"~¥ÙÙdÒ™Y—=/ô¶åstL=^´uÇ‚ìâꞼضm›‰ÒÊàО:uêÚçZŽKºæc~ýõׯ]Æcæ¸t‘7õÔ–¾}û2¤—^ziÑÖ9òìì / Sjn¾ îëöíÛ3J§Ÿ~º´™•¿|ùr ˜\Z?OkßtëÖMæ“ãÒ9.]$í»ï¾ûá‡þô§?™ï.Ý¡ÿw^KQ·`ËÃÅJ—Ö4 ÅbB¿øâ Ø”6LZ¯^½¢¬RɈyüZá~°råÊ~ýú1¹Ã† ' Èg±'Ó¦o’üQ£FñÚØ;w–/_þ®»î ]°âyVCgdc^tÑE\ªC‡Á½.\hé¼yóBQêÑ£‡6 §[?Lbyf‘Ñ»víjÔ¨_~å•WÜø ÚwÜÁ'çœsN!s\ú)Â<xÅFîÔ©ÓUW]¥µ$Œrn“—.Úæð¾öÚk¥K—®X±âªU«"ˆ£HÚ»ï¾ËLU®\YOB]ìrÃn3œvÙe—U¨Pá¼óÎÓÚ£7]¥J•äÒ®|PºmÛ¶|Ò¥KE_Îùxä¸t‘ôÂlš šyÀ¢¸RDEµjÕêŒ3Î(oË”)S¯^½à“lö¸”I<âÙ·oß~ï½÷2 ½{÷~饗üÐØá xæŽ%Óz¿þúë€ÒçŸîæ/’*^<§÷Ýw_çÎ׬Yj7ž5kV&/¾Û¿…Ç„Š¨_|1?lÑ¢E¬á+VT©R:½dÉ’øò5×\cÞ°D…a*ªÎyæ‹Þ!ñž0aÂ?þ¨—ˆOr1/9.]äš…,Ú(˜7Þx=N½Ø-žãÒE‹œ `<Ñ—Ì xEeâ2¡&ÀÏåp‹‘J×^{­–Š0} ¬·E‹Å÷/¼ðB>¹þúë#çR.Æ6Ç¥]3+#\ˆ€$L™2eæÌ™…|ŸÇ<õÔSc KÆJ>„ÄŸ~úiË–-»víÚ³gOø­±³¢ÏŽÞuk±žôÃ4÷²ëÁlŘ·äûᅦ00þ eTi¡ŸmÚ´)_¾üÛo¿m*MF…—H<_~ùåréL~Q•_|±F,ì¥K—Æ—»wï^ºtéž={ªf¦#à¯Ls—ÉK2yòd® V7jÔ¨\¹rt/‡9.]„{6ò”fý+vnŽKº1ò¨ÞõêÕ;ãŒ3 ™¼Â¬E{¸“u÷Ýwœ+Õ—¶Ôïä“Oö 6{ì±Q5ÒÖ²eK¾3vìØP‚rFþ—þå Œ ¢¶ ñÐñã/ù €pƒ/¾ø¢ð<•+WnÒ¤IJÅ£}ÿüç?gIXÆ$†‚=¨%¿$-]k_²ªãm1ºˆG)«yóæ=òÈ#Ÿ~ú©ô¾L™2gžy&K—×F»ÓÉÔc¹`ó)n»í6+h3›ªpéêÕ«C}µiH6:vìÈŽ0`€²,u쉜x~ÙÞ´iÓèÑ£ßzë-¿ðÍ7ßÀóëÔ©ó³n'¹–ãÒ‘È*ž¥*j²–Z[ Ç¥‹VÖðÁW]uÕ 'œ§¢ÝãˆiP¨bÅŠÍš53 |ŽK§Íãã?þ¸uëÖˆ€¹sç~öÙg ÚË/¿lÆHFÁýõ×_oÞ¼¹J•*]»v–™»œ…?Ç¥‹ªŸMÐ SfÑasSÈ  ñÒ‡uÀa²¸tÉpCúë_ÿ 0:Ì##8É@A™bZKÆóZ>;åɼ.˜OÏÌb줬 E‹`ãK/½ÄàôÑGìµN:9Yú0§94 Ù=öX©R¥†(z}¬\¹ ±téÒÆ­¨u6hРR¥J“'O޵Qªyw8Ì·ß~ËRQó‚ŸOš4É"29xÌqé"lÐ*‹Ú!ë †Þþøã½"©Îqé"oPh}«V­Œ(1‘l^ùðÃO>ùäcŽ9Æ´Õ9.í§Ÿ~ >¼páBsÕ.Y²„ÕþÚk¯YÒë©§žB:ðW›Éƒ>è‚ÿî»ïr9.]´M ýŸyM€'„Aà Z ¶š5kz>\Úàµ0•úӟ؆á:Žrݲ¢µ6"X¯äãéþy-“_ß!È33Ë ±püá©-²ÏÆø«¯™¢ðõ×_g:ÆÇë›o¾9fêgô=þ†s)DsíçÏ=÷\… ô¾æyÑ¡ø¦@Ðl¿“ÖŒ #înšß?þØq»ãŽ;Ž=öØáÇçà1Ç¥‹wŽj. ±d²¾øâ w®U2ùe’áTf©íþùÏÖ(¤?=I|çwöìÙBÐKñ^°sÁP«‚¼wï^ÁGÂLOèÃøñãÍ“©ïhY´ùŸÃ‘ìºë®ãFwÞy§.”áºP{ ì}ÿW~ûïü‚Ì Œ’†ì]üY”ò( ¥gÄi)Ƭ-^¼ØIH›LÞz×\sÍÓO?ÅÜ ÅÍäræt“—>Ì—>…†Y`Šg¬V­ZøìEŽâ\˵CѾùæ_è#µÿþf£bùEmáºCÈš—_~ùÊ+¯lÓ¦Íí·ßÎÛ¥K—wÜqì_˜ó'Ÿ|2tèЦM›Â·7nÜ(KG*q H`ìl-)-¹ï¾ûÌÖîO&MšW?’ æ¸tŽK½vix,Û<¥[¶lyä‘GäÞnß¾}ÆŒlÛ>}ú )+à“=þøÇ?ÂHÙ×§vZÅŠ!`ðL¡€+ð߬38˜*´“¿ÚO¤Ü¼¥ .lذa»víÌéµ+ÚBÖÙá‘gÏž²ß¶m[Uøt¹ç¢q#ŠÒJB‚TW'üµÄŒ!iIˆÔñÈo pš×—a~ Hµ¹˜:>çk äl~öÙgq‚˜çzä¸tŽKçÚ?Zí}ôQc•n_}õU,T$‹óg‰+ Ê×þg^ZA]¹ù´K—.-ß`_xá…Ë–-·Óµ]p‘k½´ÿå_þ…zæˆ4÷F½s\:Ç¥s\ú—pKç‹-ï©/Fͳð– Èv†&õêÕë„N¨[·n£F7nlñͰ°Ê°»šÀG† hDz"ï¤ÂO&“ØŠ¹ã®]»Æ?kÖ,;Ưè@Ž'½Bàšßÿ=O„:o‡Zƒ˜Þþå/¡<š$Yß6>ç;Èô Q"m³ˆ­äS?ÆPÆ—'Ì]ä¼`* F&Ž×/¸à‚ð¸ãÙdf35È›:‡™9.ãÒ¹V‚›'ªüñI'tì±ÇΘ1ãá‡{5+TD‚x˜®d³ˆ{ÜÉß%K–Ô¬Y³B… óæÍQ³²¯ó6²¸D!ÈÌßúxÐvìØøëÑ£ÇïÿûgžyfÛ¶m¹‰Ëqé—þåýgkCù6lØpíµ×šÈ¦‰•¹yóftaþµvíZd ‚ÿ²=´b‡~÷Ýwˆ-¸“Év‚?gò\8tÊÊäE {÷îå¿ZÂ!ÏÁÇ`°Ðï/¿ü2ܽXE*òEøÈa"èÔ©½mÛ¶­Éÿ¿þúkþÒIÙx|Ê¢$:rìï‚A¤#bÚø&ßšbñèZÒû̶råÊÚµkW­Zí#-¶ùñÇoÁqcÕYQéI¯™Ó¨‘k9.ãÒ¹VòòKá…̲ê}:uÊ”)sÇwÖªB΢á„XÕ³gÏN׿ôß²eË0àüøã"¥àÛ~ýúé1ÂßéÓ§³eŠ1f3×r\ºpéðRÐhÌ_Ô^زUiàQ†éÅFƒRò¶víÚÌòˆ#x}íµ×¢ä6hЀ×ЭLžãü™·\ªnݺ¼€6»ßçÍ›wòÉ'·nÝzèС\¤\^Ó”½Ï5S´©!R€âI«T©RºtiütÊxðàÛÚ¥ N(|›ï¤§ŸLjLàqè…¤E=ÂÏòý÷ßøá‡;vì`Ñ}7nÌ_ƒCÙòèGˆ ==ø¼cÇŽ ט1c.ºè">Ñ+>K¹ÈafŽKç¸t®•à&Êýû¿ÿûܹsÁÉãŽ;®Ú¶m[˜’2yG´˜\€ýüóÏ5;›ÊƬ ´ûî»/Ü9B¢U¯^zl¦L™ñ^¿~ý×_²aôí·ßÒ'žx‚‹N®Í<—_:Ç¥s\ú—´~ø½–I’µ¢ö™Dý4¨çÙ„fr`kרQ¬øä“OøÚÖ­[c¶oßnþ4'Ø¢†ÎN;í4èëêÕ«ÿíßþíŠ+®€Nó¯È0 l6 …ûåÍR<‚st÷Ýw7iÒ¤ÿþ™¤yþùçµÃG¬ëìÚµ &™kÐg`jôèÑË–-ûꫯ"!Y´©Hi3¦Ò -¦#Ó.mlxØURBÂ7ùBÛ¶mo¸á† ´lÙòƒ>(hb¹–ãÒ9.k%²!­¾ÿþ{ U¸t¹rå5j´fÍx¯î™¼ÃÖ‰©WƒróÛ_|Q+V­Zµµß &€«øÃ ,‡/»ì2^O:õÌ3ÏDN!ŒB†‚íß}÷Ýž={J_|ñ‚.}üñÇç&.Ç¥s\ú—7˜ÞoûÛx ã½ä’KØ­ηß~*e9ïàÌ,d¸L™2o¾ùfåÊ•‡ýÿí½w|UUÖÿÿ¥÷z/‚ˆt*ƒ¨‚X@Aªt ]št)‚¡#E@¤FQÞ[h!BKBÄÁqœyÆgžyÊý½_÷ób¿Îï† %¹çFöúã¾Î=÷ÜsÖÙå³>{íµ×8Ðä@ã2~â`Μ9 E¦/ñ›6mÊ× ðõÙgŸÍ‘#‡®7Qæé@(tíÚ5!ðwóp>”€`ÜŸ§(ž™äeÛ´i£Gk‘ àóöÛowèÐAÅÂe `‰ï½÷Ä[ ‡††ò.ÎM`a¡”$?ñ²«W¯6e¢ÅŒ©®aûL2ú8@|Æ@wõêÕååhÙ²å=ï–8ÆŠåÒ–K[ùãÑiË’;wnMÔòY­Z5L†OO¼ÏM”7O^ y6øä¶&ibÆ^sܤI“W_}uóæÍ 6ܵk—v”Kê)Zú$ûk•[±\ÚréGñd…"Ðûâ¥ÎÅW(1g誌¦u _Ó¤I™Ä"ÿðÃf 'Î3 §×‹KgÈŠU¦LÌ_¿ÿþ{x,cábÅŠ™”ŒÜ¡ßº­@ƒcm”³•bÉÎEiœr³O)CužxàÀ×^{MègjSXEd€þüeêÔ©™2ez÷ÝwÄÆÆrÀë3ÊЪÌÄ¢Q¤œv¢ÑæeÎ T×q4 ¨P¡ïÞ»woè4MBÅbƒ¥-—vWxGú#ýŽÎ®døv@g%åDåÆÏ=÷œ¬á /¼  ARÛûí·ßć“w2I:uråÊ•?þºu늓›D[|*½’Ç Ò¼ys,¯¶² æ'»6ÜriË¥(íñ&s6\:K–,×®]÷ûüóÏ¡—[·nÕÅ!!!\0pà@Žƒ‚‚”£ÒãIç•ëׯñÅŒygÍšeh°"âââä£mŽŠŠ-ª8GÐüzûöídß“Z‰ïL)‹\X|]´hQ5´þºP¡Bž»!dh W|ë­·t|êÔ)ÀªH‘"ü ;tèÀ_0Ùƒ ’oVä„Ï7Ê;E§LôPJxÍš5j0”Fåʕ۶m{á•JlÊ ï(p®W¯^£F( `§ 0Ls[é“Z–nÅréåҌ֡$.m¬¤œhßÉ'NtîÜ9C† r(a*Uª„)2¾åä] Kó†!+VìÓO?-S¦ÌòåËö”–oŒËÊ•+¡Ü€@Íš5±Ô©¹sçÚœ¥–K[.ý˜¢N$RDʼnLFDDœcX„—¶’ÒbìË¡C‡ÞyçZµjµnÝúÂ… r anŒƒ:¹úË/¿ps,lš4i*V¬ÈýÃÃË)2hРýû÷÷”s±úõëg̘QÖ¹]»vÜÁB´åÒ–K?¦È¾Ð•èb0Øùóçà ̀‚­[·Îœ9sÁ‚[¶l1™á=Þmž†>cÆŒ}ûö}ûí·Š•õxg»øìÙ³çæÍ›CCCÅaÅñññG=zôÔ©SÛ¶m ±Ô:â‹/ò5¥¹´ó¥àÆÃ† SʾìÙ³_¹r…ÑŸÑÑќɗ/ƒˆ¤¸ôìÙ³ ( JïÔ©“íöx÷½ÒüòСC»víúá‡jÙ5%̨„¿«ˆ ÜŒ&(“È·;Õ¡ 4ÞËÞH[ÜZÀ´\ÚÏB_ÓP×m‡VRÔ’:M̵k×@E3¹)º{ûömÍ’$#w•Ç›ƒ7Þxã½÷ÞS¿ÆÂ&Å¥‘ÈÈȆ æÏŸŸëmfiË¥-—NÑ>wZXGÝ™½G}öìÓ.„Ú²ÄãH|õêUÁÂ7Ô££¢¢ Š&Œ›Ë„q;^µjUù¨ P¨P¡~ýú™G¤tŒ‡Xë®]» îpfM›( FôªMçN¯>1•+W6KÁ"EƒCÅ›6mZºti× sΙ3gÙ²eź¹BQO“&ÍÈ‘#&¥J•2‹1SW°tRŸ3ÊÑmÑÒriÿKæÌ™ .ì4L&µ£+É.>¬all¬6 ð (RúPÌ„’OúýäH²‰¦K*ƃG£Ã±cÇæÍ›—xë1+–K[.ý¢bôz¨/]ì_^ñÜMòlVÿb,–kh’!ÕtÉ3gΘë9yîÜ97 ˜3ÿg”âb¬Íòø•sæ—ó¤ØÚCtH¼öPÔ4Z9‡y¨Â˜=I¯=TŠûZµjAÅ[µj¥»Á½Õ hüK—.å [·n×®]£”üS—Õ¬YSeKÉW©R¥Q£FRF噺¶JTvS“4B`\¢ã +–K? 0.^¼¸åÒVüæ•ÂPþÕ+‰©²ì¬,¬’Ý%×sµÁ® ”ëÛÇž:×j¢ÐÙýµÅ­­AË¥-—~.í¹;9e¶äP ò©à.ÞHÅÆO{ùòeEzð“Ò2›^¬M”<^7µà…ѱitØÉ^¡¸V¬X¡_õ“HuŠæÄûÅ+0[”çe5<dP#Î+o[‹-POLþž9ñž{î¹fÍšEEEi·GÝ|ß¾}Ú]_¡Ù"Éïæ5œ Zëæ‘‘‘¦â¨¹›#èFA)àÚ¡]k%åD!m"Ò´7YX®ix|r¬Ä2ɈÀ²ÂêË<ÔE“¤râ“Ê¿PO{š[µåÒ–K[y|¹í"""7nܤIx¯Çë?sæÌòåËûôéS¯^=íç8|øð£G*PäÏþsš4i8Y¤H‘´iÓ¶jÕꫯ¾ ß¾}û AƒªT©’%K¥¿SË•+W^{í5˜v¥J•2dÈ1cÆŽ;J¸wR—¶b¹t`Š:¦çn¶sË¢­X±b¹´åÒVRH´(Ia S¦L™>}ºIýÓO?EFFîÛ·ï믿þüóÏçÍ›U6«°/]º´xñâ¥K—8p`Íš5'Nœ0óÈÑÑÑ[·n]°`¼šcã›ýÿøo¾ù¦ÿþÓ¦M+\¸pûöíeå9¹gÏ[V,—¶\ÚŠ+–K[.m%‰sUÈÆÕ«WoÞ¼yŸë<Û†ÙÎX_O:Õ£GfÍšA°ùÚ½{÷Š+¨uÏ‹/ZsoÅriË¥­X±b¹´åÒ¶m¤.Iœ}âw¯ÿí·ß~ýõׄ„“ÕDkZ5 ¿víÚ¿XÑñªU«Š/®ÝK”(1räÈèèh7^:<<<&&ÆZ|+–K[.mÅŠË¥-—¶’ŠäŸÿü§–‡8›®±¼Z­%$ûÛßDžµnšO®‡ÿôÓOÎT'ü¤µ„†¨˜=׸ìðáÃ3fÌèÕ«×üùóµÂÑ,ê´¹Z±\Úri+V¬X.m¹´m©ŽcÈÃLÓÕÞˆÊ(Â1'•ôÃ0mŸú…œ˜EÙÜìãããM#K§­X.m¹´+V,—¶\ÚJ*†ÉÉ ©›U^hiز3arLLŒ²ýýï7ñ!m¥éÖÞ놽h•"ÌÜ$a†9߸qƒ‹i*\¯ÌÒqqqÚ ÖîBeÅriË¥­X±b¹´åÒVR‘ÐbMÊÍ[·n©Í“è’ÌÉ_½âÌÆ¯ý‹ãüÑdùðÜõ3›ý"u Q×1Ðuu.ƒlÛ½$¬X.m¹´+V,—N½\ڹў6Åsù!<ùË_Ä£R#—†Å]ºtéÁ3Q¤PŒjܹsG›«&÷pn†.‚í¢E†xót´¢Ð|vŸ”hã­äÝTëDhê˜1*þ6ˆšà],:Êö&l1jJðQS|äý1¹3Ø5mÚ4³A§'Uí\Ï(Õç­Q>66–ñ/=BóA¢ÍÚ|*и4 ð ô\S§îöÓ üo^qQ‡ßÅ=zMTT”ë;÷QV4Eí–«뺽§˜ñj,}ÇE¬ nĵ´)¤2›-ä¸ÌÅ"Õ>;‘‘‘Îýé¡Õ9w^¦mË/—.]º?¤_šºãá{t^zĵk×âââ´?2­Žƒ«W¯†‡‡§.ýóÏ?£°š(ïò¸”«aÊÊàO Ùõ'vÑ"‹Éƒ~T¨©AÚ§“`(ÔÄ]î 28IBÀi)Få:ë4ñæ¿þÔc¡¢3ÒÒTºŒÚ¡É|þ°FË™>}z*åÒ†>‰ @´pX~ 3ñ5ýÒfïf —L¶Ì@ó!øœQ(Z ážéªœ¤$u@œ¶L|‰{ÎÁˆŠ×-}àT€›´¢Ne´»f„UÑ\ ÕLî–ž“OÍ>;¹ÁCÝÁs×=Kóæ@{ºýÁ¸´fÛ`þøãÐf“·ðy¯ÔÂ¥¿ÿþû+Vˆ¾Rõ ’ëþg d”·iÓ¦S§N MQmnذ!,,,)CãÏB36Å ¥÷í·ßš†™3gNÚ´i —~Nî–hµÝÐéÝM ,*.L.mæ²W®\9vìØ ŒìÝ»÷ÓO?…¯j=ˆ‹V#)Ü1bÄîÝ»¥­Â{ûì… ´úÕs×=ûh¶{Λ7öÌ+‹u¤¢Œh¶äæMKSkñññT. ¯k×®Ï?ÿ|LLL •³œÀ&L`Œ9qâD†Ã€ž‹5)Ü+[¶ì¸qãfò“Â/ÿË+îŽÍ5îX°`ݶsçÎÎØÚÀq Ú~W¬|ºndÖàËÕÌ+h¿«3ÂN.íñ&(È;wæÌ™móIàÒôêNþ[ _wíÚ% ¤ƒ ÔçkjáÒ=zôÈ‘#õò¿^1TÇõÒî-Y²¤L™2ƒ L.d̘q̘1:v}™$Zi1ŽÇ;Ñš>}ú   S³Î ·l±´6lX·nݰ¿htg•žz½Bõ\ä jrÔ R#R¿3fÌ ój$blÊã8‘-Z”)S&x&`NM¹¾bë„Z£d¨¾_ýõòåËÔs_$ (h\Z 3á~Tî7 ÒÔ¬—¦á”¶UQÛõ ŠÄ¸‡zËùóçPA«¸gä?ÇzŒ;Ô­†Žzµk×À¨ C¹lÙ²¡$4­Œ î²h9 ôÉX)È+rn8r—[ ÉŸ??ðòh|ïIˆñ 3 ~i`sæÌy饗žzê©gžy¦M›6«W¯6EZ¸ôàÁƒÓ¥Kç¹›Þͼ‹*8t^qFÇ… 5jTr-õ*÷“O>QWr}™$c3ºvíÚÚµkKxÅà9 ØÝ9YŸ¤‚ýúõkß¾}öw%Ïœ9s©R¥À7å p1†‡î •¤…°t“&M¢ùaûŒ5yd§´déÒ¥Y³fM›6m*åÒP»Ù³gÎ!!!;vŒ±†sK%R€Æ¥Õ/`2ZÔ\­Z54 ÀTòÿwíÚ•Ò1b„æ®Ï_$Æ=Ô4h‚((F­árרiHNq 6 õ^|ñÅÀä9&ê 2„ºþo¯¸‹Ãh³à—Æ&N匫ä­øp½Q#wîÜ[ÙG÷Ç^{hòƒ{»ví‚Hó‚½{÷~öÙg1@5Ú´i“ᢩ…K;ÖŒ¡T4Yg·è1‹â)= ;ÐÊŽ Å¢©£Cxõwç´…[ ßàÉåË—W®\él~¬ë+%ÂF°ºeË–tŸì”¤*7S¦L§N¢5ºë—†þQhà§V-y¼,'L˜€†NÿÌc7.[¶,[¶l†KìÚ¨ÄäRkÖ¬©\¹2€öÌ3ÏÔ®]£ vvLz.+0ã¥M€:ÊgÈ!0 <0˜¼Å‹›Æh¸—+W®©S§ú ¡èà?tÛ|ùòõèÑ#`{]côèÑ  (GÝ™™AU¥ŒšêT'¹€¯.Æ¢ˆ>¡Ftt´±¹`מ„œxråɘò‚Ï=÷FöôéÓúµ}ûö¼lHHˆ*Wku9Æ ×­[—ŸêÕ«ã9r丘ÌóÏ?¥yï½÷ú÷ïÏhôÃ?äÓ-}>ùä“iÓ¦Ñf€ëŽ;6nÜø©§ž*P @ •Ûˆ#zõêÕºuëF^ုœtKŸÉ“'Sn”d̘1 èÔ©Ó믿ž\õ;! yØëPzРA;w~õÕW4h@WªX±bR÷éÛ·/gÆŒ‹¼Â_9ù‘W ÒT¸ç¤I“¦L™Â»SŒ¿8˜3g£@.\8}út^™ëùâøÊIç±óš&MšPt… Â(—(Q¢Y³fè222&&&!!Akc ‰MQñ™*¢ôŽ=ºuëVê·~ýú †æXÑ[¼nݺû”¿q ÆÇÇcÙwìØ±aÆ‹/ÆÅÅ)K—.q~õêÕ±±±\³iÓ&xV­Z¥÷:/õËÍ¿ûî;Šõ*T¨0pàÀL0»Ø20Þ&€*‚k°°Í{…¾r²gÏž ðÅî @žž„ðÊÜíƒ>à¿C‡)B÷øÊI~rêbW„ÒèÓ§O‹-(ºòåËc; .˜Ýá)t|lMÍš5Ë•+W¤H‘‚ .\¸X±b4nH{¾yó¦i«©t‡)“\Bž Ê­iÓ¦ô¦C‡qHÉ“'ϰaÃL–Wõñ'N4oÞ\ B˜#GŽÿ¨’5kÖÜ^AIí}æŠðttÈ›7/å©©ÀZ¸Omò•“né“-[6Ü/sæÌ[¿ô8›”TʈHQf¯ˆ= dðJúôéïY ÷p,gΜÎ3|¥~i–(Ÿ={v†Ò¢¿®§v2fÌ(_¨„;øü¯œ¼Oý¢@RõË™¢E‹–)SÔå­¼§0.@% 9Y½zuÞˆ¯ 0O𢀅bç¼³¦‡ÎÛ¶mCFgÆÜ`µ9ÃëèÍ™ÊéÝiŠe½¢GÕ‚+bmÌ4:KJ?7]’ÔõΖC‰¡6 ôiÉ@·škJëÏãx”ƒ6LÓ¥—%†6=âþõ«‹Á ]ì|Gºwæþ<… tþé§Ÿ¦¦| ä>ýŽŸ¸‹â2'ÑwcG ÍN÷ûÞ½{`š_ßÿ}Þ÷Ã?—vŽ>üé§Ÿ2r™9sæ¬Y³&˜È¹'ÏŸ|eDÀÓ-}‚ƒƒQ`̘1(Ã× & Cã@+7Âè6bĈ`¯pÀWNº¥<´T"-MþRÕcrÕï´$äa¯ ݼyó—_~¹dÉ’Ù³gs%T•’º¯3oÞ¼¯¾úê{¯pÀW¹ ô²”ù'Ÿ|¢ÎÅ wíÚuæÌ™ƒîÞ½;<<œn{àÀˆˆˆ¹sçnÙ²%::ZËù9à+'ÇÎkœÌMI¹ahW¯^Ý´iÓ×_kÖ¬Y¹rå矾xñâ… NBŽ;väÈô1~øá@ã›o¾õ………ñëŽ;¶x…¾šDå÷Œ)R û¿ÿýoàNø—¿ü%!!!**êúõëÚw^3ÝÇÇÇÿWb<´Ê“ã|S`?:cþ«ÑÙr£¡ÉrÌ»7îâÅ‹úiÿþýMš4Á¬Ï˜1C>vX÷/¿üòo¯lß¾}ëÖ­6lÛpýúõ|ýöÛoC]0 ‰FEÓB+ÎÐ`Ž=šÒÏ]Ÿ„$u=¶Œž‹†´d--—.]ºbÅ ºÃ_|Á×µk×ê-è))­ÿ‚ –-[¶nÝ::ÊÐ=y:šPtt7ÔX´hýР«®Zµ*©ûp ½˜?òîºí¤â-øÊËîܹüá˜ä‰zwž»|ùrîÌ9Þ¸qãš$dõêÕ˼Âeü÷WöìÙ³=À„n f‚Ÿ€'ðrîÜ9º¨Å¸Ü9¯pÀWNj¯ @ƒÎ¥µrÚ-ñd• W£'Ò‹•õ>8“î!hŸPí¾Äe®ÇíËXh­Æûÿõbμ%£ò™1jÔ‹“‚ò×sDoò ÑYV¿¿+@®ò·+9°2\Ý'_ ¿ ˆ > ÓôwŽE¥”:U;ž˜cŸkœå©UÕ&œ@Kwœ× ‘{Jâjò;£ìß­;íŸë“|ìž­NÀ¨O¨žS çz^š¤ªØ4`4T¥(}•~áÂÊ j×±cG%s€S™2¤¾Lý Xgüÿ¹$ÆXø¤nKéç>²%¾žCae¶t^¯†§®Ðý”Ö_LLy¨±¤ ><&‹-ì6¯‰Ã¨`ªª>Jâš8[‹V߈å&~¯¤¸¢ÊóÁ‰“Â=ŸêP.P£âÿ÷®ø(öß)Êç#áX#Ÿ×ç)8¤¢œ¥N)Y²dPPà\³fMeŠ›3gN… j׮ݪU+žºRK´0Mm†gø¦óÿ`bjǹ‘‹z:û‹›4*ÚL •[â.šä¢>©Ãþã×ï¿“‡½ò£ ÌÎÎ>Xä#>†ŒÑ]ÙPY(ç+slÖì;9IâŒXÎôq:v^£ÝiÕö´üáž+þ R½¿öa¿‹É‰ËAò€æ8©û˜Â7á¦ÚBÂÙŒ•Ø L¿‡¦ Ï_~ù嫯¾ªÐ”råÊ)[ïåË—;wî ,çÏŸ¿N:ûöíKìÇx™Ò"nÜ“6—V‘­O|!¡¸´º†FIjÕ¦ŸšŸ !yðr0€©>¢1—sg=õ#Ÿ½öœ{kúˆ³ËkòH©ÿ3ÀDUo6é6ˆšx´ÂW'C~@g0ôØYìƒ{²·ì¯ÓçãcJhwîÜ¡uZ*+g<¿v'פZujäÒW¯^Ý¿ÿ¨Q£¦L™½cÇŽ €áï¾û.pí4Ð÷tAóîêMÿ`â¹› Ïgôç¢>F%'ù Àr ([,O©Ö½þ΢K–úM.?óÚ4M“bIÝG0žxŠÿ>{Ûýå/È(·¿Ç‘wT$\ÎIÓ1sl3¢üiÊ‘x{Óœ/pz¼"Gж½–} ¸OýŠÞ;ëWˆ-êbvоϲA Ìef¼`. løÇÆÆ*3s á0:£•* 7lØ0zôèöìÙ““QQQ5jÔÈ™3g¡B…¾úê+OÒ[݉ÆÈÅmEÜÌ(%¯¦«p?¸1“â~¿;½¥Æ£¦+*eƉúIÍŸÓ—´ä¿ß½Ú=ñðþï%êò»´–c¦àMV9ÜSLÉÈñˆ†ð%q8BYÁ¢éYàžz™)F½¯ÊǼˆ“:Á*)¿´€.±'êaqÏ3l~rÑø:)®óeÁQà3>U ðŽÔø€1Ò‹'zR­(ï½ ÿþZ§c¶¦Ò¶ê2Ù¦êl6ÿ`bȃÑß]=E±h9ÒÇÉ‚­Ü ‡‘5üº¥mÌÀ =N±dšM–úýgò°×£ˆ¤Ñ¥ÓŸ|Ÿ˜‰ B“_Hð% 5>yµÝÜø™MÔ>ššÔç±ó¸6œáaýÀ÷Ÿ;6á%Æÿ.g 3(ªÈC¹šÜøwó$¥•¬¼% ¢ª¤ž‰ñÐVÂúÚ¤I“4iÒôîÝ›±€Ç‘Æ\Ó>®0uQ/ô².æñÐæ}ÒPÎ@™æ”~nRsë÷µ@pFÛá™”>Ó^¿{ŸäŸx-U(-DÈxCù¤î#ú§ø1^ê>%#nc¼êtf‚ìwg‹|Z` Ù597(=Í)=Í,€s6_ v®nÊêÁ#=ãž©M‘üɧ¶¡7U¡=l{NÜbÍÚ:¶‡0ïîú~&Jd@[\ºS§N}ôÑ;ï¼Ó­[·Í›7 “ù­‹¡õZ¬5‚°7n\¿~F•)+":J£Ïµk×âââh0hh妶M¹ÅyE¹¹\ŒE1 §){C›“«~“‹CÞÓ›tŸrƒ+jɘRu)ö@™– ^ùL%Žßð$±%–ó¤O8ñ=#:Äá —÷þkg’3%-à5SÉ¿ë'T‰KG…°œÑ5ßý®>²A>¶It"ðç ¾š.W]Ÿ;w.cÆŒY²dÙ´iÓÕ«WÕdqhù°kšJX7 ´¬æ´(ÞÅ9G€i sô>ßg‰ß~œ¬OãAgwâ1Ô}DùÛ5ØW¼F4z;í®˜`Å( JnŠÏ?¯Ñú=Ãc\¦rOœ4A÷©èûÏKªó&þûÃâždNþî}RZœ•+`4GCTlœšœfE1ÜIO¢%Q¼8)õú¥i ¼Zhhè°aÃ5jdòÛ5kÖlìØ±?üðƒY ¤êþÅ+Ók¨ ñœÌª?~ü¸qǹ¸RkbH 4ôŠR¼æŒ‹ÖP)C‘RŘï“'Oº[¹²#2v |||¼™óxw£oúgâ5)ÌQÓÂôÄÄÄ8›™“þùꊒk ÇtæìÙ³tˆèšŠ=Þ…(O k”ç ­ÔWí¦¤m•ÜÝY)@$,,löìÙÏ?ÿ¼3‘”2¤M:U5¥µrò[^¹rE@Ç*‘Ÿ´¤Å1 Ï™îOQ(GFFBáÁùF;Y‚OÒe4ä®Ev†r ý,`˜Ì±¬0mÀÅý^¥! ŒÞŠ2 î.]º„ª”§BJ4ƒ/凨*³­ *)xôCMlQ’ô…yGEE‰ÃÐÅZù•·03ò)-X1že3šÐgѳI –ŠvÚSbžvW—Eà)”’J•®JåbP´(…I#T…*d17&ó³8½ëúzá…Ç+±Ué3祋£I€ãnŽ)*QÅgø¬ØHµ åÅrq+¡±hòèX»Áj{AcS\ÄFϽ–³¹.j†õ™¤g Lí§ãnqiA £•b¦ù™J7óÝ~›ÀßT ôõP}UcÓöÄÆ:›­=”ÖXÑÅþ©YÏݽ¢@æ‹/ “µÐ^9©4†BáTº&åñE1Š” e‚ýUb4cÈÔ2ÊØ;§Ç#VÄÓêîxŸ= pÎb»»ß™ ™BktFñZÒ¨VãË!tŽV\u|KQf°$ó÷ƒ]£›PP> ‰(·¼Ïh%)o’öùu²&ãÙ0ôõœ ; $»cš¢ œ.SÓUMYiðΕ(àô£rgRilF2öµs';Û¼BôM8oÏž==½ÂV¹ø èJžŒþ4‰I“&½õÖ[#GŽ W¡»åÌøÎkÑäD!V¯^½fÍ…±9y¾»¹Ýäe]²dÉÂ… 5Ïî"‡³r¦Þõx…ѧOŸ>vìX?O:$Å¥Å[fΜ¹jÕ*›ÓºmÞ¼YG®X±Âo{…Pq¦W3{öì¥K—:5»wïÞN:Mžiø V0:Мëì >3ƒ\¬ä´*[¥frÑe”:’ŠJ2ÍÀ]¡/Ç{Åãöâ 8¡?Òø©Sޱ.\0DZ¡Œî—PWAÅ|*PÍóÿŸ@¿J „À«›¨ã¨  Û7dM@E® 3Ãy,~›¹¦XxºÖá:»3 OŒVhÈWõm&nº?°EjrvùPDïNÀ9þ¼Ž/]ºÄ ^û¡ÇÆÆf®Q?‹¢y)4ê—ÆvõêUçz³F^µ¹qãÆÂ… gò |uWy$½Õ,‘Û¾}ûðáà (P¼xñ|ùòÕ«WïÀ®GèiÑeh|§;vì([¶,4†.ƒzNÜvqNVݹråÊf—(ê×øjÜÂjÍ"éÌÙ³g!~éÓ§§~µ‘ßàÁƒÕ2ýëì>\3WµjÕæÍ›ƒÏÚ6Ù´iSPPP¡B…´¿FÿþýýSnN× Ýì¥ÜžyæJÌx!ø\¾|yݺuË”)Ó¢E ”ìÖ­›ÊPã)?XMVjþk̘1%J”˜6mšÇá_ÕŒØÇœ.]:†*O 8k:Õ™Øßsw>Ë9ØÜ½{7ýâå—_¦¸‰ šµ-n)oê…T¾ýöÛ5kÖìСÃÁƒOœ8áôÑÑDµ/¶»Â8ýÍ7ß=z´»åö³W¨q:ˆ|€””®Ú¦Mìâ-Zœëbq™}IâââÖ¬Yóâ‹/j“ÄeË–iw!-ªõ›·Má4{-ç ÃÉúõë÷èÑCß>Ü»wï† V«VÎBSÔì¶Ì´ 5æÅR 2dΜ9"êãûöí£†Ú2>""âò利j‘lòR‰™åHª5˜ ÅÒ¶mÛòåËk’›Ê022²K—.­[·Þ¶m›òAY"m0ùAÖ2Ñê,Ún^»ˆšymWüÊ`cJï¿ÿ~¶lÙè;óæÍã z»nSÌ Rü„®AGVþXÅ 9çGÜåÒ/½ôô‹Ü²eK%wQ3Äò€'³gÏfG_»v-€S´hQêÝã]ë—O‚ƒƒix ß0"` bk·_¨à† J–,Éðúê·Ò“—”c€‰íÐàH¶‚=yòd–,Y4a§L™¢¾¬”kI9SÈoIU&(ƒ3fÌ0LÐ5”æ\ód"³²š(”HsÐNÚI¿X¼x1ý”qå믿Žu«T©Rß¾}Õ)Üõ¯¢'ØË@àƒ>(P ÀsÏ=nܸq§Nzöì‰á`œ.§L¹»EMÐV¿=ç[}Ljhh(…€¼òÊ+Ù³gô–,YbŒ…ϼ¼?$ÁxÑC;wî\µjUªuÖ¬YtágŸ}–A1dLÓÜ~Ëœ#— E«?Ö¯__»vmåø¥ˆ'=zfTî5oÞ¼I“&5Ú¹s§þNsõCyR,ø•+W22Âj`m÷cĈ¨W¥J•áÇèsåÊ•&MšÓ§OÓ$¤¿öILÞ) ÅÆ˜ÙLØ2|Õ½{wa/ê׊2E8󨻥K—:×Ý<±bÈ€c_¡žf)ŸSÎt™ôéÓ:T—qÀWNº¥¿OžŸcÇŽÑkhœÆ©haw£Ò7à]t‘™E'—öÛʯÄBU–.]zêÔ©ú bÃKkÅ_A T~€-ZðU¡ ~˜cJŠKCó(:4I›6­$˜,U?ýôSu"è4-³B… ~+=åR¦ ~øá©2›ÖEårF}NÛµkW¾vèÐA¨è·¥·eË–^½zAP€BsÎ`2\zá… üØ—Áƒ?­Åƒ¦@¨)CÑ• ‰ ã_ðdذaz¼üòË”d—.]„-.Î+ ôÖ­[‡>h¨½ccci‡Œˆ/\¸ÍVž(WÒe8c˜ $ªB)[¹½¤†ÔQ¿ CNwùéÓ§ÓyÍãT•XâÊ@‰rcLçñ•)˜BÚ‹òàû1=¦ÈoƳæÌ™Ã˜¨`Á‚K=4<¡+Q˜¨÷ÕW_QãQQQcÇŽå+#; |Ò§¤œ|þùç-[¶4ëˆÕÓQ’’„lÞ¼™B£ŠÇôQéW®\ÑÕ:µdwt8·KHH |† BGÐä¯s0Š7®V­ZÊŸ¼jÕ*úúa½R ‹Éa¥ÄÚ Ý¤qð¶PVôè¼yó:ïÀWNº¥¿’ü˜ÆpñâÅ/¿üÒIÿ°Â¹sç„Z–×”&÷þûï׫Wi¥J•hêÂC•¹‹)èøÌœ9sÖ¬Y!!!‡¦»kàŒ£FµhÑ"”,Z´(ŠéÙ¹s§öYv‹K3Š?zô¨”Ñ6OTtÉ’%˜†Ïˆ´‰²ð‡8Ë7¸mÛ6©g@8,, "m ñ Aƒø•Æ©¯111þ±)@Ð¥K—à ýû÷Ïœ9s¿~ý”ÛOl1eH¡ñÔK\ñ äÒ·nÝ¢Eª©i,X<ÏÔo±bÅ2dÈ`ì úEõêÕ…$.†(eåÊ•høÖ[o©±Á ÔaŒJpôø›Y?¾™;]º¥çéÓ§Õþ,Xq…\¹[éŠêÑ1#¦jÕª¡xèÑGZµj%kâq;é“AiÈ*tºD‰eÊ”AÕ ˜Õ 4HàôóÃú ÓÔ ^³f ¨»bÅ y ±ÒP“5œä€ÎÂÀÓ•-œÖ­[‡©…K;ó™)ì¬Y³b‘·mÛvîÜ9S€)±á”Æ ‰û –¡¥™£á W¶lÙ2kÖ,ŠŽ1²YÞnåÁ%wîÜ£û]ìÅÆ¬DFF^¸p¢fO5nÜX~6h],¶Ðè5pT8 š‹µ:GsÚ­ÃEx¨)NŽaÑòchÜ-7SwtäM›6.\ÅÀjU1‚eÁd»XÅòª¡ÉÓO?­f Dc‘óäÉc*h 0Ê¿ä‡1¦çîŽ3™y4 ¨u™¬Î—‰'òSûöí;fÌŸ’·hPÍ‹¡Å%ç3Z­Zµ #øÂ /ðÜÆ:Ó—µ ÉYæO¦(G¶•ÏJ•*Á²|€šñf ¨ª¼Lvm9üøãEõaÎMý,ñññ4{p S6]y<®æ?ѯâ{gÎœÑ }Ú´i¸Ñ£Gs –scçâú¡š0~æ™gJ—.]¬X1F%æØ±céÅfF˜wñØNY¬ïܹƒbf}.Å5oÞ< ®). šs" a’&Me–öO¥ÇÆÆRÅ*=r3xkHrŸ>}Dú=Ú¾ŠÉ¯œÎR*T9ˆ œ4i’–CÚ釒L™2Áœµ#m•æç®_Ú㈒U¤_QŒáRÉ’%‡ ¢¾LEûm‰nRþÚÛÔ©SÓ¦M a8p =E3w5jÔÐf(ÚÏݤ¦èC/[¶Ìã„*[¶l•*U”¦ÌEšŠYш‰šíÛ·¯Ü§œÇö16 §L™ânáŠQ¹:¦ÉÕªU‹ÂûÌ”lЕÊeÔþŸþô'3JõÏZN¹8`ôaøÓ#""vìØAOÉ•+à¼ÿ~4w‹KS’ZÕ%·9Ç×矞+Uª”ÜGZán΄T''N¤ËLŸ>]n@¾‚á#FŒpQ%gËǬtíÚµ^½zùóç6l˜F¦4B`ÇÅÅΞ»i6µþ `„eåÌ™Óld¥Ú˜M“Ý ¨¸~ýz}¥›Ð•\¤÷Šç§cP(ì°C‰‰éaqFuþôÓOÝí†K#bª@%äβpáBÙ¹s'åÙ®];¿åÇ Í›ð?PZIE´M¼²µoßžþÛ½{w—©e­mAü@oLJ7ô ÖŠ{cò‚‚‚¨\4€+•¸­½™®_¿Žt=Å®+¢Í´œêæÍ› `ÔæñÎÍQ2Û·o/\¸0•«ü®kKkDÕ?üîÀ¨0ãtšœs£ÔöO¾…†ò8:B\\Ü¡C‡Ö­[‡b²Æ•ò'À!ün•˜ðM½è“Vfž]YcdNú-k}b¡uQ|jÙµŠ«Õ¯ˆbù‡K+I‚JOÞž‹&€°a°mÛ¶Íœ9³ ’™;w.(ižx¸ìü´|£KçyJ/GŽo¼ñ†qz¸Å¥=^·9僱¸rå =·ZµjåË—g Ä€W˜%=HàcòƒËÊ•+)½† *‘Q:u4â¢J"ÌÂzkãÆ±¿ß}÷1²ôheüs1wŸÐ[+†hx*TÃa\ 󠧸¾³ÛÔ©S©PÊ>ûùçŸs̨ÄÅ<¥tPºK*‘Bkݺ5Z)]<yøðáyóæufrsE4½¥$Br mÿþý|mÙ²%¸MÛ“}1úGjPaІ})Â\†^C·åkîܹM”v„Î"¯Â­ýSz e”_ºK—.ÒPáêgϞ͗/_“&MhôqµŒŽ®|÷C¸i²†r€ æÊ•kÉ’%TÙ7^ýuJrìØ±ÚòÆÅµÌò“ÓO›7ož5kÖnݺíÛ·/1’þY'".M+¢…S€4³½{÷:ô£>8p`†  ©lœ¼m®ˆÙJ•Ï .”+WŽ Á=%E)Q¢„º-¯à·F’(‰K#W¯^…ZS•mÚ´É’%‹ÒÐÉ@ûs/5$žˆnÔ/Š)–7**jõêÕµ:Ë_|ñ…P3fÌ@m³ÂÝ>"¨)µL™(¦Hñ< 6CNØu©R¥vïÞ ßðŠ[\šçÒ(.Q,…—_¾|™&Ö¢E 8ÿ˜1c„06ÆãaÇ¡;vpòäÉzÓ 幘%ƒê£¥™K-?õÔShÕ«W¯Ñ£G÷éÓê5a³BIè¤få£IÎçå•W4ZwÚ±%ß|óM ÞË‚êÓS\äÒš%4466výúõè†bÀ5€b†GŽ „´‡5kÖÄê©*µzý­·Þ‹¨è*Uªd̘ñ…^8|ø°”Q’"4ˆ2 4€Ïh‚†V§ÈUdܸqóçÏŸ5kÖœ9s¶lÙ#Sî·z±)´… RJ(#’£Ÿ`ÑïÒ°ìÙ³ÃvóIO`,¿rW-ZTÝ+={ö0`‚æÖ­[õ«»q¿Tî¶mÛ Á–.]ªÚŽ;œ+ÁSí·~fú†™ŠZä˜Æ_¶lÙÒ¥KÓM\ÜÇÍÙ¤Ñî ,3D‚BlèÅ#FŒÐ‚ú@h~h˸B… ƒ bT2sæÌN:½óÎ;˜]JU} 7Xäz/3*ÊŠbƒFF"²¶ï½÷^ùòå{÷îݪU«’%KBº/ú퇜´4øëׯó,:â¦M›ŠD¡³–FÒ!Õ Þĉ)U·¸ôÉ“'¡¨„!fèaÆ´™W= [Ê.È0ÊÝ1]j”ðððQ£F1lþùç©níäâ ØPS*š¡\5”³ÑìÜãúôÓOiº.Nw**22’&gˆ= aÕªU ¹BøÌ˜Ú]æEd(4ð‡rs76FÓm¦&¨·`ÁŒ Äïý÷ßgФ®ŠQlüøñôŸóÐH ýñÇ«­úÇÿÜÑ)œË€e44_׬YÓ­[·‚ØÓ¦M›–ªÅlÝ¢¥Cî*#²§„ÊÅÊPæ,·çÕ‰\£§Éÿ¯y1ޱ&h« «Öiw?·”T^}Ä9×àbÞH3ãæœz“>Š£>kY´»¡¡4¿3gÎ`òŒ¶êFsÿoý@tåNž<©"Òd+UlCAòá×®]3î}Z‚ædU8ЍD³gÏš þÚ ùæTé HÕ¯ùT–-í|ú¤!ðÅ‹ykØ´y «Gù(Ö]™XC“.À-¡™Ôú'NœP]sRk¯äFðg …ÃÓXá䥊 MŒ9þï¹J4aÌ+Êœ>}µ1"R^&ØãÈüà è©Hi(.•°¿ê°ê­RØýTO÷ñÿ|ùå—Ê(FÅRŒŒÍÑ=¥ÆéÏdì*½Ë—/'ÞÈF³6ÚÀŵ‡å·Qñ –å™TrNªUËÕ!UZªƒñÌXI÷ÉoÆS.ŠY'¥M ;0|êÔ.úÙPŒ^¬bÔxŠå¢M1)(Vá8GÁ& Þ]ÿ¤“y*Æ[lAЧieÅïùa¯ÖΩDÓÆ¨Vyf4Ùªü Ϊ—7]ÆبÜ;>Ž5Μ:uJìÎBC7Þ‹·Póx×›¦®lá÷œ<¢®]ß•[µcz1*QqêT.5(¶ ¶êmƒ*¥4#|Õ"M4áõ  ë\Œ]4iF4`ŒóŠjÔ¸Àõ`ijíž:8{¥ß<çÎU‡F”žÈ'Bzîn}"ÄV^}ÿ 0ÅùõtŸ"BãBW+u‹Kk­™¶£çB¡{¢QŦÐPýÃcÅŠ+ÜX@aÌ}á>i²0æã!Iöø1ÍhÊà‘㜕´Ö?ÀœÄŠ+<ў†ìi’Èà$4ÆÐªdtÁÖ´½“'˼ž²ý뮤ÐÖð‰ïùdæÆ´bÅŠ»;©Ÿ{jµˆaÔŠçIÞ§Ú»+<§Æ}ž/fžÅ…¥c<ÎÀÜæÏ´bÅJJ²sƒx³QéO^Q¢ÔäÍ«óË/¿p7E;sgmjüÈÞcE{*v>þÊ•+—/_NöŒ:Î1obˆˆˆ#GŽ<š·Á9q©¯_¿„:gEyÇdôK –÷îÝ{ðàA“Њ+VRHŒ+àܹsƒ.[¶l:¯ü¿$¤N:“&MR^ @2Ù7jÁ44mÚ´S§NŠÃF< Bï'NœØªU«Õ«WëLò&š3Ã6††gµiÓÆ¶(+V¬$£„……Íš5kèСïgŸ}6}úôáÇ7nĈ}ûöíÒ¥K¿~ýBBBΜ9“Œ°›»ÅÆÆ~ýõ×|ðA‹-ÓBþ †C¤ÇŒS¿~ý³gÏÆÄÄ8ý6Ú6%Ë ¢Þ¸qãÖ­[›@în+fÅŠ•?°DGG j._¾œ\ÏÖ„ºP\Ð~È!%J”àA{ŸþóŸÊË­{®[·"Í}Ž9áãˆvÆ<¾ÄÅÅñ Ì™3ËiÿÓO?97EµbÅŠ?ÈÏ?ÿ  ¨ÃÃõ›ó111& ú¯^ùÇ?þñ«W|PQÀ¨LM|ÂÕeÆ£Ë=ÍÔ¤2ÒË/ñÃ?lÛ¶ÍãX4y“<ŽÔÖè&ÿŸaÈ> üÛo¿q«Áƒ£üèÑ£±G>(ÜG £@||<4Û¤"1.'ñæb3dpÎW:AvS'+V¬$»8·v|–-[–3gNíž‘uœLìÝUL ©.‚>E©9÷iòùøhËu|ûöm!$Àû?ÿó?‚kãâ0šp™r%ñ+–âž>4O“&Íüùó=w—™ƒçRÃ@®v+ã阞h2£‚±/^äÓlòþ?IˆÏCÍk>àõV¬X±’,¢ââÒ—.]ÍÌÚ:eÏó¹ÞÄŠè'Љ`P’rY83uhAºÇ»ýñùóçW Ÿ aF­¾1϶;—®pføðáY³f7nÜ… €_‘aþkóúõëíuoªªœ×†5X7:tȼž¥M]ehdJBCCcccm˱bÅŠ[\ZëÇ¡qIÀS˜Ì›6mÒI°4ãÊH¯øj0@zŸ;wnûöíp]YþrõêU)êò¸S§Nݸqƒ!*?%$$˜w}æÌ™IpÉ™ü¤:qâÄ´iÓš5k–+W.°±téÒÏ>ûìÂ… Íe€v»ví/^Ü¡C‡*UªäÈ‘ƒ+kԨѭ[·5kÖø2|XŽŽ³gÏÖ®]»nݺðpPÃÁß;wî¼k×.þX @|ùòµoß~çοyE79}ú4¿¢jºté¸&K–,!!!/½ôRÞ¼yÇþÀuTTÔ7ß|S½zuî IÒâÅ‹oݺÕ8.zôèQ©R¥æÍ› ùõšŸ|òIË–--Zäôoø,ÏÄ‚;v¬I“&:u²-ÇŠ+nqi0säÈ‘€-($Mš4ƒ†‘*ïÜåË—+W®gÎ0™ ÀmÐ`rÆ å8zôhùòåF…ù‰3f…²šmp•œÔ _½zµîõ…÷ïßß„ò¤H‘"ðv%&…ʪðg™P©páÂPë¢E‹NŸ>ýïÿ;X²d L^,ºuëÖ˜E!ü‡W£'¡ÄÚž»bW«VkŒ¶¨ Çv¦¥B¸4¬Zµªm3V¬Xq‹K?õÔSåÊ•ãð6þü Ð"—±cÇ Ã¯]»&Í“'2eÊÄ' ùé§Ÿ´)!ǧ ¾M™2Ð áꘀ>}úè¿lúôé9où¬U«Öþýûe)¸ÏÆ9© P£`Á‚âÌ2dàòB>|XÞ9dtÀ•Û·o¿rå ·š6mšN?~­8ùý÷ßk°pàÀûpã[·nñR+VÔ[ ¶&-—¶bÅŠŸÈrM؃ǻ‚Ïã Ã`Èq}çw}ºqãÆÂäåË—£9ÏmÞ¼9Ï}å•Wà½gΜ‰‹‹{þù祰À–×äW¾ÂùQ5&&¦k×®|}ÿý÷Ož<™  T>A‰°n^CfÛŒ+VÜâҜϗ/Ì966–ñ>´³uëÖœ¬R¥ŠñôêÖ­;lØ0®‰ç€5kÖl×®] ›’Z†É™>ø@”¼sçÎÔ©Såâèß¿?Ðzþüù+VÀ“³dÉ2{ölH,—-Z´¨L™2ÅŠS&%¨5ÿÏœ93`Ž& ¶höŸþô§K—.AwQ»GPô^½zAžù#Ø«W¨P¡‚¶/l׮ǀ³v7HŠcAP’[© äý°\ÚŠ+þ—¬Y³æÊ•K“kNÀ9wî\·nÝ:uêЙ“‡Tê+tT ýá‡:aœrÇ/G4ø©€g­ÝÌùKºtétñäÉ“u“ˆˆ‘y°´_¿~œy饗ã1}út¾–-[4òsþÀúãš5k89jÔ¨%J´hÑÚo4ðáí\óí·ß?3$\³Š 4Îó+òGÖ~¸‰ JkÆK—.mÛŒ+VÜâÒ3fdì>›X;è´–cbb„o ,0ÿâÀÏlٲ͟?ŸÛþüóÏN.ýË/¿À™§ž»“’2dÀ4lذÁÜ*ÎC† ‘[~Î׈{¼ñ'üQœ|áÂ…|-P €V =ôF%_†„O˜0A¯ðÖ[o½ñÆtìØÑÌ–Þ‡s%°ï,Ë¥­X±âO¼˜ð^h$RĦ ¤3äׯUºò¯ýëÖ­[_Ú°MqÑcÇŽ9ï|þüù9r@k•¤:66V$9>>ž;‡††ò¯Ü¹sëâÙ³g E£¢¢žbãò´(ÖºU«VÊ}{×’]&¯xHH¶ ]»v¼HÏž=Ùª9†9cAV¬XaNž={£€ÚiӦ͜9ó˜1cô\.ÖväŠᤠD…À1¿øâ‹¶åX±bÅ-. ,  DD÷îÝûÞ{ïM\R´œJŸ9sÆs7u†¨oÁ‚?þøc±Y.þ·W<ÞÜÁÁÁ<ܶ˜ –ƒƒ®ÂÀ×_“}ûö+îÞ½;¤ýÔ©Sqqqhxr7ОûðÇñãÇoܸñ™gž)UªÔþýûËúÄÜ@¤k½…NöêÕ‹›+VŒÏ2eÊ`¤Û}¸1dÊ”©zõêâö*.Ë¥­X±âOQ%(%ŒôêÕ«Jêñ.¾ƒ²Â{oß¾½råJÀЄºÉÇ›>}zå,—FÄBù;ˆ*Úœ5kÖŠ+ž;wÎãu_ë‰rü®]»ä/\¸°,¼yóJ–,‰NÝfÍšÅm¹ƒVŽX÷•+W´LRt•xÐĉÃÃÃò¡à]ž+Ä|†ís3\º^½z&ü›w1ä\kÞAḟáä ü–_ºZµj¶åX±bÅ-.@’ûôé2?ýôÓE‹5P¦4Gaaac§OŸ6I–V¯^7oÞÞ½{ë+çÿ.=jÔ¨âÅ‹—-[V©Š&Mš&÷èÑÃùÜAƒqràÀoæ¥råÊñ ëׯû$,ÕªH» „ÆpäÏŸ¿Y³fóçχýæÊ• dŸy_“5!!A @„ØÜV~˜ûpãüQ†z®’ìY.mÅŠŠàEÑwo¡l¥räñJ«V­ÀÕÅ‹+Ø8Þ+\ fr¼Ú'ñE©R¥ ·òW›ôzšUäæ<:­“£G.R¤È»ï¾Ë ùf ~öÙgŠ…Vô2h©¹E“ÖC´Ÿ¡ÌÈ‘#ÅÞ¹æÕW_2eÊ|0|øðÉ“'c;æÎ{äÈåÊÃ<€ðÆåÖ¨^½z÷îÝ!ÿM›6íܹs£FÚ¶m‹æš¸ ×.³2ÑdI½7Æ pe“&MîY°Ê쪔­‰sk[±bÅJ²ˆœ ]5Õº€BÙ²e ÷íÛÇ1ô,å N:मG‚‚‚ £ „†ô N1 ÜÌTæOãJC•Î'6>þüœ9sÑ&;( úÅ_(•‡þ8vìX, VàÂ… Ǫ@”á2qi•cð™÷™åOœø:!!aĈz5áöàÁƒu™‚ºùä-T8¨d¢¬yGÌSñâÅm˱bÅJr‰ÉêÆ *çÍ›Æf̘Ñpi€W AÕòj­þèø×–-[J—.-²[›¯aÀbÌÉñãÇŽmtöG]Ð+r2ôÑG\üî»ï l 2a³qãÆ"Øo¿ý6×lÞ¼P‰‰ÑÒr¸t¥J•/íÈž=;~öìÙÎgqå¹sçÖ®]kÒMó‚/¾øâÓO?mrôéÓçwc<(:ô©Zµª¨¸ò“X.mÅŠ? Pcâ<^¿±™­ã'ðùõ×_7(Dýõ×¥J•*Z´¨|)À\†i\»Â·™3grÏÏ>ûL^S¨(‚zúôiñXá^HHHÚ´ia×f—+>Å¥±ºçŒ3”jé›o¾1ÌöóÏ?7+Ò©S§rܪU+t­Ë&NœØ³gOýÑè†4jÔ¨cÇŽ… æÎÀ¾ù‹b]@{JƒÑ ¹ÿ7P»\¹r¶ÙX±b%¹Äì'kÖj©5¢ÍMœÉ9ƒƒƒ+W®¼`Ám ‹DEEõïßâ ,ëÌž={ (¢®Y³ÆlMÈeÕªU«S§Nhh¨Ïãäs5j”òìɧѷo_èÔ©“&u“‘#Gr{åÊ }éÒ¥<´~ýú@ºáÉýúõTsäȱ~ýzþÕ²eK¥¶ÖmõÐÝ»wó¯Úµk¦L™¢0i xøðáY²d¯[·î>\šÂáí°\©=|)'g¶\ÚŠ+þF -þi’ç‹'—-[6Ož<Û¶mƒOŒo¾ùf¶lÙt=À+:­Õ\¹hÑ¢›7o^¾|Y¹•ócÇŽ™x? Ô:tÈ,G&L˜` ǯ}ʤ¢òè„„„èèè¶mÛÂÛ›6mqðàA‰‡pþuøðá‚ òµY³faaao6iåÄ{æ™gΜ9Ã) [û`\Nœ81iÒ$]°aÃíÌ,øÕ¼X îÏ«åÊ•«qãÆ¶ÙX±b%¹Ä¹u ï¡ ÍíÛ·%3 ˆŒ?^6hÐ ð6$$¤AƒÅ‹×Éo¿ýÖãšÓ×|ùòullìo¼Á Û´iÎ_¿~Ý™ó““J¤Å/<±OŸ>™3g†¥›Í\tçL™2A°/]ºO–;vìÈe½{÷F±?ü”–EàÑŒ€P>•ÎôÅ_1bÄ—_~¹lÙ2%&}ýõ×u[8¹â Û·o¯mgyP‰% Û‹¤¸´¢yzݺue\´Y­åÒV¬Xñ?ŒW©R¥fÍššgTâß}öY­aìŸ;wîªU«Ö«Wïå—_V"pÌã QÒQˆnþüùµ7 †`Μ9N·e)À·ãÇËɬäuË—/×W=šçÂ`·lÙRªT©:uêpF¡ ࡲy˜µÞZœX¡B…;vx¼ÓC† )S¦Œ~zê©§´‰ †F&0%bþš!õxW¯À·¹ÛtëÖ-h³Oà·óxÁZµjÙfcÅŠ•dthիW}5‚ƒHƬ\¹°-X° ¶_ɘ1£s-ø0(:tèPsF+M$9sæÜäP]¿~½Vhk˜­ÙxkòäÉïÂs˜¶ÑÁìäR£F Á2ÍVÖ&`VöÔúõësÏ1cÆÜ?¿t¡B…6l(îŒZ±\ÚŠ+~pæ£>š:uª&àpRˆÀÛ³gÏ ^F®X±`ëÆŽ;nÜ8p^qÑÚ¹sçöïß¿hÑ¢Ð×Ö­[¯Y³FØeRa˜$N y\\Ü'Ÿ|H ëbccgΜiö•A‰‰‰™2e ·«×O.\€Þ×rùòå.\¸yóf”1¾ô«W¯îÙ³§K—.Âí&Mš 0Äžzúüùóß~ûíýû÷ë/Šl9qâÄÈ‘#!ÿzÏštcàdLFl³±bÅJr‰ á0T0,, f;qâD­:4‹Á"~:xð`íÚµÓ¤I“7o^`,½~ý:˜Ö¹sgeÚдÏàøñãÛ·o¯LPÓuëÖ uC'E÷x³¨‹-R¤ßwß}‡]N †7n ^»v­9 ´>|¸oß¾ðp°±cÇŽË—/Ÿæñmî†5™£Zi[.Œ cx(Äž!¬ZµÊãxÑ‚DÀF,[¶ìþy9‚‚‚ž{î9tãn>„Ùri+V¬øMΜ9#ìòxƒâ@³êÊ•+¿üò‹²9ý'N?~ܬ÷xÝÚ\£õær&ÚB]Õdé_e•#"à•JÖtóæM£˜AN®<}útTT´™“|•{Ü ø4ÿ’‘2Ë[<ÞåêØ½”7Ôû(¨Ãpicãd0ÞnÒôY±bÅJ²ˆqüþãÿP¼8L:uJ($W€a†‚M¤uæÒ7{TÛO?ý4$ÓãÍMœ*•´fÜÀs=Q_¹§Ù.q±ÎôÃÃÃå^ü¢ÞI¯(ižçnäžvÀQ ÛÁͪÎÍY<Þ@îéLO'°~µý·Nb5ä3GÊ!).}ìØ1mûÅË*±¶Oâ;Ë¥­X±â–qú¼ÃÉèèhÃTe2f̘>}zÃëÜ'$* ë Çâ¡­¼Â=!<° & ÿÒ^‡Üß4"lür>"" ½xñ¢ 䉜áËⳡqk³˜ƒáü—×71¨¡ ÄðáÃÛ¶m n¿óÎ;¶‘X±b%¹Ä8æÌÆ)ž *Â]A?ñaýCŽŠŠÛ„QsecÖí$+Xöx=½N‚n) ÍCtmÕ-ÂiòŠø0^‘^çya¸s­7š€·ÜÊ8%”e‘ż/¤ZxÎÓe#DÑ11ØÞB[Ì(·É=¥]»v=zôàM+UªtÏ‚µ\ÚŠ+(à&´‹‹ÓIç*Bú9×€¤R1Ôw0`€ö47ûÎX±bÅJ  Ô1!!AAËà°ÿá$Í›7/W®\Û¶mµƒ9CƒÄP­X±b%0Źúû×_-éç2ç©]þýï›%“fKG+V¬X @‰gàóæM§_ú,ÿéç8ÂîohÅŠ•ÀgÑ ½ƒUÚ±¯Ö8ÉOZ/ó`Ôf®S)^ûí7m•n[‚+VSÌ*Åæù„·ý‘Ä„mpðË/¿ð©àmÛ¬X±à¢0-'Q|Ýÿy…ã¿ýcxÜÓHùä\²bÅŠ•°JùŸÿùŸÂä'á}_çñ°bÅŠË¥-—¶bÅŠË¥-—¶bÅÊFlŒ‡ñ°bÅJ€ùu`c<¬üáåÿ¾—¹ endstream endobj 139 0 obj 248491 endobj 42 0 obj << /Length 140 0 R /Type /XObject /Subtype /Image /Width 1024 /Height 782 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xÚ´ÝxÕØ¾?|ΙsæœÜi¡îîîîîîîîJÝ[(îPܽº+Û­Š»n¥Íû[Ùm)Ý»sáýß;ÏçùNvv²²’¬•¬¤PˆÄVæ »y›Ð÷€J¤SÙ”Ë$òQâàZÿù{½ÏÛéOÚn\ï¹Eèc· Òiô¾[½ÔW—Ÿö\¤3»/]§zÀj×ôq|jËõj?­…M'°è½ýz?…9@ôA2yB H¤~­ŸÄè#3X ‹JdÒzØ4›FžªŸúÕ…ú-rµ6ÝOéC$dwÜ †)݃`b/À€ëƒt€£úiݸ^„JB‰ïc?™ØO¦ hDJeˆD"ñ-‡ˆ”!"c¨— ߢ]ƒ¢è­ ŸF€ð½ ±éÝp ñ9P™^t`ií°Ì §†x%©¸v€äñã<@éDÈ=àëò㫌›º_S/0u-%ŒoÕœBÂ5ÚwN=9 pêÓOíp¢q]}b?‘ÚßKï'±Dî#RûˆL”œ•„Î,… iF_ïí¾Þ›èxÂ)#ÔÐAî‚Æ_õY´ã “ÖŤ’P9“È”Ilu :T`‚Nú0™ú•î–.v7 2ˆ™F¡3(T@£n²”ÖNZËõGƒWÚ.õ»{ºH÷hä*\Ñ©L•E¢Üè¡Þê¡w3XÝŒÞn:©‡8ÔÓsÒó„E¿ÛÇê¤ÑOÜfbØÈËìÍ C>bŸ_`سØ£‘±ÇØ»×ØËOØs {}ýð{ÿùËöñ=öæöîÁìåìýöáöaä Ì|½|½ú„}ÄFFF±‘¿°‘Ç_Fÿ}ùåËë±ðû<>ÿ5,€/öûò yƒ}yƒ¼Ã¾€Þ¡™,ó’clìõ(övlôÁ¾|ÂF>bPX÷ó4ýù36òyôËÇ/co¾Œ½}ƒ{7‘œML€µF>|õåÃØÈ{ìó{ìÓ´ïñüÀ™~?u/ÀDý95|5næ¼ä^æç而½Æ½ÃÐ.|AF ?c£0NÝ`bäšùNÔ:A£oQÈ{Øß±Ñ€a0ì6ö¢`­±7ÈèäÇw¨@4ç Úâ—ר('ßb_ÞâGì#*|jÂL´Åwx o&J˜HκãG~JrÖ…e¾n ?S_ð35úq¢p8o1 ¼Ÿð÷yü˜|Áwa L¡Dß¾_…CƒO ÿƒ1|ǧßaØK¼ÂŸÇçÀGìé:\ŸÐq›ôé«/SŒƒ sŽTÎ:Øx}Æð#Œ½ÁqŠ‚™_ eŽ~äÀ¦ãé3¾¡Ïøo'J{æ†0†A}L VýuN;GMµNƦ>ÙÎñVýa|™ÏÓºÒ«¯] zëç—Øçר§·üjðÐhÑ·/¿'X}¼Ü'NâmõÍ‘¯¾Õ×v{„–ù<ŠöØ&àÜœ±§öo–£xÇ|7ž°ÑÑx_ÃÛ!§_ ¶Íé ìËÛïÝù#ŽS>çjóoÌ£ã&F'úàØ_(aE´ìàèû46ö.Mc§>PàÚ—Oø5vt ‡7lÔ¤?ã=tŠ©íã4ªÉ¦5ŧK~øÆ竉7±$ªägt1AÆð<òmSÿÓZòÿ?ø©ýcŸxûÑr~Ðèçw£Ÿß|¿‰+ütèZÍÓ—w?f†rfÜ_ùÿO7x.3¶·)·¡©¦5ûÿÏBÐ}ê}æ ¸ÌTþLíÿë¨fŠñ.üއ¯wÆowíïÎ1ÎZ\ÉsyMˆ'Þíjâ:Ïã¢ñùÇ|zÿc>àí«œË;ñAÝçO_F>}þüyddäùóç_`hûú5ÌÁip݇ûÙ'n0ÿÍû¿>CGÆøôåÝÈØ‡/ØÇÏØ0ÆQ K÷gt„G?|üø Có‘Q4p‚„}xñ¿¿`hà166:Š.ðœ«çöJC7 ·/ð;wÕáÁ®NìíK2©‹Ié¾KíyÄ$õ\=Ϧ‘XLzƒ>L¥Þ%QžtSŸôôÞ¦µ÷³Zi}ÝŒ¾îaFû «µg¸ýÚíöK÷ZÛnv²X½CtƒÝKè¥õ‘˜ì^x¾`±»¨ý$Γ?µJcÓƒ…0Ù Ø ­1ùBÊBèL|‚É °¦á,@t&…Ê&RºÈ°•nZ_/ƒ*Àdw3Ù] Áꢳzè,"•ÝCéë"õH”þ6Ê@Ëל@Ô×ñ»‹Ì"“™t ƒNt&ý‡’AãLÃ|* 0©dÀ"SqtH¨ÛÄG ›La’È,* HhìvJ_+…ÝIç9V7 1»i, žÎXítV;LЙ³—Î Ñd*Bf"™AB0—Î"1PI(ªUÇ$#ŒñÊÃW°:TƒÆ$QX½TTO*“N£Òi3$Ú"¾d¼2*SꃪÁY-?=)xù¤‰œ¨0^gTm|±Ée‰‰cPHh>…Dï%1º)ŒŽÈ$ÀG”lxFnÃuX>M¤‘ˆ´"ë€y•ȼDb]#1衘F'²®Ù‰LT‘ÕNdµâ9Íïèe´ã:§è"ÒÛÉŒ«dÆe2½… Ó´.T>æw’˜íx±WzÖVG³ B˜mS3"ÓÛÈÔ2²•D¿B¢_$Ñ/ÁD/ú‰Æ¦à=ˆŠ&úziýŒ¾.ÔæYTó¡‹‘ûÑ þ‚ƒÚkQ9Ëà‹Ñ©8¼œq0zŽÆ`€¯ÿAw£°Qw›–œÍMK…0¦ ç×Í……ºs ÝAgôÑýÐaélêÐÆhC4ÚL£Â)útøÈ¯Qú®ÑØÐ} ›àý¨¯• Ø2»eêV´2¥÷q „Â' ìÅuC±dôÕU´u´J/ê :™¿×g1{ÙT"›Dd÷ûÐZxÇ«Žjá¬.2t~ÅêÀµM…Ú3«³—ÕÓË"ö²Hx"$æ8NÁ»êh8™ÙÃ)b+=Þßa™‰…Qï&ÑÉÄïÇ ŽwO.ðÕÿ©^z/OÿÇË÷ K7/Эx¢õSyšiù™ÊÿÑíâ7~´|èÚ?düŽöÿŒg£Â›÷ä}ꛜrú®¤ò*‡nÜÐmŠ /ç‡ð,Pi½Ü(ôn¼ÿ~/´0£Ýéß›TZ‹;y.êCë¢Py Òº¹á«ôþ2­‡':>ˆâÆ`SxböQy€+.nö}?³ÿGÀp–Œ®ÿÌ^Sác<Ô˜‰l2mŸ΢õÓún°á2Ç“@j£3»ûi“âC4½Aêí>RÛù£7˜=w(]WN±H×úé­`Ú~Òy‹D¸M$Ü"uÞ$·÷õ^¾Áj¿Ñ×Á"_bö\¡\;½§³¯£mÒ‹þ½MïdÁ€nJtn1ôó=ijmW¯¼}öÑÕƒÉêíØs}àÀûòâ:»óé]6­õê0…Mê"3wtî´Q:ö†`Ý42‘ÖIa¶ÒØ0¿•Ö…I»Äî½Âîjeô‰ìnâÐúÀyû “ÞFƒ6ÔsÚ(ׯQo‚VÊÍ6\éVùf'ùv'åd;õVõV mÜ5Òâ8˜Æá3É·[È79ZÉ7& CeZiP%f• ãõNÎÈ€Â$Àm•ÐLøŠ³Ìø’4¨Þdâ¨0€èœ¤´ÓðlCÕ»ÝNAPÉ· ߸{»ÀÙ‹6ÚÚõúÐÔl§_oÏI7' ¡!>ÞNgàc}ØúÀDM`ÂÀÁªR'u°“:ÌÙÜx’Ç+:¨w&(w:h· ÔÛ_çÃ4í&ª§nèãMü«oJè Þ›’hÝNú ·p7&&8îLC`ÜÅÝþÖ]ýA'ýQ'ãîà,ÉY«0nç;ÃŒ¡NÆ@'³¯ƒ90¡¯“Íîd³,žl˜ °è#Z’ÕÅîîd÷vÁ4c¨‹ =ÜÍb˜ƒÝ´ú=|a9L`^ç”3=ŽÕ?Åà$«¿«Ùæw±Ù]ì.Öõ C„¾>B:^G?“ÐÇîè °¯ãð…§éƒgT¨ö´ìföw3{ƒhšÅèfѺÙTs»Ìl!÷µP’Ù-z …ÚÉ}íäAÐJ„Ú«Tä ­ÿ*}\£ ´RÚ(Ð ‡:p0ÑJ×AÛD—D½’üU' \dX- wZrZû´l§Þ˜ÜÐ4­x 9Ú¿æpù*FCÝ|§ôÕõYx,¿ÞF|ÜFz„?–Ã(ÿ@_¡…éxÒÚèÎÞ‰èm ÆWãÝjºz?O„ÝÁ`v0“ÖÎd´3™ƒ=Í¡µ³(LJ“Ùaô!èÐbÛàV+k¸•5ÐÊîkc±P[e o»hwºh·PG]ú;êÝ(ñšðm´ÉÄ7 le\Ÿjò22ÑyG»Ûêø¦§  1nhÂ0‚ºðÆ0OÐ5x™hÕÓu²†yúÑåÔÿV}fÒBeñ„ßwxh£÷ñ4S9?Zþš©>3ø_í–§™–‡áO<;ïßôß)­ý3-÷ˆï×93¸¹ð4SQ„ñKÍ7PýQçåáÛ[Òð/p«â ݶ~D‹·^ö ·î¾Ánö0Op‹ü!-è~ÇC+…Å~ËàÖßJéŸzë™Ä¹'rk§ó4>pš.ûÐé,Ž6¤¯…\&Ò.)pãîí냱ÑF$ôP‰T*•Fáa°àıãT2åöÍ[]˜¸>4L$öPhD@£’™ðè?þçEé0ÝßÇ¢ÐÈ„V…800ÐÏè»Î¦¢7ªT2z–„ñ?D¤Ó‰Œ^æu"}4xýÞ©“Ý7¨¤þ÷©];häæïØLò™ökgE%Uÿ\¡5_Ðó×µ~¿ˆøþ$é2KÞd–¢î?åtÿ#i6WÈcáZï¥ü. \þ#ø³¨ÿÜj9À/ïÏ/ï;Cò ¨„ Á…NRš* QŒ€V¢J‘ÂJ‘¢Jáœ@D9jœJ„˜rÄx*G‰ªD‹ªFâ"DUÃDÕB¾s´,©-®‹‹Ÿ’±âêÑ1¢q‘¼IiÅr“ÔŽ•ÖIâ’dõ’Æé'Nˆ‡”1H’1Hæ3H’3HÀÅÉ&ÊÆ+ÆËÅ*Æà`"VÑ(AÑ(VÙ$HÑ$DÙ0IÑ0UÙ0NÑ8ZÅ(^É(UE?_É _É(YÉ8QÉ0CÉ0KÉ$EÉ4aœIÒ„”)Ò¦HQ1ODÌRTÌ2TL3UL³³ UóTU‹$ l™ÓÊæ™ªfyªf9jféjæÉ\Rµ-34­2&2KÓ2 Ïmë|\޶M†¶m*b“®m“eì°ÑбÈС Çõ†Ny†N¹¦.ùÆ.ÀȵÀÀµ@ßmœ{!0tCŒÝ M\ Í\Pšzl@Ü‹LÝ‹MÝÊLÝ*Ì\A•…K•…k®ÌÒµØÒµÈÒmƒ…[‘¹{™™G™™{ù´4÷¨0÷,çN ¯ ïMSYz!6¾¥¸`÷5KmüjlüªlŠlü‹­|­|·XùWYù—!~5V>Û¬|›lü*lüËl|ëm|íêìªì+€\pªÁÕáj‚Ñ»à:» žìƒyrWï\‹„Ts8‡Õ~« ¯p(AÂË]«Âë#@­cd¥St™SL±st‘st±kT©[D…GxGX½Gdã$¯ˆÉlð‰Þì½Ù'ºÁ+¦“^1u±M±Û&ì^1ã¼£'ÄlóF¼cš¼ã6{Ç×yÇ7L㛸Ù7¡éûù'mã) e+O©Ûx JÛÎSh殞½‡§ˆœ½?$2wOÑùxJ,jæ)¹ø(O)%ÇxJ/?ùC2+Oó”Uu†§ìê³<åÔœã)·öü .ò”_ù‡4\áiÖž66µò´©©…§â­­<•noÿ!e»:y*ßM˜IéÊ÷uóTs€øCjöòTwˆÈSÃaOÍdž6¡ð´å(•§¦ãtž¶ž`ÌdËI¶aó´ã\?Oû®ÜàiÿÕ›<¸v‹—›[¶ p;Ô>ÈSsç0OG×yè¼q¼óîñÎûàè·.RŸk¿y‘tÿÈUÆéVÖÕÞ¡ mô«Äë§znï½ÇmëÐÕ×-CoÏÑŸî¹Ú¬çîYÚ“£½w›I÷À±Þ'zœîzNu?:ÑýhWËõÃäÇgÞè}°õâÀIâÓæ–{/ Ÿ#Ü;O¸}®ûúÙî›g»àËß;Õ{}ÿµžã]ì#-wÎv¼½@øÒByÄhë#ÝîÀ°'n‡ØsTg-3þC,~Ö²ˆ­M˜%>KÂc–ŒÃ,Y»Y’®ÿZ5{u¼ա³×Dücmú¬ué¿ò/Xí±z™ûš¥^‹V„þ±*êW¾˜ „Ïó™%ðÇŠä?—¥ÿÁõ«@ðìuÈk‘¹¸yëBÀ\ÜÙ‚Èo‚as…£ç Ç‚yBшp$ÇŸ"Qˆp .nžN8~¾pX(»P$z±pôb¡Ø¥‚ `™`ò2¡Ä%Âq‹EbÀ"Ѹ"É‹„S—‰f-ÍY.’9!,-˜b=Ç2ñÜ¥RÉKdâ–J#+¤•’È™D°Z6q•²B.q¹<²R>i¥BJn0ÿq0“O!“O>›ÛZÅ\\ŸRÞDæ®UÊ^§œ!”ò4* ’ )¤’3N5KH5]H5ÿ˜'¤–+¤–-¤ž…ËROÒHš©ˆFº°F¦°F6¢žÄ´ yÉ×.@tò'äÎ ›“’zù¼Jn”2,š¢HË—Êã6ɘl”1YÛ(mR,m\.mT#mT%cT>¾€ñ&yã2yã yãy“"yÓB `\ ”LK•ÌŠ”Ìó”Ì •Lª”Lj”LË`¦Šy¹ŠY•ŠéÓFó Ä´±¨V²¬øV%P¶ªùʲnœUªMµŠmµªMŠMƒªõ– êvuêöÕã`Ú¶IÝf»¦ÍV-Û:-Ûê)jqu:ö :v›'4qhÛmÓsÜ¥ã¶ë9mÑsnÐs®ÓwjÐwÚ¬eÓ e³ Ô´iҴݬi[§iW­i_®m_´Ê4*ÔU'DÝ¥ h:#ZNU:NºŽ:NåºnU¸j]×z]—-º.Ûôw§]NÛ œ·:׺TºT@ºmÑwÛÊÍÀ}MF^M†Þ›¼&x7˜xz3ŸÍf>æHý$˜iî³ÝÔw»©ßf¿-&¾{L|˜øî4òßnê¿ÃÔo©ïaS߃f~;Ìü¶™ùî5óÝopÈ2à€eà^‹Àý–þÍG- Y¶ǬŽX° ÚgxXí³ ÞÃÖ!¬C÷MÏCÖÁG¬ƒáŽØÆöá‡íÃN8Œ„i§ÈΑÛ"w;Dî³ØÑzwGÛMn»:nó´»óO{»îñ@xp°ëÅAÂ_ ¯öwC»^ìm}¸ýÜàeú«#WÎÐb9}~Ž0x²ûöÑžûÜîì¾:¹ãRß‘î{'ÉvÜÚÕ2tø4÷><Öýðx×#p¬ëIsϳ‹Ã£›ŽRްÞïë}¾«ýá1⫃­®Ðß"Ü?ÓuëT÷ p² Vyx¼ûþ±Þ‡ Ô«Žt<<ÚöîB/v¢ã¯½—]·‡Ú)Œ÷#c¤¶V*õ›´ÞOÒN‹åâ箈^²[ÀoÝÒáÅA+WÏã ÿY0æ"Qÿ ú·pè¯|™¿¯ÉúU0úáà߄ق`Ž ?˜+þ³EBE~ ûU8òWáhÈßðß„CsDÂÁlÑÈ٢ѳEbq¿‹$ÍNÿC8æ‰D-1 “ ¤.ÌX$”ÏóE£ÁŸ" sEÒþN[,»XU†Þã࣑O£o£¾¾_ƒ¾ïv=ßz~[uü·èûoÓ÷ß¡ï·[ßo—“ÿfC¿m†¾»Œü÷#» öù5ô;ièßlèÐ8ð°IÀÿ“&GM÷™í2Øo¸Ç$¤Ñ8¬Ê8¬fZšFÔ™FÔLÏð-&a‡LB›… æ!GÍCš-‚Y„´ Ûg¶‡Ã"ì€EØ!‹Ð#¡‡mÃØ…í³ k¶;fvX†Ÿ²Œ8fuÔ:úMôOð\à~ =ä « ¶a‡&9Dqˆ:ìu8FíΑð±ß.n¯dì~û˜“£q1ûSô^§˜ÝÀ1v§cÂn‡¯öâöÛ'ìwJ:è’÷ãöNrNÞ‡;0-]S¹¦àN÷ôCî¿?=3›=³zeñÊnæNŸœc>¹G¹Ó7÷¸oÞ1îôË;á—œ; NžäΠõg‚6œæÎ°âóaÅg¹3¢ôbDéyîŒ,»Yváû3ªürTùE¼Sy™;ãª[⪯rg|Mk|Í5îL¨mK¨máΤúޤú6®ìHnèä)¥‘ÀSêæ.žÒ›z~HÆÖ^^º³¶÷‚ìmÓ3g;1{‘;swrv’¸3%o7…;óöRy*ØOç–·Ÿž€ÁSÁA&Oëg°á‹ƦÃ,žJŽôýR®,?6Pvl€;+O UœâΪ“Õ'‡yä™m"Ó„õR9 £týÄ —À!f”$f”"f˜&f˜dŠdCŠ!¢FY¢F9"FyÂÆÂFë׋™mÀå‹›åJ˜eI˜eH™¥I˜§IšgK˜H˜–K˜TJ˜m”0Ï•´H‡™2¦Å2¦%2¦E²fy²©ˆY¾¬é˜¾…;>h—4/–±Ü gYä-s-%óEó« r6ëå¬7|«HÞfÓ„’Ir6%²¶%Ò¶eÒ¶Ò¶•Ò6Õ²HÌW´Û¤h¿AÙg»IÙ¦BźVźZݶXÝn#PE6!¶¥@áJÝ¡¨:Ö!õª*Ž*NÛTœšTœëU«Õ\Ê4œK47i:• q¾C…†C ZѱBÕ¹TÕ¹ !½K¹ºk¹2>ìêî5@©Òt¯Ún•Ú^Eˆg‰¦g…–{µ–{½–Û ëÖ¤ë¶Y×½NϽZÏ£TÏs£žW¡®×F]ïjï:]¯ºi©ïÓ çÛÀ0ø×ñ­ã$ þu}k8Œpu&HÍWÁuÀi0 n2Þ ôC¶†ìà0Þa¼˜‚ m¦Á»MBvš„m6 ÛfÜltÌ(ä€aè^“°ýf¡‡ðA{³EØ6‹ðF«Ða;Ì#Í"k¹YD×s3‹n2‹ÞgÕlyÄ<²Ù2¢Ù*âUä>ëÈÝÖQ[­£š¬£6[E7YEí´ŒÚcyÈ*â€}Ô^#|›¨£6‘§¬#ÏXCF³m¶;`‡Þíñ¡»ct³SÔ!·Øýn±{]âö:ÇïuŽÛï?Î)á€SÂ>à’°Ç%a·kÂN÷ø.0DOáŒÒ¸$Cn‰‡Ü’àö¹'íuOÚíž´Ó-y§[ê^×´ý0PwIC#v—Ôfà”Öìœ~Ì9ýpÊ8ì”qÐ)ópÎ8à–q×<-=²Žzd5s§WÎQ¯œ#Üé™ š¹Ó;÷˜wîQîô+8éWp‚;ý Oùžä΀õ§ÖŸâÎÀ g7œæÎ gƒ6žáÎÐâ ¡Åç¹3¬äbXÉîD ”œåÎðÒ‹áeç¹3¢ìRDù¼]u™;cª®ÅT_áθšÖ¸ÚkÜ™PמPßúý™Xß‘ØÐÆÉ„äÍÜ™²¥ó‡¤6xJßÖÍSÖNâÉÙMÎÙMä–»‡ÄSþ>Ê9HËã¥à0ƒ§Âffþ‘°ñXO›N p+>1P~r¨üä·ÊÓCÚÛ{ÿ éîQò­{FºÓÝ?ÔÍb´öv2,: ÿôÓe§%éjbcŸ¯]<;Ħ÷ÑÉäî:¥‡Î ÓéTþ;Þû©èׂ²ht:]\QÇ'*ÓþØJ|ùæ3Êb(ƒL&þ·Ô{Ç—þ{iÐ/a¨ý-äËÙõ\/^B3·“r…µH)“ôÕÊ‘â‚ZIë4DõÒ…´“¨^|ÔJÖI‚e–ȉ$‹è% éÄ„¨~‚”Iê"o ã¤û›µH^«$n-j-¤±Z5hV¤¸aŠˆn²’õ(GD'FÚ8YÒ8ÆÉËU¢DMrô²øu3$ÌÖ/W»1Š)ÚJ™¥JšÄ+Z% 뇈úËZÇ ë'JšdŠFŠ›ËÙ‰›J'Èšg‰ŪØ%®Õ²W´ V²Nו0ˆÓw/†½7ÌQ´Þ$iV ¤Ÿ.g“§ê”%d ä¡í³ZÅÖØ;UÆÐGJßGÙ6î.†±^c:žÙÒQ*ŽÉbÆ¡*©Òæ1@É.UÔ0RË-WÍ9[Ù-OÐ,IÅm£ q¢’ËF‡|9ÛLië$£5çD÷9Ëp ‡]—9'Ðküœè¥}îIH¿¼SèE=WúçŸöÏ?ÉgÐ ü‚3…§ Ï¢—öëÏýMo8¼á,w†l¼²ñdhÑùТ‹a›.„mº„çôÂæ /¹^|½ü/¹45ÑëýÒËèe~Ù•¿Éèò«ÑW ÑëýŠk±U×b+[¾'ÑkÿªVô’¿º 2¡¦½ØçÊÄڎĺvîLªëD/ü¹sÂL¯ý9¯÷Ó¶tÿ½ÿñ=æ6"ÈÚNú[½“²wà/ùw’8rw‘yB¯ôyÉßCå(ØK…ûè€óJŸ§i/ö ±@Áá6³yZx܆æ>°ñHÿ4EGÀ¦cƒÈñþ’cý¥GÿNçeþñÁi*8/óñ—öߣêÔuP}úÆ45gn‚Ú³·@͹ÿù~õ…Û€óÒ¾zŠšKwAíå{œ“sê®ÜŸ¦þêÐpíáwjly6·>žfKÛÐÔþ”ƒóqrÎÖŽgÓlë|¶^pp>NÎÙÑõÇäœ;»_"=/vu?ßÙƒ Þ»IÏ÷ï'>ØÑÂ>Fza-TFßí[-]- voOo[¥—ÐÛCe2؃Ý]=d³¿>lÜ ¤¦úÈT …AÿÇ¿ÿõÓ~žõÏÎú÷ϳ~úLüç·_gýsÖ¯sf“X}mdfln™¼‘ã)Bÿé®>{wчHt6…Êìc R{)} :±‹@줲èCä^z›I§wQ©ä¬ô2mUÏÖK:Ûît“Èè7åШØ(Æî¦þZ³6píJƒ¥êù|r_>4¯kžÀµyk¨«Vt-_|zîªF5¹e«V)ËüW>_')[.Lf–’hÄﮯÑO°ÿèüCÂv–°É51ùˆeË\ç®qÿ×J‡…â¾³ù„Ô"Zlòîÿ…IhEý´Ð`¡Ëq¯?Ö¹ÌZ`ºT*xžXà<©¨¹RѳE`\š:GÈ{ö:×,2[,î3OÐíO!ï?…ý—ÊÄ,’ŒŸµÈk™Bî\ñÄß×…/“üm¹¤‰?Ü4ï`Ïǰ;¯±ÇŸ°Ânøï ÇV*Û-–s+ìÿ‡€Ï3ü—¿ ª¸ÎY£¿RÊNÐܵfÏñÅ~YcºBÎk©´û Y¸¥ÞÅV*,’ö™'î&e”ôß5–°Ì­w°®ÿ"{XåñÆ)þSØg‰L¨€ŒãW©d.’L\­”µV­à_+eŒ*Š%þ¶:X\»€O>y±X(ŸB´œaöRqÿy®«d„4Â×(yó«º/‘±âÜÍ—Ë{,“X À¯ž"¬›µJ-nnü%¿ù²ž³EÜ„´²æ & (¯_«˧è»î¿ÅžÁžb y j† ëÆ­”KÓ)ÖL]!¨l‘ õÕŽ¹ó»?‚êŒo1£d »üå2~«ä‚E4ø•"TcÍrWÈ ÖU4ËPZ«qý ZkµBœIµBÖOÚ0IÊ ÑÈ£x©”'|uÿ &¢¢f›¶NÍ_H3HÎ4ž³!(_Æ0CR/]L;IÚ ^Õ*]B'ŽO9\Á²PÕ¾LP/KκX@7S͹FªðüŧM|Œ^YóEó41X˜f½Ä¬Â’ÖiÙrJÔÔrN|Š´{ŸÑò0•-7È› h¤H›æ©Ú—H𦠄i¸ÅÁb7ðÎâÑg솙yÄ(˜pŠ’4ö“6 zî©2¦Áœ™·>Ÿ_eëØuêžÊ¶ *n9"æ‰JÎRÖª.ëað¯ã‘¯ë•£í–ø_ ×uŠW³ˆ1qË{ð{€7’›oÑ|#Ï ópøø` »;‚Š%ÞÃ,CjáéÉÀ§Ü2¸6 j•×ËÚ¦À¡¸þSwŒ0tŒŸbU‹03ÏÌçø>Ú†Üþ‚¸L}J$tS”- ­·Ë›oP¶.Õ÷hÒvi@?Y°«Òq©³ Û7ðfêÝ l‘¯ã´ÑÈk“Uh¦K¡Žû&%Ë\}· ïZëBcjm‡"h áõÆÐ&t]ÒìÂʬƒk|+TìòMªUí d-Òµ\ŠLü«Œ}«l#¶À]b³€Zï274aä]ëµOÓ©ÌЫÎÀ³ÖÌ‹Sô^xú0ð¬ú5VÁ[a£î ‡ºncá[Ÿà»cîWæŸ~PÇ£@Ï»HÏ·žl¢öøÕ˜ÕšøWXÖ›ûV[TÚWX‡Wëúd‡eZFo´Ý£èX¡è\`WgRj\aе}À9DA¹:NÙñ|¶êº7è¸Õûg^´ Ûo¸Ë"h·¡w“møçØ£0ÇÔ‡×Ï´“–qÛt‚Ëì’w;$îÒõ)ƒÇ—¸ZhuPOæË/œÆ`’cà›ï•¾×$ Ä"8ÓT,‚Š´ÝóáštÒ9ñ’|Ò9ù¸sÊQ—Ô£œ ¸¥î)'§¥Gê)÷´¼òkÛRéÄŸ—{Î]ç³Taür6Þ£»íy'qí€yBæËeœáîüÃî|BÃݹ®*hØö†-à·y9† ”X&ê¹RÒÿ÷Õ. FKÄÖIÅ®’M[)—)¬¶a‰Xê:Å `Îêý Õÿžï)©š+­‘³J{ ]·é:6iÛo6óÚ­a]}ïæ¼_Ëj“•gƒ‰k¥K©’Y¦¥o‚I¦ÿ#×J}‡Ç &U“l×Э¦®%ª¦ib÷ß`&ÎyFÎùjYV~µÆîÖþuFnå)‡Ý¢vC 0­b‘í·ßؽLß¹¾5󪆙6þ[e ²mü·Ùîж+u:hêÞ¨m[n¸ËÄ£Ñ7ñ´žs†Mùã1,8ã’¦]‘¥W‘µÇzs—ÇÀS¯"—èF§ÈFÞ ö¡»Åt“=ãwÙ×YyÖ™:•º×;úW8†n± ©qM®TvH2öÙmqÎ1®Ù:z›iH½Mø.ヲž›9ýÔ9pcBÞ1SÏrûÐ-À¯ÆÄ«Â̧ÊÒ¿>Ú7ú&Ôu.rk‚i8QoÑv-±Û«Øh¾Ç1î¨MÈ>Ï:·¨¨§¼Ç¢ ]¢òoã„aÞ‰Çl7?ÃÆó!Ù;Ýã¶ØWÚ…×xÁãRÞ|¾}T¶CT6ç©ÍÊ/®?Ъâ7û'mƒKŒö̓*¢7{¥îqIhz0ŠyÆ7ø$Ô?ø„®Q^QåÞq›]#êƒS÷ÛÔ„eÌ>aåU”t(,í¨•We@ÜN¸A™®¡¥QY;‚S·‡çóK>–}Þ1tŸGìq÷˜S-ÎQ§Ýâ.ׄK.‰\Ϲ&ƒ3À=éðL¼4-½’.{$_ä‘É|¿4?(Eî•F*͘åÍ÷+߯8ò ªùä¤Ê£AÕ±Gß©úøcPsâÉ4µ'Ÿ‚ºSÏ@íi¤æÌßeíÙçugž×{Qödݹç5çáãóÚ /êÏ¿¨»øWÃ…¿ azêœúK//¾œš —_m¾ôªñÊë-—_On¾ú¦éÊ›-×Þn½úvj6µ¼ÛvíÝÖÖ÷Û[Þom}½­õ úÓþ­¶¶?ÚÞ†ÿ ÿö'Ss{ç“øŸðï„áýS˜ž:gg׳Ýð?ã|;9gW÷ó=]/öt½ÜÛùaoç§½#{ Ÿ÷¾ìëþ´¿ëá®×Í„'Í­7adNa?èé¦Ñz)”Žv*¡•Eï$ Ѻ»/ß¼É"‘ZÈäv«{Ó¦ ™/_^wtœ§Ó»V¯žßÓsíÎ~&ƒL"uܦ0¨W»;O.\ðOF_w‘”[¨lhs¦“qž@ÿˆa0ò‡µh´ “4ëçYð˜À 1ú™³`èÿïYdv7‰ÝÒÃ"$ç©h¹\l¹™p«…Nìêìež‡Ás ãƒ6KÒòÕÖ.¿i-5ðøIHi–èÊvË×ú¯]i¡³Ê>tQxð¿-f Ö(¸Xé4KÊZÈjÞ|=~áôßx½ÅÿTì5öò6óÕÚ¬sûu™ 8_àà>µÏföƒgÑ`f¥ dÿ]4@zø-°`ó|Aïe²±‹%cæ ¨Æ-pã¬8ð{þ {ô›Ïï& ”ðëJߥâÉ¿¬ŠX*™Ã'[4]쬹zOñ›þRQG)ÕôÕÂI‹VG Ë%p†[KÄmæ 8‹klš·:ÆíoñÑÔãwØJ1C8ARšnp«}ö[.i5w‘¨¦ßOKµ'_&9ƒ8Ö#TøWØÓO˜¸ª×óTÂü5¦Ò¡B è÷‚ (†¯’ ÓHÑH_)›0wm°´Þ†¥bq"ª¹+ÅâWŠÄˆ)gŠ*$=zƒ=}=|ƒ½þ‚½ÅVЏ(ë¥ ËG>z‹=ýŒîã0Ü… -óZ+›°F:CP¡HL­|±hÒ:å,>•$a”ßÖ¹ kg¯’,PÔ­WK\-é»õ ‘TJ—UO]+ô/ œ¿F.—O&JÕ4ãå(&¤,ªT8ž«¥Ýø¥=`CO>b’Z/ñŸ˜ÈhÆ>ùŒ‰(†JjƼœ8eÒšBÊ0 ë€Y\#dµ„ë üÇ((Ç0e“)Í'_Ð5‹UÓð‡Ÿ±¿`˜ícx4hÇϯ¤j¼¶E.ì5ùgŸÐŠzöE‹Dü ]D43$õrï”Íò–‰{ÊjG¼Âœ¤eÈù‹3šéⲑpÌa&ÿŒ'ôµë/1l+™m0r©Ó´.µðÞ Ï_šùfÎÅf.EÐz~@?û€:˜{–ª˜&ÃÑxøƒ}„Ç“ç_ÐO‘\‚J_⛀£ÌÜ×›{Á2èÇv/Pù:¶™öA•°"û1¦a™ ó] žâ'Î:’c˜K`£žu> PádA%¡b@סDÛ¡ØÜ§ÞÔ«þá(ú‘„‰GœÐwc˜•sžƒo)ìë vïz®‘;lkžãÍ úË[(ù5fï“ó/üŸ-|þx¹ï!Ë€ÓŠvez0ªm´ ÛmæqÀ%ø:•c˜ox9ãƹ@U!]«ï¾GÀ6 ÄÚo“Wlã}|×8O‘öa5–‘ÛÌÃ÷î6ñÝíuÂ5ü C@Ãí—¨žÑùV>è’Ï!›õjàéÆ9´ô9~êÍ= mý+Ý¢·9„6fì󈫇zÂCœor™_RÙ#¼wûÅ–ùFUº…”{„V{D6pœ¢¶¹%î±®sOÚ Ý£"²öÁÂ÷^¡³дÜÃ*£³ö[zlx‰÷Ê'ÐË>èàWZ¦wäÆWøuàî;t|±°¬S¡g½âŽ9…Íju;‹$œsM<ëšxÚ-ù”kÊ ×äSîÉg=“Îsƒq>/ç¼RÎïÔ³>iç8|ÓÏóä—qáoøg^äȺĘ}™§ œ+<ç^åÉ»Bó[þ^XA+Oá…mëÛA䆎 m/jc;ˆ.ê˜&fS'ˆ-&ü½¸’.ŽøÒnPÖóË{AR‘#¹’ÄSJ™§ÔjÊ Hi5d^K™&£Ž 2ëi/«áÿãí= ÚH¶¶]æÌ̱gÆã0ØäœD”D"‘„„BäœA"‘sc±ÁÙ㜳1Éçœs¶Ç9õÝ­žãïüvÛßÌ]ÿ½¬gíµ«ººººÕ¢ß]]U:Ž‹lþ Œ‚Ž“@á‚SßA¶ðäg  ŸÆ(Zr—â¥gq)Yv£´ë«®àR¹ò/ªV]ªW_û‚š5×Úµ7PÖ]«[{­aÍ÷h\{hZwhXÿ?4n¸ 4ýqëoÒ¼ñ6вéδn¾ ÌÛr£uëÿ¼m÷¶íäÜ›·ã/ÚvÞÚw=ÀÀ’Ÿsæï~ø{ ö>þ›tî{,Üÿô x,>ø\ÎÐÿ‹@ÿº³ôÿá»K@óÿŸ,µß{h{9XòsN¨}9Ÿ `Éå ÿû­8ú´»÷E÷‘×(G߬è{ÓÝÿº§ÿÅêþ'kÑ•v.ƒz:~ytøÄpïá;çO^9Þ?Ü»ãøÐÞÓ£ÿÛ^8u´XšìlG€áàŸ?Ù ~¸oç±£»Æúö:xùô¡óÇw]=·oÜ £#{†Fz%Esב±=½# »ÇFÏŒ8=¶wìDïðñàÿÿõ³Â¿~Tý?2Ö+ÿ…«ÝÇNÌ‘•ÚPv¸¶ïèåƒcGÏ=³õr{äÜþ=cÇÒü >EÅÍJÛ!ŤMµTt0ÿ8^7nÅ[‹KüÍZðïÙ ôlÅ zóUÙEjLÿÙŒ)“xÓõ£o>ýôA&˜¨ØG݆ÇÐ+D[Åy‰<}(x*üf€ š£gÿTþsÅÊ:dÌ™©e¯N`€ðÅ8ÓÀ{†1Wa–Ë,Sî}¯ŸgÛÀÓöö+DÃÜSèûL.Þ¦R” ¡“uBTˆé“tb& (Ŧ´ä³OÑ­ã•)³µC§Î Ÿ£“Î=87PÂ6sÌøT"õI2ПÊZÎ 9àÐߣÎÙº PwðœýE‰fNKV1 6 &ƒxº÷Æ´7t)*¡—$ „y ŸÖ}ëOô™«aÎ2²)ø=’O‚€}u)13 U-à ǘš¤i)Ò¶ÎÑ÷G·ˆ5=tšª6+|¶–ï³ÈýWˆ‘-ÇÌ‘Í8÷±pM1¢ˆuɲii*„|=JÉ ƒCÇìq¾ºÎ±zÎɳôSfèÄ©[Ñ81§ïÞ.h 8£9l<ŒºMš)­TÝ<êÔ¶ô·¤…X³Á?}±óŽ2¶ |* ºd&3@þAdæ€êá›B\D ro¼@˘:©˜ÐÊe!Á‘‹•×¶bXÑ7_ ÇÐÖr®z…žæÝ×l=yZ¦"GF¥½g>ý!ÂS`âjd—fEO {¦™»”ê .%z™)½ÆÛaá%£°³nÊo!2-ÊÝ/ïÖ}äÙkÄÍ? >S8œƒw<É%¢0ð ¬9÷ä/‰,D6î± ;ïË{ò|sÍ=‹¬šÍ<*­ Öð¯±ó+#zŠ-èñèé?Aœ}Â^ÊçìÛ9 iqo> ÝŸËã |…eXÐäè_@ ¬ðnrá6Ú0+,=Jš©ólý,™޼F{v)‘‘u»±â¡Î›ŸÀt¨ù ÈuŸ8^ V• +øî«Í\"0që!,sdåz†Ÿy€Ðy9¾"™=3Ó‡¾¡Eþgî Å„)Uäw¾Ohšk`öýò I½ýF¹Ñù^ü4÷ ”Çòú=…La&æûDd_}Ž`1àí÷ ŒKÑhè‹©_¨ø:„ ¤¼6ìˆ>¡ù^B7¡–ÆÏdÌs –ÁÍÉJn!úe¹‡æÝzö>ß QîíçháàÔ¿Èü»Ð/'¾ìî{4"ŽJ­gñ²Ÿ½'HHb‹'ï¾|Poôj·Õ±å{„n5¬¸NO~W`ä¨çþ[$<® ‚&øp#³š¢%-—Ÿ ­õ Ë÷ä‹ïÈÃ=fHz«¿„G%næÆ–ÄWÓ#Y=>I=Nüv¿Èåܘ.~l;zK¿AüÃ’ùñì*ùEÔÇän ŠëKYQr^TGXêjQêZWvCPRWhÚ²Ûò‘f>aE~¢¢gò{ 2­54±>>»3Yº . AAéA™KÜ#ë#‹Öž{‰xGÖ 3;ü"J¡UpÛ„$”Ed–cßSAb!Øïarexj Ú Q™W}„#™%Õî?œä¢ÆŒj,²Ji ˆo‘¶  jø™Ý(â€'é–Oîâå¬àç¬ÄE»êôÁy+1B¤«0„ù«q •­ù¢‚µa…ë0‹ÖãQ¼—È’?0¢J7Ñe›¾OLùf\b+¶`ÄUnâ«¶ýEõ–ï“P³H¬ÝöIuÛäúß'¥a'Fjã. ­i÷ß$½yѲ#³u.Yóöã"n;ð ö‰Ûö’ö}@öüý_ÓqÈ]pðûäuÂEºð0Fþ¢#€lqïÿJþ’Àlé `Y/Fa×Q\Š–÷áR¼¢£¤{(íü>e+‡0ÊW*Vc”¯Á§bí.•kþ¢jí(P½nì jÖj7œÀ¨Cûõ6žøLý&”†Í'Æ-§þ&M[OÍÛÎ|AËö³@ëŽs“y;Ïm».`ÌvŸÚöœÚ÷^ÀÀ’Ÿsæï»øû/ \þ›t¼,råðÍEòÎ`ñ¡{À’Ã÷¿`é´ÏYïC ,ù9§ëè#ŒÏ°¤¼óÿñоGÝ}÷ºûî vàþŠûÝC÷zלּ¾iøÚ¶c I‘ÃÇú._>~hïê[öíîº~®ïÔ±ýÀÕ³ƒC‡·9xvôÐà¡­é®öfȧg'‡öãn^¹rjðÒðÑ;§‡Îöo=ydݹá¿*(œ=±ÿܹ±\Y‘³÷žC'öE>!'GúÏî;?²çôÀÞ“{\’¿)(<¼töLÿþ3;/Œî<;²¿4»ØÕÚ¿w÷µ¾ƒè‹:|âøP§Žï;J¿:ªØƒøgN´XiÉœoîi¡L5eÕeEÉTPèRsËT°ì0ç9(èëÌNÒà¿–Ëû fÌñþ7T,iÏp…¬×ònaì‰|ù>¢Apxð}Ž+ëZ=~‡öb©9ÍÖ£‚ò|øQµ`ßûÏpÙ³OeS/Ø÷ê3„`ïûãT}¨äÜ=DÏ6 ôù½à)úucÕ, §jÇÎ4aÝø€>mgy(„ò”´â”ôEåÃx&ëSUI‚éºñ³´åúŸflÅ}!ïL†:çø¢âí1b㙥l4~.c®Y<=§éé;Äbc féSçš:>“‹C[5c;PÚ/ä§Œ à_•(Ñi¡Ú”`l ¿Š%×Ì%þ>œ”w.!ÀÀ&ؘ"¸û föLc[W,ü!X ž~@ëѲð0°õºñ­M‹<]+ÄÂ¥R—X¦n^¨n%µt¯¢Xß®XÏVfd®cMÇT–!)DÃDD¤%=cÕlèSŒu³ÍDôÉÖîa³õ±ÂXé[û™9¢¯?ÎßCÈôHÐÀº$_l+Ñ5„è*À|]Ó#( œ‹Kªÿ/=FóïÊê­—ˆ•+úFü«Ï?Ýÿ€ÐÈnl»bºD*3‰èƒ…—G‹$÷$z™ÕDô®³òª°gÕØúiÙ„ùG–>•ïHtñ…/ÂÇGÆôNx%¿IL©|¦ מ™dë™z¤#¤’ä™GdH¡î!mNœf «Ñ̽ŒèSCö«¢p*‰Ìlj@6V'œïÜûùR`¤ùFqbr 4ƒ»‹ WøÞ;„_HfDÜzƒ@Ðê”Me¥qª!2òÎòÍ¢sb±¯á£Ö› Ÿ)ÝyOþs? ²V”ÄàÇaß 'Õ“ŸûSy÷øÍ×è^¨  š6ý©\ü»FûEdºóÎ?ú›|Eéì°ôGòÏÈ›Ÿ·:Ü'èîŸ*+‰YȈ,p “]xƒ8„H½ê8Éåp¹ž½ù+{ô¹ûîÓ3yw÷ƒOÈùGV”c­ Šò%ïáèO?ÅV1#J°qøþq«mý;©‚Vz-¬‚—º”²ÜWØþT~ÑBc¤/åß,Ï Tav£r¢ó£²Ð ðµõ ÃÕÀÎr|¢DYÍžqÍžIK¼â—yE-å%®eEtr"›žÉïÛòÆ€ï”ʼnkåÆwû‰ Úï¼DÿÝʼn×xòš‚zâs·y [AÿC|÷!n‹Êjƒx îŸÈ´–ˆÔfwŽä–|°"+¶“ÒÎÍ\”ÓÅ—,;ó7n Îl‹·ßJý¸ìVDñÚs$>¯îɧ¿bIôn”W˜^Ðþâ³óà”á›.Ê̤<Å‘y ¼#*ƒR;K7ò³º‚²VðÅÝ þy’卸Ï] åvãÂÏëù+´#8¿#D¶aÁªïZ¸CT´#¬x-.á%ëp‰(]Y¶ˆ*ÿãûDWlÄ%¦rFlÕf ®zË_Ôlú>ñµ›„º-_X¿HjØö}’·c¤4íR›wþMÒZvé­»12æíÁ%³m/.Yíû¾lÚ ˆçï${¿ {Á> §sÿ÷É]x—¼E1¤‹˜¶ÿKJåä/;Ⱥc,?‚KáŠ^\Šºb÷ô%+û1J¿AÙªŒòÕƒ@Åš! üÛT¬=†Kå¨Z7 T¯ù‚š £@ícÿaäûÔmê7}¦n3Jý–ã@ÃÖ“Æm'¦í§¾ yÇi eçŒÖÿ óvžÚväÊÿ FÛž³@ûÞsXòsÎü}ç¿ cÿ`Á‹“΃—€…‡.Á¢ÃW€ÅG®Ê¹þÿƒþ_Ùw  ú¿{èöÊ¡ëËöî:q þ9ë¿telàÈú;—Þ¹tøØ‘íCGöœë¿|fdøè¾C‡¯ž»rv´0'fOD>½ºprèÒéá+(\Xš]êbØ»ëFß«CCÃc§ŽžCÞ|¼ÛôÔ¡ ¿ëe(V)¨KÆk§ü®bleü;“ù³]«ª]úmÕ˜´jzæê(̪×b»NÒ2šnd¦6eŠ×3ù£v²ªÇM÷koßóRC•ñá*´&(»NžKWÖõÒ&øéYø>x>UôœŸ½C©ºf,UC_ì)Í/à–ô$HÚû¦ÚxÆpbаNl/^-]çÆ©¶eˆ½‘ÅØ,¦£2#‚bŠ¡Í×#Á±ÍL^¡{`ö…è‚âª|R|„^)؇ò¸žÁÏß? ­äÚ3„SΠχ>{x¦p"‹žýgœ´Š!*cFÕ9‡”A ëÓH ®ô©¹ÿyÿ áðd¯åá0QÆmÍYiç•r_@E'Ìcs‹ßD# ?a ¦ÿ! ö _,>âÓɈoòˆ® LYêº2 bñ¹VŽÌyú½ÛüŒ ¸bìæôËåÇ—<–Ÿodf·+¨ñ‡ò€ÔS˜ç›Úá=ß-j±_Òêô-¬¨%þ¡õw^¡«(„Å?—Ÿ;¦,R¼Â;t?i¥wzŽpÿÅ6%¬÷6%tò“æó“[n½COœŸRœ\Œ Ö&Wø‹ ÐïÈ„—ÜžÓå^jÜ5ª1 }ñåO7c›¨„ŸÜ„^‚¬Œ’Ewåo+àÚb/’s»øÑõɒűéóØ¡ù/äß”¨´¢—òw‹É…­a’†ÛïÑ -íŽÌYåÙ’±ŽŸ±.(c?s/ë^Özžd=O>ÿ——ó.A¹¿lúƒŸ·C Ý„œ¿—Ù–ï ,ØŠZ¸ CT´—°â¸„—ìĈ(ÝD–íþ>Qå{p‰®Ø‹S¹ˆ­Úÿö~Ÿ¸ê}@|Íþ/H¨=$Öü>Iõ‡0’)Gþ&©M½@ZóQŒô–>\2ZûqÉœ7€O[FV{? ž?ð’ŽA {ÁÐ÷Éé<†KîÂaŒ¼E#€tñèwÈ]2œ»äFÞÒa@ºl#¿kÙò1\ VÇ(ì>õœÄ(鯧ŒR¶ò4P¾êÌgJWãP¶æ,.«ÿ¢rÍ9 jíù/¨^w¨Yñ/6œÿ>µ\ê6^jþ‹ÚM—€ºÍ—ÿ&õ[® [¯~Aã¶k@Óöë-ÿ­;nóvÞü-àߺû0oÏM ,ù9§mï­/À–÷Ÿ¿ÿÎßä[Ëþ£S}ÝG§úÊÁ’ŸsÐ ¿ÿ'èTß^tz/–üœƒNõ•ó¹–Ħý.ï{ÚÝû|eïstPßË}/—¼Z>ø¼gàIס«ÛFîÀìýý£ƒÇ®^<±ëåWN ž?}âìésgNݵc÷½;÷‡Ž öe%ån®îÞ}ûAá_#ÇF»zúò™Á‘Ë'FÆúwŸÙ7î'…㧆GΜÏ5’C¶¼µóÐõ·Ÿ‘‘3'džNŽ<:qÒ/ ÿR8q¢ÿÄñá¦Lüehèàñ‡FÇús¥56vÁ»÷=ÜsäÞÑ3GÎ^è=’åÖÀØðá+¿i§þ U>nvÎD ‰‚fì/³8žÓ‚Ëô£Êµ]‚&h8Ì¢fš5ŠºBEí@Ã,öö;´lŠ>MÙ4h–AâlÝįm“MB€¾UÐU×gh~&QTMùм¹æ¡sLE !g tlT "}R´–y¨®e(<^ŸCcŒütlLj,RÒö‡–?|ÌP蘥è[g¨ZÆM3V'Æ£jkæ”­nuïlãÐQ:ï C†¡¥ï‹÷èÈgm Ö•ªjÊз x(︛k.P·LÒ!Ë”rìëáLU‰¹Z”\uë ÛtEBšm‹Že¦EŠ)5“.†V©Vv%:fIÆTt‘Ÿ+¯­VÑíá´vÏÓ0Ô#ÇiYFas1Œìâ‰&öIj2䃀„LUB˜ =Ç‚štWÞŸib €I LíbÀ É"8ˆdrhx’KŠ)ÜÈ:6Ý|Ž˜PÂ09DvM€ˆ­ê#œx’›Ìˆ˜&×óˆ­Kœ•ˆê™cDI¶¢ÉHîe>"¦N…drS‡]Rìòä=bãëèeãäõò=òöâ䂎~umëæšn!GÏr’‹ø|ä6‘©GI"3òÿZ2ÈC¬ï”må[`˭ѧ•Zx×ÅDÿ¼[ò¸ÌÚ-ßÁ½ÚÁ­Ì…YDõLÁT;y'Qr÷¡ù¥£/)>"îl±•Sø#ù  /^ž-#ËңȔQEa7‘ýjlYÕî9f®iØK"s>Câèö§\’¹1á‡këÄ;±²-èñ®\´cöÆĉSfÏ.¥²Ë-….‚&¢O•Ûhɬ °ŒÝòéa-L …•MB§‹^}Œøð3}Y÷^ ²ÖÑ;Ö•ìž‹M)¥úÄcÛÆ=™),Gçt@hÆ)uã–=FClïÐ _a™=3ùöK´˜'§Î‘Qé#hµR™hìîÎÉòæ=“¿¶ó*€ïÈs(Øe N¹¿°ÿ ñUù +¼Åü¸f×éSy4Á «vçFÖ]”Çž\ƒ-»¢?µ=2{ÑSùø·øìNNdÖïžÒ÷áí?‘4éQBGbfWT•‘¿ {1–T†½Ž Œ/ ÏéÀ‚bÿØÖŒª=‚ôUAék±ŸæenáemB‘läI6p³7pr6æâÀÉÛüm6r¥[¸ÒM`yù›yù[Áɶɶ|mù[¿ƒ pFpÑvŒâ¸KvâZº CT¶+ßó}Â+öâQ¹#²j?U}à?ìÿ>Ñ5€˜Úƒ_[wˆ«?ü}âŽ`$4ö‰MGÿ&IÍ}@rK?FJë.©óqIk§}#}þ Ñ1ô™ ŽYÃßG¼pÉ¢QŒìÅc@Î’ãÿ£’¥£`³—å.Ëé:ž·ì8Xi׉Üå'¾¶ùËOæ­8þµ•­8%í>6¿çdA÷iÙÊS…=g {NuŸ)³Å=g‹Wž[²êLÉÊsèÊ?«ÎË—ú9_‚gK×\(E—ýùÒ~^¨|íy bÝ…/¨\¨Úp £ò‹ß§jã% zÓåÏTnFmÕ–+5›¯To½Z»åêß±5Û®Õm½V»ýzý¶ëÿmëvÜhØ~£~çÍÆ(MÛÿšwܰ•ä‹ÿÜÄhÙ} hÝsK~Ι·÷Î´í» ´ï¿÷7™à>ÐqðÁ,8ô@Wþ‘³àð݇ï K¹‹.Ô Üÿo»èè}tÁŸ¾èâ?}Àÿïœ%ýÑÅúb[?çÈ×ü|¼¬ÿq·\ü¯è}Ù}ôÕŠ¾WË^/xÑ3ðtUÿÝ5‡/?üˆ Ÿ½64:â|òx…qèx|øû øù§_†GO?söÌűÑSùÒ"š‹ûÛ7‡‡$l膭N_:´çÀõKçGž;3øÃ Ã'FŽ<ŸQÐ@v Þ~èÚÎCWAÿ¹06vbtl”?0ròØÑ¡#GFNœÄrŽ81,ί#RùÛÞÞÙwkïèùCçN_|ÿòeßé3›oLÔOž07Kmn¢¢R¸‚jˆ²r`ò¿Ýëp]&ëgé:ý¨ÑbÐ3›´a&¹s­DÍ#R›î®êl1‹®6Ýõ•¼£XÉ Haª<þî¼E¦kø+jrAÈAðä-rû*žAx_Œ>§5\!ùôƒ|2ìG"%uÃàÙz!S´Ã§&Í2IQPäÌ5O§íýOÈTm!ÄÞ$õй„”ÉšQ(&kš¥NTb« Õ ÁPHGP÷þDõáLu.šü„ŽF-Çš«t¶Fª^¨‘Uâ •€‡/#«xØdØgïÑ¡øª†Q ´ §çhGšÙJÔ ¢f©qÑI»5ƒ hðSùyAùG¯ódB²ºA‚¦iºªyúTƒXm›œúÑ”\“xrÆÝÈÓ·ˆ‘E HÙ—o‘7ïPAûì)bFR¢•Ì·> Øú™çž¡f›FªY¥«Y‰Õ,sT,óT,óåäARÍ$ƒ`[¤K™Z—sÖéèóhWù³·ÈçÉ9ëñ´×ÝÙ¯bºVÈ­7Á%O“œ¢IN2§K¯½B¾¶M ‰Q¤AJÔ²NÆ0œinêœcHN X'bgŠA°Ž7&Å“¢±9ËÚ¦Á–Ôxp¾A½A¯3:Ý•– 1°¥‰ÍlÑÝ¡Ud§,ŠkÄ;^ Í#9äXڥÎð¹C;¡Ì½—Å-ר&> ª„æ[cj“@a@Ó(ÌÑ=ÛÚ)æåG®Ù!bÀ˜D÷Ï… eÌì’¬]Ó°¹º×£Q Èž пbÇ,‡4P×·KF¹™GɧôÆ;ôL-è…ö>õ&R÷B;w Ú¤ˆ½{&ðÙ{õ‚%o>A¼yå4)Ù5ƒÄ( û–YûA…2³ÐŠ!µñ)À. µ·˜â—Cñ“Üy‡*@‚SÂ}ùÇêÄ©p©·p϶ó/táU\{`#Ä€Ó~¥kh-%°ØIPIö—ÙSyd)MPaᑎ…3v>b—À|l¦ª3WFff€E5ðGÄ[ A1|âœN8€§‚PúV‘Op+«¶ú…V?|‡`±ö½ðä?xƒú ŽÌƒ-E§W‚X£4@Xsë©üÄŸ!EìˆúÇòiOå"ùÉ'Ä‹_†MW÷ä•8úäŶ<•O’>‚2¨¢'·û\î¿ÅÛWD6²£šNÝAX‘Í~á.ìb~B;¿E¼K‚Âàkò\c>~¾m Oé¼úÍ Žlöᔾ”ÿ¯ð‰h Lê<ùÕÿ‰]´6—˜±íž‘-)K]ù-n!MØâ]ñóîDGàðãhðß¾0©õú3ùÛ÷¨ Œ¬á'Í HîôŽë`§v¹7pR—» ™‘­PáOˆ0k±#§@$Yvõ|ôQÌRÿèNlò/Ôpé!’ۜІ½L&µ‰RÚ°‹†!Jm Mj~&H ÄÈ> w_#ܸ¦äØ,'ª1.{¹ ¶õê#ôÄY!Õ¢øNìÿLt겄¬ž ·ÑÏå¾|"Ìù;Hšl)œ†$ úÿökôn+sö[ºŽ—±˜•´ ¹j§_âB¾xJÖ ž…+Y˜·.àŸÀ–®gç¯ýÚr 6r 7|m9kqá­ÇEPº—ò͸+¶àZ¹—°šm¸„×nÇ%²~'.Q »p‰iÚóˆmÞ‹K|ë~\æÀ%yþáÿ+¤.èýGd,êÇ%sñ.YKq/Â%»kH²Çæ®ÎéþÚJ{FóVâXÙªãù«G¿°²U£«O¬ûÚ­=U´öÄ×¶xÝiù{}iK7œ-Ýpúk[¾ñ,.eœÁaã©Ê-gp©ÚzØT±õÌ×¶zÛ¹ªíç¾¶µ;.Ôì¼ð7-P¿ë. »/ãò­òM{¯b4ï»´ì¿þ}ZÜÀ¥íЭÂù½À5°G¯w½ vAß­}7:ûowößĵ n-¸vÑàÝEƒ·1»xèÞâ¡;_Ø¥ƒ÷ºûöô=îîGY1€q¿gàÖ†‘›+öÀõ37nî?tòdßO?` ó !º*ÏO džúNž9{æÄØèPUe)™d ïÏŸ;52<fΘ‚•ÿËO?þ„zØ|Þ¡þã§ÏdåÊœé>GúOmÙqäÝäüùëCÇŽŸ={B€Ñ±Á‘ãrƆGÆFÉ9Ø×{òÜÅâªÑõàÀ¥Þ‘«[öŸ¾xiè òéõ±Û7¶_z:^'r‚b¬Îœ-õðñ& ºzÑå*ÁÕÊÞD]Wu]G÷”|½€èŸ-3¦:f©ûDªûxÌp7›â¬3‹©©ÅŸªÊžeñ“JàÊl%óÄÙ„¸ßTÐ…='©±5Ì#¦i²fé±'ªzþkš½²qÀ,}ß_”ïÉ׸V6âèYGÍÖçMQgM×LÒ¨ù«†HÉ<õ7ͰIº¿k„*›%(âU §ÌÑ$¥NT竚'Ì!ÄÎ2Ÿ®-бJœ©K•œbâZ8Í(b!Žè]®a“©IÉ 9F.2Ø ¾¥W© 1ÕÔUfd—aJÃiê-ËhS‡tc»dGßâëÏ‘ó÷'¿"SGtF3Õ'×Â9 ÓXuê¦qÖnEp ö’¹FQÞ•9C+Ä”šíèSW˜âYªGJ5sÈÒ%E[¹¦é6žh¤‰} ˆvK±¥s6|LvŒ2;1Tâè]mB‘@=ö^¥zäx×€ju³Sj&- ‚HËÕ!ÆX'Û3 mR( ųЈ’LcUéèسKÍÜ%ŽÜ *»\š*]×>U×>ì]¢iJ´;çZ{WØúVYy‘Ýó‰®ÙP§µ{žµÛÿø¶>ÅP§³]G´cÙ2dÎÜJcZÉ;ÏÊ+‡@Ï ° é!5Df.86~2 O‰%#$½µo>óë°¨2pX{—9Kaó,=óiüZh!ÙGæZçZcâšjÅ̲cçÜ’=Ãk8¥D¦Ô…_íTåÚ`á™Ca;ñ*M\3Ù‰ i(Ÿ ÕèY>ÑmP ´Ç…ƒÃ­·è5v¾ETÿNüBpX¥®¼jGÿ"wn%Õ[æÊ.sô- ˆhõ ªß…UÂà×@à`ã‘ãÚÈ o±ó’òâÀ.°£T»­wÔã.¨ õC…¡Ýd†T²ŒÆ­bŠš¡Œc@™»Ü_ >8PJz‡µ€õ8V@8åÁa=C\ƒ*XÅÁ‰‹  `ƒâÐJCS–ú‰š8ÑíöÌ|~|g`T4 |ÈgG·$tØsKA¥û'v(ÃB²»¹éKhÂFT³§„—±r‚ÊÙ) !ž ÉZÎK^äÕ %/ ú/_˜ÑÅ kdÅ´E欇ί¤.q© Hhw®ð‰kå¦/b%Íæ¬æôÐEu>qó^F—{x6—–èS*YÉMZ&îæ$,ˆÍ_õ8²KR˶òSs;bÛyI Á~v¸‰ü¤vüÁÉm19Ëxq­ Ò•q¹=÷ß#¼¸vaÊ"aònÌ|^lGXÚŠhñꈌ•ü¸¥áiküEí¬°ùñ¹„ÉËXM)…ë q寢ð¬¶èœfhÁcyŸ?_¼˜—µ,ªxƒo¤Ç/±3,½0w@²E¼VÎz žd}Pþ&Žì¯AÕ;¼ÂM¸ð‹·à"(Ý,ð_Úò­rÿ¥ *ÞT¼ákû­z‚˶—múÚ~«~4 ¨Úò5¢ê­¸üߊ¾¥óãZöáò-ŸØv—oéù”Ž#ÿˆ´Î£ÿˆÿïõÿ0.9ËGp‘oúˆpèyt€ƒ<:À¡pÍI\þ#|‰< À¡ô“¥àX Ê6žüÚ–o:]¾éÔ×¶fû…šíç¿¶u;/Õí¼ø÷mÃî+raÿ¥mÙC.Ôÿ®m=pÔ»ü7oÊÉûåß[í‡ï´¾ýµ•ÿªï¯í‚£÷½÷÷mgß]Œ…ý÷0 Ü>À¥£÷6°à茯wÿo÷ß[~ôáŠÞ‡`ùÒ@÷—÷Ý]Ñw³§÷òÞ³÷ž ÈöÞþ±óg.]=××»óÊ…Ñ gÇ.œ=qþÌñ=;·<¸{cdèèð`/+Iwq¤ È»³§FÏë;²ÿèá}PòÄÉáþ¡CƒC½§Ï;>´gßÎÇ9Ú[VVfB0ë;:tløò 9xp ¿ot`pddtpx¬oxletphìØ ÊHïðèÁcåµú椽G‡w88xräÜõ+Ã{?þyçð±c7~ÔäOÐIž;7bò,‚vü¯êQaº N?Ñ”4ù *,-e¾ù Žéï^fS|L9zs‚UTEÓÔ@«Çþ¤•ð£~ºÂì°q&9“¬d 3D ÊÑŠ„œñj‘¿h P ˜B¯Ã™`ÈÓtJþE軥_ú€Ü@–a *>ãux3-cæúOÐ ÖqÌü]‡?^=PÙ2v¶E䊌٦á4U‰ÑŠ&Âg{`Ý­·? ½pWÞ¡#¯!ÈBÄTÓÈŸ48úô<¨gœv"1þ]Á›d°°uºy´)išiül«t-‡üéf “c¦™ÆN3žf5É(|*!Jan º}öTBÜd£8MªtY2Õ8Yߥl–Eêt³¸‰†a¿é 4R§™‡ª;$©SS¦™EL4©RÄJÄŒ º±¿êÆM ¤ül¯ì(›a›=Å*M“V¨DN¯ò»®ÐÀ9犼ûÝÔU¬hbLMQ·ŠR±ŠÑqH›¬¢f4—˜"|¢N8^¦b%V±’Èùü @Ö˜V3ËŒ[rêÂŒm€ìÔv ·È#¶Ã=vÑר71“º¼—ù¤¬p‰˜ïµ€Ÿ·Ñ-ºý6ò×,{°ç_!×>"—Þ"¼ÌFt0w™w\£[x•_b+;u>(í€Ô…öÁuÞÉËÃÛ¡¶àüÍ~i=à@ý¾©Ý¡…Û fÿô•8ôK]î“´Ð/e‘G̼ ìZx=²E$Ûxé=â›´Œ“¹ .B`Æê°‚m~IÝ®aAâé‚s¶¤®ñŽ_$ÞÀÏÞ%½ù¥,‘®‰,ùƒ•ÞÉË^_½éÄŸÈÅ?{wÂ2ߤåÁ9›Â vp2Ör2Ö‡J·s2þ@Ißô_lËÎć#Þ‚ W²— œíxlämäáØ`éŽ`鶯­¨p¨p××6¼x_xñž¯mDÉþˆ’½_Û¨²ƒQeû¿¶1•øÄVøGÄUÄ%¡ö0.Iõ½¸$7Å%µ©—´æ\Ò[qÉœwì!nÁE2—ìŽ1\rÇ%oáI\¤‹Ná’¿ø4.²%gð8]²â.¥Ýqù溫¯âR³î.Õk¯ãqµvýõÀ†« ›n4lºöµmÜ|³qóõ¯mÓ–[M[n|m¡ªÚ —¿¶õ¯×o¼úµýÖq¿UóÖÛÍ[o~m[¶ÝiÙvë[¶uûÝÖí·ÁÎÛqG¾Lèù¢ w¿¶òeBï}måË„>øÚÊ}ˆgû ÷?úËŽ<ÇèêýcùÑß¡»ïeÏQtð6þgEßËî¾?{úž-Ý{có±‡W_ yÕ‹rKS2¤‰Ié¥Åe’ŒtIzJ‰,¯ª´('3M–#®)/©.+®(.ðóòxñäaFrB]eYCuEi´¤@ZW[™/ËΗf—WKÄéÕÕ•¹Ù9YYin¾£íì©‹›7íB>"%EµÅÕ…e²’ü¼²\9R9ù¹e¹eEeµÒò²D±„ìâÒ;vb{ïÑás—Ï]¼}r?òöÞñ¾¾±ëãô7K˜­.œ¬,P0Hú—f¬“q²Æ¯FÉ?ê'Ï0Ìš®¯¤3CMô»JØ͘ ©¿gý`˜¥ ›þ£™ôB®‚vŠ‚VÒïÆâ)†™¿©Çÿ¢9É8AAM0Ù4î'-’MšÂd×ߌB3 QPfþnö/Mîd³¨)fñ¿D((sT(âIúáuDµ„StC'ëgb¢&k› NL˜m>×4ú_3¼Ô,âfˆf†ƒ&ÿ·Nˆ‚¢¯6M:Á(BÝ1[AÉô«AØ4‹øŸµƒ3 Ÿmú‹¾hºeÂ8]‘’µdŠi²ÂlîŠäß:as(YãõBU©â)f±*öYœjž4Á(FÅ.o’IÒÃøiæãtb&'L6M€ U2”l§[Eÿj<“;“/?¨t1sQ¢îT2•,ù˜9Ó>WÑAúo£¸ ¦‰®…*Ž9znSÍbõhyãuøÊÄ„ßõ øçXÅ©“’§é‡8d›¸ÈT,R•M“  ”©Zä<9ùZä-R‘êE“ŒR§[dª;€ŠÎŸj–ªéT8Í"ÙˆQ¦æ Q$§hÑr I†Œ‚Ù6 3ˆ1ZÎ÷St¢4HbubÖ ƒ8ªŒàR¢KÉSµÌ°fÖ©X¤Ã&¢g5äèÛçÓ‹ Ü gX%¼Ëá*Ù¦|Jgãõ=òÕ²ôÜsÕÓÕ2¬y5š´ C¯´ CJÈ«íR ×GÝA…a çLCZ¡1³h®}º†³#|p¶AÍj9Ny–¬:mšLß½ØÜ¯FÝ1×* ~®ØÌ·Z‘œ¦K/4ö*‡bšÎR8q{ ”'sš”m3-ý+­|ò M\ÒÜ‚kÌè™Z:5 Tƒcä”Nñ+Ö²N${Úx;TZyX0Šu]ó-ükhðÙ'xWÂqõÜŠC`¾–K¾¾[¾•·Ì™[®gŸ kOòÊ%3óø©Kà@ì w±c`)äÐÕž¡õFN)ÂFçÀfŠwƒ¥[™½_ƒ½˜âSCõ¯õn·÷¯öΠ=¶>%d¦ pâT:²kHŒ‡€Z§ÀzFè|n#ßIïr6gNƒ_à%ê€L×yÄÀjû°y€§øì“øõàPÃÛÀêy؉ZÍØ•íÖrÑÊœ¹ÀÀ³€Ì­sŸoP9ö!- 2Þa+ªØã–Xpê(¡PÉ|çèE$~X‡ˆv¢vÌ¡Ç/³nqŒì¤†w¶ÂyPÆ5n)8Æ~î‰Ëa1¨v‡­.1‹aGfÚ*È$ šawp\䱚aÄMxÆ/Zù쬵Ð(9Þ‰]ŒÈyœä…~±m4AÙGÊN\1Ot«#·Œ›²2ÃsWyE4yGµ$t„ä¬öˆ[ì–° Ç/>û\é&[a 3­Ç!b¾gòr~ÁV² ‘™´Ôš]˜ÜîR˜ÔÁO_”¶(±t#5°*L꤇ÔpS–ðÓ»|¢Û‚Ò–yFÍñ˜û‡_ÖZì"¯Ôn¤.çèNNÞFìX>«|3WàÈ»˜‘¼8X¶Î3¡S¿ž—»†•ÑãÑ&þÁ‘¬óŒ_' À¥ðIéÊv0»½Vp%Cò·û¥­„ B aÁÖàüÂÂNá¬ÌeÌäÎñRÏÄ6nn—°`Mhþ&QÞfVb77mo\Wˆd#'u-7mÝ_+öKv|ApÖ6\B³wâ"ÊÙ…KXînòv~^Øÿ ¾µÎÿÿëõÿ¿àëÿï‹/Å'¡l?.‰åpIª8ˆKrå!\Rªã’Z}—Œº>\2ëûqÉjÀEÒ4ôø¼þÿ`Ëþÿ}¾õ»Ÿ×ÿÿì羦¨ó4.Å ÏàRØy—¢…§p)]r—²¥çp©\~ñQµâ.ÕÝq©[} —ú5—qiX{—ö-wp™¿õ..ÛîáÒ¹ãÁ?bá·ßaÑ®G‹w?ÆXº÷).Ëö=Ã¥kÿs\V|Ëò®8ø£ûПŸé9ü—/¶®<òòû¬êÅxÕ#€”?·Œ½íÚ}â“¢iáejëkO ôe…™Y9º2xÖŽLÀ…Á5%Ól}ÉÅÂÖÍÐÂÅ$ønI´w7µq1§Ò­œº–vNLž!‰æê'$9ûÛ¹ñz6ݼ{ˆ%5ÀÊM¡s‰DGÚ £8¸[:zŒIÎ.Lž³w펣ëvö½zpøò©Ã÷î<1rìÂÏúž ZÞçx©è‡ŒÓ W˜Ë›¥Á™¢ä;A;z¼Aº‚fÊ¿ô’@Ì× Ñûoý0µ`…¹|-Ñφ± *à Æk…ý®ú› g²*GY‡¯¨+š ©h•óƒŠhœVäÏá¿êE+ÓÇi‡M5MœlF3Ùã´¢§Ò ˜‚R¸Š¥ìgŨYzbmbñdõ¤ñ³£fëgÍÐNU7“þ¦­¬—9A)BÓ,wŠj¬ª±øå°¹DÉ4³Jîê¡¿ÆÍ´L~Ó™a‘¦l-QµË§¡åT8Ñ(~ªi2äü¬9×F:Ó"KÑ* ’“ŒãT(ÙãuD“MbT™a‘2Á vŽuÎt³´Õ•Hy*¶ãµãtœË4  ðL«ÄI&SL#çØ¦(’§[ÄÃéL7OMÌža.žlœ6Û&o6E:Á8y:DÖ¦™§ÂÉÎ&eü¦9›˜jL/T²LR³É0¤É¦èGh’2µH]›ÜßÕDÚäÜÙFÉZ¤\ «lu‹9yrò1Ô,ò5l =jáô]ËÕìòui%pô¹¶’™–©slij¬RthÒiæqjT±ºƒD•’9Ç,•àTJö¬Ó§È4‰Ù€†•Ä’^¥k#U·ëXçÁA•MRUÍ3!GÛ&OÍZ¢í\ á Õ§—¹ÚÎùsm³ôéEslÓ!:€+ G—zÌ¥¤Í"&(Y'¹„µÏ¥¤‚cäY‡¶K¶®k®5ï\ÓI¬Gσ­æ¾e°ÉÜ·|†e‚™O…²Mš‘G©žk¡¡{4Û„QiäQ®K+kàV Ÿˆ:5C÷+V¥†Sš6-Ó* TÝ1ÕÐ3×Ô§ÀØKªç&ÑqÍ2a‚z/6ðÈÑwÏ_ß%GÛZLñj¤ú´XÒ* )&ÔbG¿6ßyNþí–´*;f«-£Y—,ká\Kñn¶aÕzJR`%ðÙ'²+Œ½dFŒ| ¿Î* Ü¿’Nü#j³Ð–ÑHc/p è ÒkômdvÌfj‰¯¨al_ Ç‚|€êÓ G×%Km žü%6žõÇ"{Ÿz¢[¹™sƒ­-³‚ìYâȪe„´»r›HÅŒàN¬f¿F°:d±s@‹™s$a/ªo…YKç¶CÒ‚Vbã]Kå·AxØ Ú€Ï>X,,¢†Ì÷ˆ]n¬pvX±«­¹•ÔZ‚·”Õ Ž[ô<2§Œ™ØIáW™ûX;†ÖÛרU:ëH¥NáÍÖAU®Ñmd^¥Ž›¬OêR~µ½°žÈ)wŽhqë€2€U`c&/†òñ `“WÒ"·Â-v>ø`Úè1í.‘­Ç.¤ŠÁÑ=bÛñЯ„Ðh$D î1mÐϸùe Ÿ ú9t©+w!3tE`ìzÏàeœ¸ þ‘«Á ’·¸-vfw°¢ÖÀ&Ÿ°(Fãu¸EÎ÷NY¸F·Ÿ}fòB¯¤NjhgB‡Æ2ÐÒô˜yܬÕìøž˜Ü½Üøu¾á=¬¨Õ.‚%‘’½P§·¨;8ek”ä+r+g±h?e#+uìè›¶jØâŒÄPy ¤Û-¶ ’°’’®QÁù=ôè&¯ÄvÿôEÜìnVÆRïäN8Y¡l}hÁÿ´¥ìÌn~îZŽxe`V§Ñ’¿Ž#F ³³º|S;ƒóWq³—…—¬ãå.åK»Øâ…|é2®d±wì¼°œÕ‚ŒåQ_¤,K)ß‘»N$Y-Hï‘³ê¿ N[%ÊXŽGdÖz\¢Äp‰–üKlΦ؜?¾&.w#.ñy›pInÆ%1 .ÉÛ¾Á\R ·â’^²—ŒÒ¸d–íÂ%»j.9Õûq‘ÖÂ%¿þ0.²†#¸6ýG5÷áRÒ:€Ké¼A\ÊÚ†p©˜?ŒKeÇ.U Fq©]t—º%øÔ/=‰KÓò3ÿˆ–îs¸Ì[y—¶Uçqi_}—޵—pY°î2.ë¯àò­ú篹ˆË·Žû­úo¼ŽË’M7pYºù&°lË-Œ®­·1–o»ƒËŠíwqéÞq—•»àù÷Ví¾±zÏŒ5{~ö¿”ÁX»ïÑ·X½ÿÁêƒV¾·êЃžÃ»QàoxÒ³ÿæöc·õÞèÚÐ7|ú^×ÊÝGÆît¸ÖuôQÏà³ÿ¶kG_­?þfÉ·í»¯¯y¹¼ï1¶)d®{¾ñÜ»®Á‡+Gþ\süÕº“o÷>X>ø|ùÀ‹î¡W[Î# =YtøÙºÈÒÞW‹öÞßÜûxç¡û_ñð@ßómÙ}wö½ÇÞì ¶ôÃå±ýÈû'·úl9 Jeýlâñël›Ù*.J†¿ª{þ¦á¤hä=M-`–~„ãL"~3 œdì?Ù8`’k¢>ÀžfÈiÌU6š®í;UÕ}†:]EÇCCÏMEÓqš2u²šï4à™!S´y?)zj’b&iLÓ œe(øy¶çL¾ºU´ªEô8eŸ)Z|EÈiš!SÔC¦© '(ªÅ(éEÌÑPÔNS Ò0‰5&¥«è…ÍÑ UÒ Ñ2‰Ñ2‹ž¢0Y›5×, ꜪÃQ"OÓå*ó•L„ ÓUÌÃÕ‰¿ªø(›†(BW÷‡ÃM× 2qJ§ì5]Ÿ£IŽP"ðçš Ô¬„&ΉÿVv3¥¥C«`Ç©:\mëø_Uü-èÙJ&¡P¿Žm´§d¨eªF€Ijü b´1N™ š¦ÏÓ§&Î1S48$:&ëØÅhÙFÍ2â’½²5­ÂTLƒ ícT-Cfèù›:'ªZ–sŒšá–.†¶‰*&¡&ö)ÚVÑrbþË8-«M«(‚KÚD –Š…h¶‰@Õ2LÛ&Jß>Žà’b✬b!4sMS6 2 ÆFöñzä›85ÓPb”µ{6š¬b9$ºX• $ºfA¦…s:Õ[› ˜©S*ÑS ÕêRbt)qª–¡„šá܉ž™êÄP+ ¨ßÌ5ÅÔ5ÉÖ7ÛÈ)F‡¦O¤øIÀšº&@ÒÒ#…@‹×³0£':FÃ&^®]¸¶m¸¥{º¥{¦)-ÕÆ;×È1™ÄÈ¡øÊôìbm}òµ¬#)¾R{Ñ‘]dNO×¶‰Ð¶™¹ÅZ1 Ã\ùT¶xŽE€…Gÿ}ÿæÏ~âç_ÿûÿßÏýÐû?÷O~ü7þÕþøG?ü¹ïû©?@j?üÁÏþ_?ùû?ðï?…@¤‰CþÀÏþáÿü§âãú/~5úÃü¹OýÀÏüÁ¿üÙÿð£úÌÿügþÍÇþìûêPÙŸøøú±|þŸÿÛßÿÁŸûô|ð³?ôOÿØGþ€ç_ø³ð|ÿOýÞ÷ýäïü«÷ê_üÌïüàûÿàG>ôáù¿?†¬?õ¯?øG?þ‘ÏýÈû?ýÓŸøËúÙOýèþèûÿÝïýÈûÿøÇ?ò§ þ<ŸøðŸÿùÏ?ùáà§>ò…]ñÓý‹]ñ3ûËŸùØvâßÿÂ_ìŠ~â‹»âC¿ú·»âÿö¥]ñ‘O~yOüúßîÄGãK»â~ë+»âã¿ýÕ]ñ‹¿óÊ®ø¥ßý»]ñË¿÷ê®øÕ?<·+~í?¼q |òSo¿þÏïŠßøô…]ñ[|iWüögFvÅï|vtWü¿ÿù‰]ñé/?ý…ÂþÝÏü•ð™¿*ïßýì_‹Ÿýka§û¹¿‘?÷7ÒN÷ó_”?ÿEqß®ü§«ìŠ?û’z ü—sÞcÁß vÅßž„/_¬¾r© |u¤öh¼2Z?^oîúk ÂëÙæ[â|¡s¡8M¸Xšy4.”;¤ö› Þ§^—§_Sf —¬…ׄæGÌ1¥Q²Úãeo¼`œ›0_f^µî¾nÞýóìÔoù/‹s]˜û²zãï´[ÿi²sκ÷™‹ÕKÁꥫ_Un¼fßùëòÌ+æÕÏGÿ9×úŠvõ¯J³üŠvó¿Wþ|bú/òó¹v÷“­¾¢ß{ÓÛ8o,^.•çGKó£åYrÇJ1&ÊW€KÙNN¸|~¬· -hÎ=G™ì.Ýi—•Žß:§x­+²Û ¼NàΨfMð#=jºb«aÞš”f…è–æÍ—ÕZ¾ä—¥Šeφþ‚mÎ(b½\ðñ˨)ŠãUÃq%M  ÝmœÚÔMÝR¬¦lÖFsš[))tàjN{dR·ÃYÅj«n[ Z%¿®V§Ä áM/¼6YºP”ýÎe³Þ)»Ákc“²y­i-¬]Ì•õ fGÝkªvC±kÈË©LçE^uÎ §r‚3VÐD½4æc·~Y±êÀùqÁ Únµ#™¾á×Ý-*VÔšÍK–lE²U-©~cú¦dTU»åD3Ù’¥:´ ŠÞ˜½}e¼(ë^5’͆ 6+ÍÛntutÒÇ«\Ë • vCÔZvpE1;’ÞÏ{±6®C™³KsP0’S‚ÆlQñt¯ŽL¡@d‡Lá©uÐIÐmÐ=­Jýĉæà¿8¡Âc3›ý²Z1£©1A)9Ž?=ýZ6k6ðëµZÙu³šn5[JTQ+U£Þ*X®à…ZØ0ƒ9Ù˜,ÿ2Àü(3<~õºfÏÀƒz©Ö´îwœÆô„ª, ŽJ¨}SðüIÝ‚ð«£c^g@8Îf£}±¤I~“,«1'M4AÑ D¯Š³oäKÁÌü%A,»žFv«#¸£6%õ‚é{Só’_›Ôæt7oxe'‚Üöp>'HvD-žôÛþ7F Ð*úºëÕ¦'Jšá·$£.ê5Òa¬1ºÚ¾Q”C\ž¨L¶ä@™Pø#"¢…«¸Ø%£)hõœ¸•+)‚Ç æFs–W]ðkW)/¢åÅžöÜ"Âq8Ñeü0}´`bÂqJJ7´[™G1J ÷P$”¹£(.«7G%œB¸ê6GJJÑv .¸%Çý OÎ0Ѿh„ˆ" ÔJ½¤…¨,€ÊÌnƒK¹LmÀðân†È¸±Œ+ŠZ©HA ú¾;5…,” ¤¢×šyÓAÓPáòѼþ  ¨P#’B¤M¤YðbqóÁM7ܬPküUC[ !¼ŽöEÈzÝ ©9rœ nYÌïk:’…ªVÃÝL.;ô)]5³n£¬xã%ãºh Yä(ÙYÜ7gW‘²&˜YÑš4Ý2zJ¨ä (íTTÁU€”cÅjЀØð|;Ð hÛDܺÑuÑŸ‘¯‰%Ò<"àÂqõH'HJŠt¿ÂMB`ëð£Ÿ#WD³ ÄH‡ Sßtñ|0eÉQÅÓT_×C®hË8|$—¸š«%{Äíâ–nXêNw¯ø{»O–£ïŠ=ÿ⨻Ârµ]±µ“Æì•ÎA±W¾Ðò?.è–¼+Wü½ ™Ò®8¨~Šƒ7±¼+’MZvÁAûyraâ?®tlרû¹Ó)ì•ïãº?ôô.Ö.oy]³·=Ð}þ ˜`„%#´PTC0`U u%4ä@·jn^-âN‹ç¾d”ê­@ÇB9”.µÂ¬+úÅ‹Ui|Ú.ã°®d#atÞ—õ±Wáã¯]”–>9ïÛÆhMº8 ®›}eÎ-4Õñ»PG®Wµ x¾cækâxCζÔ\',?¯DÀ$A²€Ž›Ñ„ŽzÕ¬bŸ³ü‹ºsÎ /*櫎ew×Ö«¦·j벺‹¡]Dvnþ+Ó­’!¾2/\¼o—[z>4K––oVMpÚröBÝÖk–Ñ´¬@QÈW®Ö+ð7 œÿVÇWÆ_E M«ˆ¤òÒ²¯ƒU5Ø‚U8ŒêFÞ*]Bß@QµÉ ¯v*ÎLÍS c.$ý‡ðÐõʷͦÞÚEdôÀ$y®êj-åîÅ|(þ¾éIÝ7â¾½U—ý¬5AéI¸-L¬ÿ¸áö«Dމ7j±? ÜX¾ ‹)ô¶:ÃAÓ¤³£Ê1íŸH!»Ãx(è'4 •Ûvv'¼'êZñãæ©qŸ|}¹ËÝ‡Ü Ï™8ˆ›}š®î>ÊEc…öHd_ cŒ„ö‘ZÐKF=+0-@6ຖhÛÀöpeiÇxÔŽ±©xxJ¶-Ͳ,Û´lËh€Ñ3UÐÈ(Pü¤3KŽ­o¬¯‚½Z¦êXyäbÙ²íJU?Ò„jˆš’­ºíèñ‹ ?_òF­º0^~MTG=_œ *Žâ©‚- j1'—òQèzž#HåF3ü¼®ž ¼ U>7ÕR5Á1ÇU1ôòµJibìo.»8åX#Íz±ê.·"yr¢bZ!¨rÕÔP“ªš\ÕErŠsuðµx©Ý0ÚuËPÇ¡p¡ø¦¡dmc²Y5,=;Õ°óÙWgÚΆ®ˆÄiTUMu­ÉÙŽ¸¹|ö+¸î¶°Õv9zŘê¤T¾P DÄWÄ ªtqfÊ‚}d¨£¡WD ²p~ÄTÄK׿"M¸à™ãjé\-(Â\2¤KbþõV]e z©¡EÆ7‹hS¬rÅ*vÉ–Çk® —/Í·­: .;_u‹rá\ÅÉ…VV,¼:ÝÖkQ@Ö(ÌÇÌn©\xcºmÙ±¯ÖBuÏ^úª¯M,4¦S2 ç¦|±páoºP¤ËÛp-àŠH.Ò}¹ˆ¼ˆº?—ÌU²Ð™û8‘ð½ý#¾ÑMiˆ«œ@~b®¸ÿòþã›@lA¿µ‹ÈI—÷‰ä®XŽï3 šœÂãŶÛÒ§ZãnìÅî6âÞ•FO­K;ðP¥Äc«g·®¾=l²5x€*SÅ¿\+~ðq÷ùtŸ¶þö¬—ÿ™wE"½OÂEÛã‡ñØTU/%H†©ð5J{“ñ^Õ¶ekÿؽO¹»B$ q׌'0:ƒèñÔdìQ£1C*žhpmGYßXò\Û2Çžp,¶S(ƒ$G5·Ú–dNr}³Y+¸9£-de´¨àTË–[4¤ñ©Èlºz'tuWÛçH¢«•dåRT/W›bTrÅ¿“ÔKª1¡èã@sÊ(‰o:~nzÎVÍK‚ò†aN g2¦6\g¶®MèV¹øà)¼ÅÿcàY«g2ÿF¡tqv¾âr­a†MFu³U5I™P´lYu¨HŽ_°½|«cZn.A!F¬ê-m#Z%(¸¾()㕚¡tɆ5Wxn)^¬I”ÇT-{ùJ¥¯?Ój;’<æ¸eÉv{›Ìt·^ E¶Ø WÉ;rn®áÕÙ(·]/vª¦-g«Ž¨•FfŽ%MÒ¨ç”ýH”Õ $Ûl;È:ÓŸA]PN?D1älî 8ªêqÉ+zÕBuªìJÝ*Ám¹¢’=i¹@ÉÂ_3‹fñ"Å™ªh¡/8~ m@i¦]¼rµ”mR3ò¹ÂE/@}õéÙêxö Ï×5]4-µTÎI2Úº ܙٶ㙾LµÀ¯rYÈ#dn¾Ú^±,]lÁtÒÆà¯5õ’p Dvª> ¤ó BÓ´AÄßã¼TMHrT*Uotì|³UÁ)dd˜²¬”Çœo4 .u‚¨fÚ¸âê–ÕtG¢TÏgY‚Éœ\kê~\D÷Ëü·Ý-ºÕã>„É|$ô¢ƒ€ª³_ànð$ôP׊ñ ü?ú \ö°ñè-˜ÿòO¯ð”~ÃŠÅØBü¹v†teY¯Û‰½õcâO,܆ö[ý¿÷*8Ðû¦çéwmÏžõ.÷v=>qhOñÃ(EGkÉÃb{šÇÖ4ï7g×RÈÿEâŠtižOÌÿ“åfN¨¬-Äü¿ÇØ‚îKk›÷CÇô ÉrÆ]' “„ÔvÍ3ýÇ2ý'OÎ fNž“•̱LQ»øÞÿöL^8'*[M-°rS‘ìI£fþœ¯.DFP­ C¬ª%Ç”l/ïúNX‰\ß{ñ¥weÀY3ýCÇO½pæÂ¥‹") µv­ÊD®y¤/“»tþ…ÃC¥ñ‘@S"S¡«#=œ;+ <Ý4lÇËòq²}™Lß@¦¿/+%¡ŒðF«Y©Ö5C¯7ZcãÙLfÒüåEÕ¨›Z®f+o/1LXB(P 2y×G 󗯵§fKe¹ ª M‰2 nåËB¦oP1Ì0ªªš!Éhqw;Í-À¾‚kYÎpßPi,×ëÂDá¥ã§áv*MÇ×Ýh8Ó/f‹wnG'mIŸnvl+¶C ÓEÊÅ’ÿð¡#(ê‹¡ô­v9ʰO&ó¨^Üš**Yj¹átXÓó器4@,­[^Ítq*Òâ…™š*C'a%°] ú±] „ê÷õB­öŒ$ëÐÀÀàaÛ ƒ°†õ·Ö¨VjQ¡”Ÿ¿2§jI(ʪ„¶"n¢UiŽŽ4Û5Í”êÍŠ £j(Êô_o6ME;Bch2M·m'¸pq ùQ(Hed÷ȱê®à_ð#}x¾aéC‡îx¶iêʼnÉkS³Z¡X³ªeûª¦ 5ÛzøV¼5£|¬)^ïC ßÊEäxéúþçÿÄ™É5è<ì>Àҷ͸íqß>àªÌLõ €:Æ ck)o®¼µ‹ÈñûP{¿?_1y•<Èl|pó í@éÇ•Mßâæ°¶åam8ogTŠ.jÞÃýdç#@cSÑP…'‹dôé)“®/Ç×q+[O xÿ|úÓB2Ø¢õŒ%. ¿X[PîÞ©ö,"{4l›ˆý^îÖ0òÖ*KD•·oõ;»“ck"ÐÖÛg9Vºw«–j‚é^²Ý±F¼KkëyYŸ>ü¢Í[¸§(êºEñbj«Ü×—1Œ’o†#/Î6,WžP²çêV!ÆœÂyØM[ŠâUÁªçyࢆî(²™É ¹NµµKEY(«ÍFÇ0¬ÙÙYA(åòãà´‘&Μ::Õ ãÝuyû÷öÛöäMB¢Ù˾6›Íw½ëÝår¹Vk¨ª ê(Š¢2©iããYÇq\ׯכ/œzq2[,D†aèyNúÍV5EK¬˜,™\·ÝŽYwµÒÔ5[(+zçÍ7FDAµVm™†+‰HpÔ`¦bœéŽ*MY1ªõð¯85J6ÅÇ@ÞŽ9^ ªxt_™¹ »%°}MÉô2ƒ¶æÔ‚º©X®áMÕ;¯V˜ À›7îòbÔQ¤(¬÷÷ —ŠàíÖÌÌÜØè¤¢haX±m÷Ö­;ª¬4¼°áUä\f)È0+´¢0]m‰Ù<Üx«–’™NÅòË©U#I CD±\¯×Ûí6ÙkŠläseÇ9…FDPqˆ¬”Ùvt´`­‚„Ãw}ÓÙ‰‰1×3ãζæºvTñ S. YQ*ÔavrôÊÂl¥ …jµ*Á®1,t(¶^›j·f¡|ÈÇHÑFª&¢×ÁEÒ)ó3³íÑÑKHäôéS)• ¾ïŠÜªT¤BV-—[Õ°âÅ3×Lºx0Ë‚®¯ƒ¼³e×:À|¡8;ÃHöJÃé…î=p7áÿµcœùë;þÀÂØrr(oßÞÂMšXÞÿà<"dzŒ’UZ4Wêá©;éÙP[·P÷`ƒÿÚö†IÏ[uǰ?…:8ØCXóSSåÜDÅÃÃMÌdΜ8y Šãºœƒ ’£âk‡27®L?Ôwl8Nj¸?3ÕðJ¹óRiìô‰ÁLæå³'áæ³=[ÚMµPÌ43a« ½Ä’ò+*”V–Ç2™zÛ ªš¤æú3aÕDÝU£HJ<”9}æ¨,ä“}SEªÈ‹§ŽÀ­…r92f¨/“ld×=ž!ï}IÓS<žS†ÿÐPþoþo^¾táËí¦]‡þó†o’ @'¾Sì´¬xMAþ<©®é§Žõ[Zñôña¹”3Mö2J”‰C¨h¦Uyóµ/ž=y˜ÊÀVñ/´/”sæÄ!„ õg:mÙs&¢ ï;“béuKoÖ´¸-Ê£¾-tš>þUÎR¯€ í!£rþÑ‘‘C‰Ÿ99„Nyêp_g‘>ÔÞ—ôF˜$Aè´§ê’\œÌ¡ÉÞ¦mOÁŠçw¡#¥×e¼%Üxs•ÒÃóñÞÒ݉]çï•SeÛ/p9¤»Ó~ì2Ÿ|Ol³‚·…•'Ùü‡­xzkw« æ~${‹=jÿŸ‡w"caÿé'SReƽžüŸšíß{/*ï¹.à¡þ™‹õc©é¹U°˜ÐÝ>5 ,¹‹&KÊOâ–!ü”¸²ß¹ûŒ¹Ûí)AïÒž·DÙ;àýã­P>x+=ÛÁ=4|´Ôú5Z_¶_$Ke6Ü´›°Ë*3ʈr¤ÝóÙÌsÝ- a9æÿFU-ÅãÿÞÈŒ¨Î‹Z]«ØÙÙÌé¾þÿúpæ hÞp&Rò/ wÊÁÉÓù0ÌaC³mÛµ]§ÿÐ@®ÚoJ¹È–ᢄ–|áP_fº!úæHÍŸ¬yùª›wÔGkG*Å’&*¶àkEä‚ôO ÇšáHßá¾ØZ‘  YÊ”B†sC×âÕ™øMJ+juÏv¶Fæ!þì”â]d©Å÷á"²ý¨e8;QJV”äFáÁJ“ݑۧ‹öŠ;í ¶×(l÷íý"½VôIà@… ¬ïÿo¡vÅÔûâÿÛVn°J?Yo+>Œ[Q%Ø®lú.Ôg·˜É ý3Ûé¥ýbíO ¡Þ‘çïSÅ9¾ðŒö·F=Ç×€]6LxÌ v½=¿GóY6ÿÜæÿâ~\âÿ)ˆ»¡ÌÜžÍ=ÒäŸøùlWê®ß­ÚZ   ‹(mU“ëºâ'Äl¶ÖM¡¢ç=%Wµ•„þU3™R6w¨oàèðÐ@&sîEtŒV³*”sX}èÀS Ìš§¯‚ ÂÓ íŠ£"Fv< ~ß 1vr8]÷àÈ” cgOÆiøw¦U±´â^ö—­”L ¬4f† ˆÇcƈô]M8y¨§¼äCH¬y˜y34ÕÒøTÕ±•œ%O޼܄»×»þ˜ôV\ar¤ÓÅxPZ:>ØçʱLüùªÐ+MŽœ96äè"Ò-!}øá¢Êà¥R~yQj=­O6vu(Ð1%¸õŠ×6Äጥ ºR<<„Cy¨?Óª‡biÒwâÈkî35Q(f›µ€ý1p5xj‘M‰à¿H:DO84UrêX³j¢±’W!ã#¶ãO7‰ä¯ºc¡“äËeŒ—È=½X÷ÕØ ÐJı q’*X÷õádþÔñxà˜jVPT̳µZä"¤Óª&µ‹?1ÏpbFÁ0a¦JÕ•‘¾RIòµ@ïÉXðô2¥U»–ŠjêJ) åä%åE!;@•ŠŒ|«yô‚-s t4úNÙ^c2ûœIÂzÅÛ%ØëÙôˆøûu“NUî¹ìíŠzùøp}"8hyÔ­ÂÁÒß9`}凱W5ËûVH95$tòmèÿmA~j\ŽoðþÆñNà¡÷›Ö£¢=ü°Øïþá;žònO®÷È¥;ÆÕ]» jç°UHKwI~ÏÙcùÑsŽZ7‹·úóC™Œ*õÏM5Á²Lu×j8š7?>2ÛnDȬ0é[:ÈX§æƒŸƒ;jY)N¨¥,H]#°¦ëAnä œ''ºŽÄ+ràâ_ÄØ'/ƒá°Wõk®Õ }KÚQpbh@-æá÷4EÈŽßY¸ŒªŽ…È2^>yÜâ±âvÅE1`  È¥4q6Â^é'6Hü­Šg£‚ðƒÄ¢ÊÉ7°zèÁ³I¸ 3•B.HS`Ô0 Ë^éÈ ¤H™p‘·]‹&;Uõäå&ù:¶~âøaM£Ð –W©8yøÐÜB~B !Ö—°åÁرQž©ª•E+\žª½ûÌqR{b°ØÐIaì<}nÊg¦ÂLƒÉE‘ÒP#XO·®LSÓ Ú Ç†æ¦›c£TE¨×ÂìÄ2Êy” …D‘$±HÅ;uò¨®I°_@ÎÅ[÷M䂎¡•'Q¶]ó•oÈžk"…v«†¤lKC²H<ðm„äsã°:‡3¾gá,l!?F–àÒ­¤,Æaf¢Žû¸Ž88888888ž=¤æùï{ñO/G¶ Õ©¹`þ¶¦ƒÙêŠÙCƒM.<6 ˆ,…ü@&‰™ª—òã°x]N˜v ÖD»b#ÁÙf›!†8‰ŒphÉùwŸ9ZuU˜º=Ü—‘ £gŽ ò±Aðíþ9ÄÙËÌW‹9­”ŸmT…ìXÂöÍVè5w®YÓË1M½>Ûñ4¹îÅ9 }Tv¾¡RÈù6Cs®î•þpKGWĸ´*i@U~ñôq„ç&.Áý{ßt–Æ·#׬ºº”9u8‡ÒP d7]÷öJ¿]‹÷Ú싉n«:¦’ŒÞËôIƒê4æß¨ú†*…kWf@w‘;þ mdª¡ƒÈð;<€ÿ"òP?ì¿4qz¦{Ô÷ÚlC)ŽAÿ†z¡ mfÂ)´>€æ@”CÃþY˜¼ˆt^<1„òƒŸ£ < óä5„‡.-ApQT;V‹oÁT*t´Ä8Ê#}t”‡uù&i¢w! ÒF³@óR.LÊÐÈ?*KµªôåS‡`½BÿHà#ÏíˈÇÄÿªF ‡ðäÇ/€k£‚mÆû(eð:ØÄý¤rlp¶Ó%榛¦V]ìΔr yHG+Ç;ü'eÈ3Uuò£ç†“å/é;ÒŸ¡©ã`q ‡„p¯*·"lßK®* uôÜ«0|]EpûÊ¥p(™ÃÈ(…€ñÞ¼ÜçDÙ`ì¥OT ŒÄõ%€Øø@B}qJ,M$#Ï4”õìñÁäýEAvåì2vvM_(ŽƒÿãÐÌ âöÝE.Ç "k„€ç³Ù>piv ÚäŸfÅPáÒùצÛ5ü7”<´‡¶ƒn‰ÃŸ>Úâ!#{òÒkdâ¡™@˜0p(-ŽÂøðwˆyª‚øDËaà 6Êÿâ©#”)4€aýWïy ‡`æpQ ª (xhÅôß{ñ8™]pÑǨkíšoòN¤„ú"hÚó½xîå³'O'žÁÞDoD8ŒMôÃÃÉŠl4My&l dñˆÎÃÁÁÁÁÁÁÁñðÿ‘À·”îÚýÐÑ\Cè á¯xF¼¿Š«;ºˆÃÀV/O7WkÕ}Û µT¯8“ãçç¦ë¡§Ó!Îâ\])Ɖ;ªX ]©Y5}[0Õ\=Ò=«ŒCÇ(Žxy¦Rœ|óÊlµQ1¨Šã@ÅW\³¤ËY`ºåµjV5P÷Zæc©åÒäÈ|§^m!?O-°41Z,̶pÖ‹ÍŠ« 90É8ÜJ>Xì+ry´œ¿€ò È}¯ôk‘-–&,]ðlE•òÍš‡Ú9¦%D¾Ê¢úR9‹ê7ª.Âã"iÈ¥Œ\l½P µÈ“©Ö»¦ßnH\“ SÍ.4‰Œ =x`=!kÉ’ÚqØi„¨ÈL«‚AuàG•Ñ@r)‹S¶&ÀŠ&.6"ÍŠ, Cè3?qåY˜«]|ãogÚ>ÔŽêÏOG¨»X¼4× 'Ç^CK¡´PZ €¼~¥ u¡´¥ÜyT TD6ÕÊ@ÚnU=hª ãð£·@ó“£o*åIê?횯KØ#HY“&}Ï.÷ÈWÇވt®Ì4)ìÈPÂÄ¥s¨&j÷¼t J°´â­kSRiš ©äHœ¯‰ãààààààx^—½?.þÚÎ\õM¸àr Õ sàW   ½ÄK¯ÌµÀQË…1PV$EœFxL­8Õð@éAê@ÁäA5AGÁ<‰Ã ÿÄ)ÐQð@EÄ!xf»n#æÄÈßÈÊä^UFQÁ9AÿÀBQ<°DÔ1F Èçl» ^ŠJ¡.à“Ê€Q䎼’¥¯{Ùe#ù„¨>€j¢â•ÀDíÀÕQÁÂä%’ €Š˜m×]Ôkªá ŽY=ÄBw‡ñßjh‘‰º…éÎ+€2Â!²À!Ú¥˜½„ªM7#T ì €£‚h&©8ú¢)ÆW5Ðsã¯C“Ð'ø?‘a¨„µ†ÂI۠ʈ€Ò¢ðhœ‡‡ ꋆÚlJú‡ÂAø‘o²Å« Í#÷rnôÞÍ+h°ôø›YI£(ÂD£bQ£CEèP>¬<”a¯|ñGTŠú$š¶L€Ñó¯Þ¸2 »M|â%+5¦[ÁL;|ý•¿D Èõ%Ûeæ7Žç‹ÿƒO‚jæÇ/\¿ÜsõÂa=´AM ß÷uYÎŽž›šª˜¦ˆÃJÅÖ´R»Á-•ÆUµØéT]KßÙ‡¯»©£ñpÐ3pHc {(9Ø "tšñŽ4ˆò 8ƒÅíUßxÈW-_kÓNA4øLcþ¨Q5dfTÊT J‚?¢H  à¢°8àß+}°}Ô®Xsnš–%¹®Šš¢úP''/¢ú@詨/UD]2ÕkOûʼn7넬çiÐ$Ñõ2BÊå èY#ýj²†Ù0 ¨¨oaââT=@5qöK{ÝÀEØ2€ÊŽ]xmv*Ò¤ITuD1PYØ>7Zpilª€儆A¶¡s„ EÈ"ÃáLÛ' EQGEð_Ði˜ù‰s0+ȰB¾`ã”/J‚®Ã@sà0H>›‹âÁø ‡r;’BOx‹|M‰£ã¡›ªÁ¾@Ó(/ä‚VÆY4näŪ¦·KèiÔ¾0møƒƒƒƒƒƒƒóÿGóÿŠg(åI-¸ ؈¢e"H)Ø)x)<`¿`Å`­pIÊÃ.hµBðUðX¸¦VßË¿ÊÆúˆ=È$¨>H2ød!ûQƒ° ┩æp .(â^ï;h,¶±M‚%‚¢Ìñœ¹xyºƈȮ)-$Ë‚^ÐÀønÊQÔ«^÷P/ó 0Pqpu0öÙÙÎ’'Š,QœÔäø6H5fÔ”ñç]Ó‡Æ`1áÇôÞQ¥@&²@^”)”qˆ`ƒi£^d‘¡Ö4ºŽæÇV…¸7Zma¶×·ãá}€f"¡¾É×Ð àü°¿P¶Ë3•rþŠŠbÓP< Ë#2Ÿ#L6Ø5d&ÐY˜uHœò¿ÒÚÄùáBáD©èE¨;½HB±AÑiEjVM$‚¤ìùÆF Mß‚)Ãð¡ÙDH‡è¥è®ì]©¾È‰‡^1ð;ŸÿC° ¹Û]›¬E®&—h¡«k©ž­í ¢úû‡gKOÊq°ôŸt}š~Lq‚'­ÿ']ž§­¾_/ØFÙwdK/™Z1òÁÌ¥ÀUdab/žOóÌë§\ \ °tÁwÔzÅ[Y¼í˜ È?è}%°áÒ^.»ˆè¾Ýƒóó·mßîð€x?™ú¾­ôãZøÖ~ÝwOºØ:ПaVÀ®ØþÙ¯ûèÔž~쿦o¯¾MŸå²÷RÑ.ÏÓV_ޝ  ¦AÝ[ÍúâýÛÝîj·»¼«w™ÿSð›ÿã·üwåÂX5´šÊúÚR½š†’$ÛCX{c#Aw¿îæ3îv»O¶¾Ý»›ûvßý<Ùòìë3 4ÈÒäÀ5LMLÈ™L£êªP U*¶ê!Î~ìÃïÿÞü=[C4×»ÝÅ„ÿk;ùÿÃÖÆÆ&çÿ\¸páÂ… .\¸|}øÿfŠÿgþot»¦É×wô©fåðPüÀ!l×RaÀ ø­_ÿ•ü¿þ/ð·çÿ\¸páÂ… .\¸<»üßPDÇTJùqÐþÁ¾ÌÉcñ>¡‡3 =³ØÍZð‰_úè?øŸþûFÕçãÿ\¸páÂ… .\¸<ÓüªQU¥âé“GÀùiðŸpôP¹0qõòôäøÅ|ðg¿ç»¾ü_òœÿsáÂ… .\¸páòìòU,5kˆ}஥jr‰Fþ=[³t©09 Úÿ‡¿÷›ïû¶ÿÑøø?.\¸páÂ… .Ï4ÿï4k ù³L])×+H~ä[¼¾0[ lþѧ~ï;ÿá?@œÿsáÂ… .\¸páòìò±˜ç7T¡Qõ‹¹±«—§mCŠÙ™©z)?¥K¿ð‘|Çû¾5ôÌäçÿ\¸páÂ… .\¸<«üßÒdšØï˜ ©œs-µ¹´Ûg§U|ëW~ñ#ßýß®+eœâüŸ .\¸páÂ… —§_ÖÖÖ˜Ÿø¿¢(¿û»¿ýÉ_ùÅO~âã;ñk¿ò Ÿø¥þÒ/|è—?þá?ü½ßüŽ÷}«mÈ¡grþÏ… .\¸pá…˳"ËËËÄÿ!a–ËE[WèË_= ·ª_ ìóç^ùgÿä{MMÔäçÿ\¸páÂ… .\¸<+rïÞ=ÆÿëõúÚÚJws­Û]݉ե;Ýåµå»÷ï\ÿŸÿÉwç·[ºÄ×ÿráÂ… .\¸páòLÈÊÊJw{üxxüßqœnwÃ5µdV/Ú¨UרW¼¾ÿ§ÿçoýZ Àù?.\¸páÂ… .O¿,--u“Å¿Äÿ5MÛØXÛ‹ÿ›šh¨‚,äa|ôC?÷=ßõ¾£óýÿ¹páÂ… .\¸py&d}}<ËËË}}}0,ËÚÜ\ß‹ÿ®áÙš&—Àÿõ—?öOÿ·ïFÿþ/.\¸páÂ… .Ïœ!ÉdÀÿmÛîv7Cu@æwÀwt~U*Zºôñþüwý£÷!~Îÿ¹páÂåmÊæ[ .\¸py¬²¸¸HžþD4M‹çÿÇ£ýòÈÇÿÁüCÏç‡ÿ“Ÿøø?úöoól¯ÿåò” ÛçöîÝ»4çíþýû\-\‹¬®®¦=IgÛØX6º›kñ+×$`}}7ÄÍõø¶¸r÷~ !+kËwîÅQ—WáÞ»yîÆÚæêêúÖÍôÙZqFžÍDÖ¹}û6…§¦ÑGjØsŠ®\R5E»wïû a/µ÷ºl$Ú¿qãË ÷–RFkS–#â¤S¦Û%…²ÁCÁáÍ›7YRI'Õ#ì.ÄÒénoÇ;UOä;wîPú”ìÖ³us3%Õ“)*NºbñY!©R¬$»Ö+}·¤`:k.\¸Œ-CÀw¶æýê/ ü?pd_PÎÿ¹<½‚§ã$`x®sáò5‘%âlY”›1vðÿ͘àols?ü{Ak+ëe‡ÿiùÎâ–³»xîÒâÚ·ž«òêÕ«éCâ½ å¸Z™°°°fû,œ,¢©H„–yK!ª¼sàòåËŒ“K˜2¢©0ôG¤C¼š1v21ð»óÿ´Ü¾sî‰èžÄ²ˆbmMõ‰Yßrúþ93{eu­»þ\Ü>wÎoa×é¶VÙhÿNÂO,”MÈÁYb°»&Û#W®\aÖGÏ©¹¹9ò€·3JLBvýcô>Í¢{hüNn¿«ýÈ sõêUšDÄÌ“‰³)F,ë´ECÿe敇L“ø™–Ò•‚J÷ª+«½—áÂ… çÿœÿsyš…Íõí¦Þ}?~œk†Ë×"lš4#¢ f¸‘î5ÿL,~_°Ñ½zín†«Éþz‚;‹KäY^ßà¹y÷ÞúöÙ»KË+›ä¿wé9Pݵk׫„Æ:Äü‰·Æ·Ù 3¬*vŠlhþðáÃDnÙXz:ÎN¡ËŸì5ºP²Ä™ÙÍy®_¿>;;›žîB¦GÏè7â#õ6Ûðرc=eîš…š"Efý„™3i®NY³©ûDæ‡>Y l”>ý”ï1RPHŠÆª¿W½(ªÆ&5ñÁ.\8ÿçüŸË³"x’¦Ÿãæ \¸¼¥¤gk³¡QÜE÷âÿt§%ÎòÊE¸·¾¹ØÝ‹©ºvoq%ñw××€8ðþ=D[Ž¿¸þìOJÏÞ§p\ŒDbÙUÉ.Uï`§°È  !kFz)>"-àóôPYx¨Ïœ9Ã8-"åNÏ«¡LFÈâ@h¥0b¦ù0{q@EJúãdhhˆ¨õ{Þó6;‘mS€ÔÒëŽ-1`þ‚S°†(!T5ü—Ì(ön~蟽࠺P•÷ªR`í‚=b†.\8ÿçüŸËSÕÏÙCO4z®;vl“ —¯Aˆ2±ZbM»ÿ'÷>âiðÎ_½væåweúû3ýƒ™C‡3GöŸ<™Ê zéåÌPì†Ïœ‰=Gd޾zï.¨ØÍû÷Wמµ—Ìb‚çøñã ÁPÝ‹/¾HÌœ'Ü^x¢Ñ&ÕiBNÑN:Þ åÓŒ>Æ÷<æh–;kGJ'MÔÙä®n2×…Þ>9r„ž£G’˦èƒTSÝsX!QPëÁÁA¢Ù³³³l¤w'(„¨>•„²c²£2 •DSÑÒoH¸õ1µP„dŠÚƒj¾üòËàülœg½pøÒK/Qú´ ºûÈu\¸páüŸó.O‰Ð¦yl$m›§qáò„q!ô+°Ð½øl#¬­.-ÇóûAÂúbb4¡úC1ç?~IÌ¡éýBÓŸØJ fVìU¯žBö¬ŒàÂ… çÿœÿsyú»:=¼ðÐ|Ë÷ò\¸¼Ý~•fþ„øÞOY_^º¿¸ â‹»äìÍàüóKK·ºÝháÚìÊjgqijqifu9¸¶p£ÛY^Ìœ<Þ¹}#3ØfvkeùîÊÒÊÆú³Îÿ‰À“Kœóøñãl¬›NZÊJƒÕÌL ³Œ½ƒ!³÷/lþ?›$“fÂé¥iJÎÈ-ÚŽÑæîöÐ÷NþŸ¶h$Þ#À^@aÒ›ù³2³;»Û3”Ø7NŸ>MU€è¿Dã^%ÀC7+” !”T¼{ìÊʉ'ÒÌœù‘ íL…¤Ò˨a2ù€ᇟíçóæM¶ƒŠAˇO:EC(éÝP—°)[éµ°³´Þ!mâÑR ¦ÃÕDñ݇'qÕ³ÙkØ 5½áíÚʾžÀêØ³Žû Bó»Ò@ѵlÚXϦXL±ì/éùr= LÒ‹ÁÙ¼lyËÎz=¢ÔFÝÔ>·| YÎÿ¹páüŸË7ÿßz°±¹ö8Я»¹°º’Š®]Ç·³´:³¾´V–¯u»þ«™CCók+·»›àÿ÷67–77ן¯¯³Q}¦?yò$ øÿ¤¹(`­ íp‡Ío!*ÒÝЦasZJŒ˜gÏžEÈ­[·Ò›ý²Í3ÙTPäB~$H‰£ï}ï{á9sæ Bú´>d‰FøQNÊŽ *ñíááa”1)\ðgb\Tž7n ç°O ¬¸´ÌJøÒK/\‘y’žE«iƒâ³#Ð$(–ÊDêÈO©ÁƒR‘ŸÞt âT`–ÍB QT6ý ‡ô‚ÇÛP¶–ú©(açNDl6Ô;Ð]éSq[³øöM_YQ™ÁÛ³Bd'?hÊÔµzL ¨Ž" eÊ‘åKËCÒ‹VzÖ°ÐZ9ú0Ù­Ì‚èùG!ÿhSˆ5î~¶ÆâÂù?.œÿsy¶úÕö].Åÿ“üW–âG$¨íìë™ãG;·oÔo^ǃ03|¤³ºY¿¿ÒXYªK÷[ë«™#C7ºÝê­ë­;72'Žâ/kÉ-ô±ó®w^ å Æ›^ÍJž+W®€„ý *#&«;Ûº3M$ˆâ;¥pöÁ_FÛØ€$k> OÉw·×ÀBÒßóJ¾ç¸”5ÛDˆ}¹¸Ýn1£÷Nûê÷h£ç[ÑL+-Ûá“;Å/SÅé隦¿ ƲØù–$í¡˜é-†`OõìMú¸„¶ÆJ³b¶Ð›Ú(MnéB{1Þ²ÝíÑljôG_Œ´|›üÔÏwö[$ÒÓ½”¨;¥¿×ÓÕ©@]Loì¿=ùâTÏžw=´DåõzKaŸó`íË…ó.\8ÿçò|óÓÃ\-Òïv+ׯ6îÞgNœ®/¯U—WÚÊJæÔ‰æújõÞíèÆU<,3Cý4óŸÈís 7×e|;=~ËÆÀ‰Æ[ õ‚®mH SHúCW=;^‚Ð2v´”EH-§Û‘‘™ô·>mzOvý¥gü´µÂˆwšbQʬ‘2-§evJš´§g¼€wQgçÞ›D Ya(qÚªˆ ö1ÆýØG¨ =…g ÒkÛÙ†BiÛêq £©éï¤é=ÙGlÏRÈ¢íçÓEzf"½¥ ’îl¬¡{¾Aùö¦Tí|ë±s6QzïkÖ[ØÍŠõ4$•þND7õÖ€^Bídø;ëõè‹õ _pþÏù?Îÿ¹p9ÿ_º?¯‚?­­f†ÌN³³|?俳8³ÑÍ>>Ý홣GÚÝàÞpÖöÊ}³ÓFä;kË7nÝD"÷ïÞ{Ö•FlœÅÕ«Wƒb£ÖÐqÚ—†½¡[úKÎÓBã“lI,Û¬†™Œ–§¹›“ÌN1^G9‰Úõ Õ…fò¤Ï2+†¤Z­’'ý¦ »=ŸåÞ3–‹|Ól“€¨>JH¶q*réÓ`i¶Æ>-×ó‰4éecÚŒ"G6ÄÍx ûò®vÍ×(,)t6á„Ô‚Ò²™*éãV«ÅÈæ–¿c]— ¨}j€µ`§ÓIóa”™V¸ï4vö/ÔÐèô2ˆ±k”]/ÌÜc§ÆY–õÎMn¡pÖIÒ½šº(ëØ;ëõ¡6baÍÇ…ó.\8ÿçòÜóÚÛ»뙣‡nw»Í{·­+sµnxw Ì&@æÈ1˜þý{­5}a®~ÿv<þäÐâú*X[YeëžiýHS‹ô^&F׳¶—v[Ea㜌ç0úÔ3•¬†â0ªÏöºì¦æ-PóálzHŸí™ÃRK¦²·=qØêÔÕ³ÊU˜ššÚIÙëƒô0;Ó L”Ù5éÙ#éá_¤€Ée1Ó›ÝÄâôD º›¬fnx¼£¸H­ç­Õ7]öž‚}€€l.j…wrñï®mº9gªK¯Æeµ&êþXŒ֔݇'öÌÌÌ0+©»ã- ]wlÅzÚØdÔ#K!ýòG×ë£÷PT¾,çÿ\¸pþÏå9çÿ[üs5&¢ ·n-'Szj·®¶WîãáZ¿¿2µÞ­Ü_É!s┿´ÜênV–î_IÆÿë7¯gû׈|®­#‘gÿ3®Bd|€ñ :$šM*…†)¼‡sÒ@zšñ‚Q°qc:ËFk™‡ÍÞg¯hp»gú}zŠ~Ï|ƇÓ3U(ý‹hlÚ|Ú@@8›þM«˜Ó -Ùß)2¥LòŒmÒzÌ´„S!=Èl¡tÈX`¼¤kÚ³±Ûæ…i›ÊFÜòIlÊJEª ±7/l·™4yfÅxg¾JFú'å¡‘ð·4…ØËŠ™^«Kõtßî¬jÖdì WO_êYtÀ:mº°+l}zºó³7 éW0»ÖkWAÓ¤[ªËgqþÏ… çÿ\¾‘ø|ûënâ1ygsüvõ~kùN}ñng}£vo%sôDei%Z^Ê?.-¶6ÖªKw[Ë÷çV–Àÿ‰Î­w·’z¦•*rç{‘ìQïÉI[ë>|á÷—S{&=BL³ÝÙÄÖ´"’¢ |ºÛS‰ˆ±°On휔žñÞMÍØgõPj´{3!rT¶µN75Gbqq™ž-a`…OStf˜t·SëîØ¶‘ÎÒÎü§OŸf1QÇôVŒ\ÑéX(<]e6…5¤^¶#‹ÏÖ°"=Æù?ìM Ó˜ê‰'¨vTf3ÒâSö‘‚ü¤…Y—´3Õ£ß;P7`Ó“X-˜áÉvjÚ9KŸ‚èªNÍG;>½ð ÔWÙþT¨4ýråC‡TêZ=Ÿ½ §oÛQ²{Õë-õ†ŒØ6¿ü+œÿsáòðÿž½Az–D±1:»ÿ­¸<«ý*}ËÛè2òw•õµû›kKñž?™…îJtçJgc±¹t/søP„y±Õ]wïÞʼûeua¶¶|¯±x÷Fy˜6ÿARk‹ëÏ4ÿg1AÝ[‚»º®®m>`eô£m}sy}#ž%•†[‹÷VÖ¶f=-/.‘‡æA­Ó«ñ²ˆTW—Wè/g^8½¹¾àpñÞ}¸·oÞz¸6ÉCg;·n#þ‚¼âì667ÖP¬uð«Õõ5°%úŽ[lª¬¬R-2}÷—)Ék×o³ä——W{x~÷á‹pÇHﺃû }׬»½Ò¹g÷„Ðí Ú¥Ÿ±ú´Ù’~A©Ñè}üŠÔîéñ|ö4Äg$Y.”,émK³›šÁEË«™uÈ%<ìm»a2Þ‹øéÍüÓûšvSŸ$Kï¡Ú}øMAÏ©îÓs˜¥CUNä§‚™{éËÞA0öŽÔóÅ_d÷vÆ«)£žÕi‹†}:œSéÅì´O75cÑYö",ݲhˆS§NÑ:¤Ï^$1Q´þþ~ZDþ¦M¡W”S;Ù€éæK¿A@ÿï1X˜}î-´Å(ëWlr3Õù÷79ÿçÂå9àÿÝíi–ìÆH7ÉôÃ…yo{œ‡Ë³ÊÿSˆ§¿‚Ь¯Ü\[Ê´f›è S«÷2‡/w7;ë+õ•ûÍåúÚb¸x;ó÷ßxy±}çNf`OèÅ¥õçcð%ÁZò6ãúxü<“<~üd7þÖIîõ„üÇßG̬l׸/™ÄA<âÝ`x0ùØ.‰dmÅÐÀ ¹qízL9’ø1_[#?Î?~<~mlÄ„?Iyxx¸/yƦA’ÅŒ›lu…Pމ 7üÊÆ&¬•õmµˆÙ>B“2ß¼u‡†!xÙ÷Ú ®ù!>ŒSì=Ñ]ÚØ?ým/t³žw™”¡¢¯•±AiÄG5Y^ì/ô…6 £gZ8Qbö3fYÐil™} ?¢»9{ö,Ë ÄÑQú¥ ¥ƒ¿°=”Xíè:bó£èS ´’…ìùÆtˆZ0JϾ ìH¥´d8ý}–5)}éŒ}éÂ>šÆ®ë……TùÝï~7ûäEÕX⸥£ÛÐw+XFtÈè44Iï Ø"öÍ •Ò¤öñ;ú 5"¢¥Ç”˜Eôœ3gÎ å+W®°¦‡mBF Ùô°£wli|úª¼zõ*kÁä æÝôW'ÈB¡ìP6›Ž—ÔˆîŠÔHÏÝí‰C‰°ž“6ñ¸pþυ˳ËÿÓcntû¥e7õ…J€[ø§O¾!úÕ®&@Âxo/ÝOæÿgnv×§of÷7ãáænpíŠ>×¹Öí֖ﺷ®z72‡¯v7nÅ›…ÒøÿêÊæsÀÿoÜ»‡«âò4~¾¾¾ÙŸ¸}óN_¦Ÿ®š…kWœ8¾–Ø»rõ2ͧêìKè÷Æêê2Øùòò"\„?yìÚµŠ³v0ü“ÇVâã_䟟Ÿ…»²²Dÿº·Nµ±º¾ÒߟÍqôèaJaáÚ•LÂþ~æÅÓHq(_J?fbëÝmÃds{˜tppøÖ­; ‹^¤ÏcÇN€üÓ³µ»½r–h9±,ôð7ð¢žwˆŒƒk± Ki%&9ÓgŽi¨rG‚dD@ظ4üßüÍßÌl„4GeÿlºTzüœ½è¦fkœ:uЏ}VD<“&iÆÈ¾ÅÌr$Ÿ6Ø^4” ™S‘Ò7gÔýرc ·Ë‰¤ËO¥ÅA\i:z¡AÙ±õªL?LÕéC6Ÿ^ÂjAíE‡dA!Côy¸_‹FŽì ei«Š²€™À¸4uŒîß`¦4©ØdG¤_j9@ŸrN¿¬Á!j¾A‘*Xt$´ +3kAd5ÒÇé¨S¡HiK¾‘G¥eûµÕgÂ’eýmG“v¾¥/œÿsþÏ…Ëó1þß3•n×tëNÏ¿åëž¾±úÕÃäe-ž1rme¹» nß¼~93œ¹ÓÝ™æfÛ·n‚3y ó3+sݵùîzíöÌð`ty$&-ßèÞ»»üðÿµm,-¯®¬Äf o'†b~O;y÷ÎêæFÿðë›kp9§‡"{éù¯^_ …/­,®¬-“mclþ›·oÀ=vâ(ÜåÕ%ûžÔ“..ßGšðܽ'2ÚúƵëéÆÅ!û’U 4‹iû>°å¡=EçææÞûÞ÷²é-ifuš—R×¢~Õ³ºñ)2Lí¦§aãÅÃd)‰Ã|ùå—‰õõìçI4•hc¼D&Ù8<£²Œè‚Ó7}ÝèÀiÙE‘f¼ ®¸2†ßó:#-4ªLÛEÒ ³'"´é/)ž3gÎÐfPi»ƒ®SvaBÕ´Ol÷á¹ë¨EzCNÿgzªL…Lkƒ^‚°8ì½ —fƒ?ìÓÕìµKšÃSíèÓÏÝ߆K¯WgqºÛ“”è+ÕLW,h€¶Ï¢ÿ¦G¢Òï}z^3Q™ŸŸ§2@{éïâu^«Â”Àžtéš²¶ÆßYïâÂù?.Ï.ÿg³鹉[åÙ³gÙYdĆڸ|#ô«ž…«é;áâòÒÊÆz<¬=É f¿øÜ̡ÙÁ³ï}ofpðÚúš;7Ó¸}sfyqz1~*Ïãñ}äèíÅ•xÂÉò3󌕰ºrëÿgïM¸âHÒlA± !$åR•]}ºç™ÿÿæÌ¼wÎôë®®ªÌÊ”!-(Xc÷ˆ°¹î—¸y1H !’Y†"ss3sóÏî·×)übæÇdLOàïÛ%þß}ûß4¢(ôµ€÷Ðt6·8_Ü.ŽÛõÛSãøi|zª>SóÓøžY˜›¼ÊÅ÷Ä­V¯úª3{o—6ŠQÖg#ͼuÒÔx¶ðàÞ~ýgÊ›ÿß)»Zt5šøð'ñû½» Îâ½Â©ÝÁv79Q˜|<|øP@H†(ß}÷ÈÂì쬬G€š€£(^v’(ºé­²ÔÍÏÏSŒvÌ%óWιúTYØt ·ÆMÉ]Ò¹ÏW\Ñ--6Å9k@'\‹úœRùÿ¢Yœç*%ÇD™¿7ÅùájáüPí%CÙ$ÿOø?•T¾ù¿‹S¸!‚bßté‡g«Låk]WÙØ­^içSåCÀÚÆ É;s3Ùø­ò3‘Ý/>·Ç)ưÉÎLgã6ññâ Î’²MZ˜Üp ØêÍã^¯+ßÛãýƒn½‰Ía÷õ›“3‡GV»4 ïóÓíuŽê‡… O)ØÇ‡âúÚþûv·¥jø€eàÁöÎu¸•­zaøzh߬ƒËY2Ôç]¨2ÀçàhŸ7Â%ý~ò^óàˆ½ÅE–†¼ðËîµ;ûµ½v«Qz(ž8`£˽º%…æÊqŸ\\BÌ,·VECõ @_žn€Äí¸\î½r%–TVHþÏ[È¿XÊJE€”ÒA†÷aèØë¢é`ÊPâUä‘=Ä7SVs‰±S‚­Î{œyú 8¦W©z¢9QÔP‰hÜ…ÖïHÙµûYKÊ3ñ„(¼ûðÊó—«:)X,}ï€ÂïH_CX®ÔØž¨bccÃõL„ͬ^8Ð< œ.O ‡®ÆçAãÕd‘úCZŒ—ë{\TSëjkk‹ž¿b'Õ¸lÒÐCl‘W–²-•„ÿSIKý³â¥+¥àË’Ídñ/•¯ÿÓ¹5bø9nn¡üiïèðÖÄx¹HržÜyÿ[éqè&âÓ.?Âk@xýæÝÍÏý…—("owê½~»˜¹Cã$QZñ)¦i÷½¦¬WøláÃhJ×\ÝÆè¿y³3 ±Ô?::8ÇKÖj5Bé#Àš8_¾yÝ<ï0l?ë7›uð ÞÝPz¨µÂG ~¤öÑÈ „ôE—šíâÿí.>8ÀE3õ"As¿Ð rŒ¨q¸WF{ý=ì'ýméý*üãšAÅcøTµ(§¼;¿i5z6(…î ]“çQß(DQƒpÀì„”wïÞ•[k’—Q?Z3õÿTr©ª¸Q£ãUb4XÝãü3ѳ|~Õ¦`*º¡±+ˆ=9Ýš¸Ô32p”uÚÃ(áX5}óÜÊ®wØÜÜdÇ”“Ú9µ(LïÄU3F¦ÉUþ ¢ä¾0Tø@eZF[²*žÇ-œ;‹buò'õJy}€b¯Zeaù#'ðŸð*©|ø?Šì]Ò…ü¸õÄÄýªª´4•¯ÿ‹èör|Šè÷ÇEÐnÍXƒ²F§Uì‰EHœããN ûƒ>vö÷ØÚA½1(mæoøœ•¾@þ €ïúñþ³0Àµ9Yõ£ãA¯ßiµÒ³;„å!  a|»Dû’`µ~ û½~¯Dþø—¨~¯¶ë²©ÖPËüð|½àYŠ?ѱ®¤4ïÁ§W"ÿ~¯ÝÈ[õùòúA­ n°`ÅÝÕTGB¹»:Ê¢eøÈ„\ÞS•9\÷ã0*/­0¤ò‚ œó[â\ÏÅõ_ÉÅ<ŸštŠ@×]AhõÙ'Íù‚ˆUQh×&DSð[ðÞË3þx,ŽF@],U8—ÌBôttL¤­vx^)§ÉPp>Å7U²ÏS…ÈXH¡V5 ÅóÞ¦â‹ê J•£'¨á«•µy¡8;-Hf«5ÍOÊÿûàÿ¼WܦÕiããøŸï¬ršè œö”Tú a]Ÿ%‡z¾Q‚9 øÚöŒða˜*Å›UnqM‘¤",XB@uR?ñ}W6sWþª{Ší¦”4ÿ®”Ù‘½ O»jÓïuó^÷Z|X^ôJŸnq¦ßí19T^j òÒ踴ÿÉþO%•T¾5ü_¼nš­UtÝ ÃŒêaè"„M2Ù´Çû §5wØþܩ۟´“ØŠ¸"Œ-}ÙÜÜœäÕà‚ÅoTVøâp:c»úãaÙ¤=Q£¢v«%ò÷–=v]kIèˆn+ÙâË—/È£¼±¸)¯â½4:š,:\wù¿†VÕ“ª‡KKK¨ãÊMvRw!ÿ%F@“ N„Q#xS&S†ÊÂ-âȸÂi•Í¥ÛÉVüé}•BwÄ„È# Rî¤òUâÿ`‘᧢Ĺ¯ÌWÛïtÁf†Yk™–î¢çH¾õæºkäÍ)¥}Π{°_cX~šKÑä©Uù´GùP|ÁOoØÏ¶ygHM³w°ocì%ù*©¤òmâÿV«ã[ØQý¸HÎr+S^ A(cü(aÑ"·c¤KRnÔQ¶Aà(ÅLc=…œòXÁН¥!3.ý÷es¨úrÉgø¬B”74Ρ<\RkF`ã1£œM”Å}?Ñx j¯1==vÙÀ#€1ñsÁ`,œ`á¹ø'ºÇ^Š…&pÛÚÏ0-SŠaVgÀeÚD†lŸà߃ë Ü꼂 Ëü[Xà6røÒ®ÎAáM¹ˆØŽPZÎl&òSðÁ²ÛÊÌ‚ÞjÈ  þƒÔ‡ÍÍÍj#át‚Ô'¢ð¸al¡šcÑ‘Ð,ž ÆÎÖðȨk ¯§DŠâköY“óðáÃ(—Í5Çÿê*üSê†À·Òt¦øŸ_7þËnEÂz—ÿ5t+xæÛÃD¥KKK|‹ã{ÒÆ`öx¾ä®i×íf+ Nreã·Ÿ¾Þy?lwÛ›ÝîËŸ^ñéøÙîô^uº×äƒÎ¼Èø}Ë{›Ý¢o;íîÛV{kï`ra#êúâýŠ‘¦’J*©|cø;X«´ü‰âÿ…ƒ°$LŠ‚(2k†€4B\Ï îDÅQÞsÓ(H,²›ÝÙÙÇœ€w c²§¡â€Ùº™pÄ7PY±š)'&ÜÚÚR‡Ñ%²ÎD CÌÎÎÒw@£@kè‰8¢GÉÔ7šžž¦=³“ã*:/¨‡átIe'ôdÜžOœÕ¢hBé˜ß»wO‹GŒcÜU3¡+“ 8àçÅÀËüùÏSs¹öÌŸ[þ¯5­[¦³á¬zôŒT¾fü¯à1%É“ÝÈ›÷»…coÉdLt[~Zv³{B'ó~ï9__c4;¼a³VÆü/‚Ì÷òÆ Ÿ¿Ís¼óëíÖj§ó¬ÛyÖÉËOŸÕNŽó×䃎-w{O»=|?+:–¯·;/›­Fë];ÏnO0Xk½Ñ*hìÈ|Ð1rC õ®7ÈÆ' §€ßwÖðþÝnzMRI%•o ÿé{ƒv™Úfpþ®ßî¶Âélƒ„I#už¤,÷Ä“e[…÷Üð|Þï9åÛ­ ]ƒ§õÈ¢Ê H~°@Ä VI´¬È9ŽîØf¸*ã½°yŒÊâä–+Q°òƒã€r{5î[¢¨;‹2ê¬Oç…(ÆN0Ñ:ïâ¼™Ãé ¾aÁØŸò®^ѯ N‡–3¾Ý!œ¶Šáƒ¸\+Åÿù&ð¿Éÿƒ™•aî ’ÅåG3ЮN¿Ç8'¤l0¼l”믻JÑÀì†-ª>:\íz· J‘ML??¯¬â¡’(üà EîÕPÿ—8„7oÞÌÌÌÈ/ãª^sœvéþ¿2Žr6VšOù¿¾nüÊÿwpŠ R^Ñh¨/Å ïfÞ”ßxÍ£4šÊ“Â÷+J¶dZK7Iø_NE½7ºEŽcâÿ7ýÁ³úñÓúÑÆ`ð[ýx#|~>:´~O:Ížõ;8xÚm>n××Ãï矇Þ§±ÂÿÞ}ý2 Öºíåfýå ÷óÞûÇGïÐTmw½×Ýèçÿ¨Î¿ì×v v£³OÇËcÔùÛ»78~®]ë´VZ ôçY»‰š8~ÑëâçÑΓfãI»³Ú “ëý€>£ÎZ³±Ñngw&ÊA5Ѩ’µ_*©¤’ðÿ‡äÿ­ NkEúË‚P¦†-¯Ói°ªü_‚ÿþñ Ý y3o ån7©0eø«««á´´?Tl“>ª°A&U¼t!!“x Ó†Ó.¯H!\N+5ܵ3•¯ÿŸ]¤šï´Wþò¢{¢ ¡Ô²Q§Æu£ñî¸ES(pȇ%þß¼?:z Ýim³vûnl¼+€ú~6=MO¾ áiýàeÈ×óÖ««ï¬÷ÛÙÝ™lf"›žà7Îl‡þón3›ŸÉæ¦_ ò­^'»7_ü95‘Ý_x²ÿ7*ާ&–÷Vë‡Åñâ]žûÓ÷'¿.Ìewgy¯ëã½ÝõV=ûþ¡Îì–ªŠ¿¾}‹Ý›*z˜ð*©¤’ðÿ§àI|¦˜u@G ´yð¾:½#ÚA™,ø¹L²ÂÑ̪sS\®Ü(ÚÄ#›¢O‘«{³Ñ/k )—=Ÿ}ƒø?XäOëyÑdffæY¹T¾‚uÅ@ÁØÏÎÎ’;Ý‹2}øË‹k¿ù?·¼ê^’ñ…Åõ½½Ý0X®í­ÕëÏ[ÍÍÐÆ^i4ÿö¶°žÏîÎÿ²÷çWÛÍ_vß=ï¶k;p´Ù˼߇ðÛá~67[\r|”MM>)Z €âÛîÊÞ>žíd“S›­vñÓÌ,μl¶p€ïœ¹·ˆŸžì¾Ïæïþuãå^yù«nþ¢Þ@û[íÎ/;¯³‹š““}µó²?(Ú™š~ÖjÔÊ“øi«Õ/Ó"òï—æ^ÉÖ/•TRIøÿÃð¿;µ…RÙ}T?‰J‚'º<4Ë0˽!w0܆C}ïà…\À>®ñR¸·¹¹Y¤*1ð€$ÆÀÕŒöé Ô.üÓP«Hp×­¾ü/ÏÅAÕOµZÍ3§ò-ã½ÂxGîÝ»‡KÞ¿ÿ—¿ü…¡ðÊSsÄôŒ©9ѳÜlü?z—Îèô»ÚQ61UÄÏŸœÌææ³Åû/;gõãÕFóE§[œ™š¤ßÁ‹N‰üžìoõ{8ÈfŠ_ñŸÀ €;È,½îõ×ÁL?}_Ãqviý¸^r«‡'ùî-òÌß·¶³» àŠÊ“S€ýÅA‰ÿÁ’޽% €3…ÀnþuÛt¦[ôpvæq­övþ¹óz§ÙdüŸ^éâ\ °3tI%•TRIøÿlü¯þhw+¼ÛÊ Ž;­6ñ~P/X€~ hK—ºN¿NáÝ›·¿‡Ý¸9…b=B ŸˆÛiüó9"O²Ûd1”´ô[ÃÿzFr‚ Sàa—ÐISùÖð¿¸c¼Œcccø~ðà3yiå(÷Üßߟžžæµ /öàìîA» á% ÝoY&^µZÿØÚÌÞ áo¯^#ÀÁÓýC y í—yoå¸þ/7AeÀ~zfùèpæéáQ­”É¿êöñÉîLï䃭vŽ~^÷ÂËfßÙÒ£F{³ÕÅI@z ÷láþÓ÷ûk‡õñþ¼\;XÙ;Ìæï¡Ž1㿽}_ ÿÉ™¢¥GëÍöòÁÑ›нÍ.™ÜƒÐh¼nø?§¤ê$ÒÓP3J*©¤’ðÿÙø? ;O×7¯™7§Øï:ݼÑ!ÈÏ;…Ç\³×=îåùPAPß;ºAøß1?7ôׯ_‡¡Ó¨ÌÈ=°ÏÇ6èÈ¿Êh|Jqi?;ù ÊÿÙ>Ú¼{÷.žšò/ó'¦ºV޶T¾eüe x°xÍ™Äóe(Š”IÑ5@-ƒ*Þxü?Œ…š7{zgváþ¯«ëÙÄ7íö~)`ÿuw÷->øe÷=`vöè»~Ý?x‘÷ gÞ÷µÝòÏÿ~ó6›¿‹ [!<9:ÆÉ¿½}‡Ë×ö_õ×§~ó®°ä™bÏæváÉÞAi®3ýËÛÝÒÚgž7ZÙÝ{í.*à'ÜâMY}@SÙâÒ¯»µìû·ò>`?ÚDS¨ðß;¯²™™_Þ¾-Œ‚îL¼ëõÞÖ›ÙØDcì&üŸJ*©$üÿö?صE†2ÔƒG‹oÝ]z”ec·Ç&gfæ²l|îÞb66žÝ¿½°e·ÆîÝ¿wÁ Ü(zËl_ÜÊžiSÈÛý…{‘ƒ¾DãÄ—n™/¨–ñ¤®3ùÜñ?£ÌÈÑüÓhffæ:«HRùÜëÊ9züêß¾}{bbBi2”#[ø+‡¿~þ¿ÄÿƒF—À¸ÿOL½Ü}?ùÝ£ “pïîz«¾=ÈךÿÜÙÎf¦0øÒxö]áuÛÿÛn ÿ¨í Â÷?â|ñYzø¤Þüõð'W;y¶ø ›žD/¡þlñY|¸ZoŸOÎNþëÿ‘Ý{ðÏÝýì»?áÏõV¾|ØàO/»ƒÇ{GÅñ½ÙÔ\¶°¤«²Ù…Íß}½Õï‚gyÑ8Þn5²ñqÚÿ†«c§ŸìÿSI%•„ÿ?ÿW÷Óìöí­Vc£ÓÜl7·òËÏV«øs£ÛZÏ[Ø,^tšÛíÖ«ãzvgº;ݼ¥îâ>Ë”^ʦ—;²î˽Õq,wDnJhÅ?Ùa6¢œ­QØëI¾ööö„Ãõ}ppÀk]ÎO´Ö D3㌀‡ôt# wd¦°c$œv‰sÂÔÅñžîîvÝ©|›ëŠõUMéðøòÊ‚N&dÌÄ=77'' ò7:ÿ× ×/$ÿƒÐÊ{"ÏÀ‡óÞܽÞÜD?ªm„ü·ú~aöÓ<*“‚åøÍÏÚçýtÊO Ÿçåg=o¾Ä6Ô8Êv[ ²NÞmwøO%•Tþ¿ þ¿½Ñi¬æMâüòƒãµ¼ù¬ßZ´VzMü ^`³^Ï&§[¼QiJsYBè*î}ýúuußdúZb{GÚÒݳcoß¾—›gÕÁ–ñ•¨—…1iêÃ[ÈcTÃ÷úì9°X ¨û¢u€_‰‰EÅȰÏáüã¶ ðÏåäAþþOëªZð&NOO+l”ιãµÕq­VsNavv¯¶‡JS.õ›RŽu:¼><Èæg^þúþÍ/ï_†ýGµ•N};„ÿz÷êy¿»úËy«øt;øý¬ÛyÖý¬ßü4øYí6Ö:õõN}'äÙäXüÿ÷Ô)åG*©¤’ðÿ…ñ?Ðþr¯½š·×º'Ÿ•^gž„Îc|Åñó¼³ÑhfS³Mú]•eï郉•¨›Hx¯,UÔͽ•*x…m'–F;8I€onÍhÄÕôÙǽÝà=§î[d4èõìÑ&§ ˜Ÿ‘ £:+Á°ó‚8¾YB„ÿQÞ¿ÿäRIø?­+ÒRwq§ÈO‡ï¬òkèe÷Ü8‹²¼_¾z·}”·[…åO†We£s¼5è<9ÞûeïíVèm„.põ«~Þ·ZbìÕNëº|ŸúÔþ‰ÿ·zMàl-µNc¿Ý8j7“í*©¤’ðÿ§àÿµ¼ù¤_€ü•’ øìÿ5tðù-´ñ+ðÿzówüOd®f_¾|mlÑ}±í'SÌ.É„Ö°ë ·ibxìé‘Ý~°°ðÜñkµ+ƒ›Pý0T%DæýTxÐó0ŒªfN‘Áq4ûsVj¡„Ó>½ Af@ &ÅMø?­+/ÒEÒí—Þ¾cccø^ZZò$Ñ4DDñññ©©)yKÉ+F¾ò×tÒ˜·%ïÔûÝ"òçD¶¶¿»Ý©?;¨­Ö@—_v›¿¾û& мÀÇ›y{3omw¯Éwôiñ³Ým=?ªeK xÀÍ"1ýIšÊf»•^“TRI%áÿ‹Êÿð»Ë½îJÞ]Í‹o?tEWCþÛ øs½›o4ÚÙä|k:Ýž0³¶K@2ÙÐ4Î…q2çççq¼°°€ ?9&Ǧ,³4E=Ñ>·o…ìk”wîÜÑ‹›;XÜ…BûÅÅEtL½e‰BÇp~€p<99†šüùã?òB©*p<==?1 TSä™dÿéøŸÏT¬%fX‘‘þOëÊ”0àï&I ¨ßhþ‰ïÙÙY&ãûÞ½{<ÀÁ÷ßÏè@ÌÀâ6„7¢lnn„b#(R·`.Ææ§‹nÓwn-ÞÍ&ÆŠPúŒ?8M¾ï’ÆŠÏüL63õ¶~€AuýF«YÄÊ;é5I%•Tþ¿0þøç‚#x\â0øi£›oÞæ;ƒÐî.ºÂÌ’Œmmmýë¿þ« Ê„Ùx€ ;o8­M½{÷.BÎîæ‰«¢vFqpI Ø Œ÷èèÔG¨2“þð¹„R[À9aJ_g7N¢$e™‡ £¤t‘h„“IþåfÙ ßüOŸ 4p[‘z(áÿ´®¼pUÐz? #ÿ‹,Pn€“äÖ¥KB}Ê |ñ šÛ1Þ¨Ò¿û/#d8îåÇýØæŽ}mJѯՇ)èÕÉöðƒãÝÃÓj¥_6FÚí$ù*©¤’ðÿñÿ‹N˜­ûû‡*€'!Çøõe'ß>ngóÝaótƒ¥T>XVÜèàà@xœyš˜mÇk²3Ïl“Û.6eêßñ+À9vglß#ñ¿,…4:¶v³À ß4Úgœp\<ïuİ©»wïú4â't’?¹‘€'œv¹·;æFV ÿ§uÒ¾› æIú€e#µ!½ûÈ»äððœ~e—þ>7dÊB¿ÓÆ|…"Rsÿø°˜f»U¤ÌœøÌÖ£Ãf§Ýçž1èôÝüº|:ý^7à“—ŸnÎO¿Ý+4½ÁÐ3kÐï6'ÃL>©¤’JÂÿ‹ÿÓ>ÁÿÏ;'Z=äø¬”?mµ;¯Ž›ÙÄl¯l[çøø¸,pO;XnM 5i6Cƒ[N/‘²@|¿YŸ›8uôJßCËœ·oßJ¡xÀš$Ý»wl­xöq"2&k ;’)PDqp: L$ëâ`ÉÂé¡ §]J§éa]“ü?­«‘•)RPÌa½ìaƇËÉ“ëÞƒPàÍ•¨Ÿ<&êT…\üHÜk6ÝÎ 66xœH7;''Ëz[ù®ÝG›?‚þ Ÿ÷ŠÑ=è÷{íVÂÿ©¤’JÂÿÄÿÝÖZ¯ó<Ï #ÿN½Û/²äýÕþv¸ÿ2„6êÇË[¯üðçfë£í-=[æAÌ\½^÷€—¸ÏŠkO¯ÕjtHåfá´RL— £¹:ã)•M*ß캺¿pxxˆ577's b~† ÔsúÆy6]JžÁ-ã:7ƒ^7ºÎÞ9>ßçTʃúѱ~-4ƒÐj4ùgÞéF°ßé@·,ÅT—‘ÿ‹«úƒ«Y„Ÿ5Ï£D^bK¯ ?Ÿ;?f*©¤ÍëFâÿî`-¬‡ð¿ß¿Û a¹qøl¯Ö!»µ}óæ ¾acrrrkkˉÞO?ý„Ž=yòärç_ÈŸÞ¾tñKñÆáÿPJq ÃèHNñlÂÿi]}J}%õ§c~r‘z‰ œQz‘›¦^$_€Ë#Õäç.´ŸKòÅõbÕþx†Ñêóã'¨‘«I†Ž®*X\?ö²¹3hò^¹šþàr4ÂåA˜/»nSI%áÿ«ÄÿëíÆ³nkµÓYkwÖ[ùZ;_m÷–»½—!¼áY/Z?x~xк(þ'qýH®¥¦—¬ìO^ºñŒì‹Ð~’`Ühü Çô)áÿ´®>¥>H/'Q¢¬@¬Á‡Dô%mqàJ²5âveFDÊ¢®xij«/gõG“œ)ð‡LøUŽ‹b÷¿tTÌ4ÓΓ~îþø%lŠÍ~Áu›J* ÿ_½üÿY¿³ÖËKÀ‰üÿYoðŸµÚJ?_îv^…Á«Nûm£üŸ÷>š`´ í¤",®pŒ¤@—.zâxAÙ¾Íü¼7ÿ»ÙZVÊé„ÿÓºú”ú7ÀÌÈÁœÑ ΧÔ0?a•z";^Y®fÞt/wMú‚ed8crÍCYôùr$Šq¾H˜e<Ù?\ (.˜bÄiF²½šþЪªÊ>|‘u›J* ÿ_yüŸf™ù‹.À=|Ö:ý•¼¿Âÿzýj#„_vŸÖvky>>3süÏB©H ûÀM–êKZɵö…N)ƒzßTnþGyôè €ïS ÿ§uõ)õ™ìƒù¿Ê€AäþïÁ²(X¥²0¤!©Ö§ò•_×-pSÅ>ú‚Vgõ‡žØRøüsÙÌ\6;{ëÿúÙìtöÝýlr¢ÈÉr!ûÀoÒYo’˜ðO—¶°_.>—(eGGGGÉ èÆáeò3båþOëêÂõ¹®È ŒÀí²(JÀóçÏ?ª·Š ìII¢î]àšá—#xùâ9ýqTù!¦/ºD¼läCää—»Ãe‹ÄÝ5ÃQÔëÏÝŸè*oð‹¬ÛTRIøÿêñÿf¯³òõAÿE¿¿Ñ /úa½VáYÿÏëíÍVÚÇkGûý>îÝÍû›:+IŒ3¥_ºp^¼†d©Ü8ü/Û Œ¨Hø?­« ×Çúé§Ÿ¤vT´Oü(´,éhTïŒBhÉ.p_’5A\¥¿š¢Û±Wã*û±ýQneþZ«ÕΉ¶ä Úxpe tuu•¨˜&7—Þ>µRŽÿá¸.±?4þáÊg³_vݦ’JÂÿW‰ÿ×:§yk¹ÛyÖí¬vr|žuzO»½_Ú­íþº_ÛÝín{ëø•óp‘pËnêOZG‚£ü_Ÿ#<…o%QX³TnþŸœœT‚9Wß$üŸÖÕ§Ô§üŸ—PŒLkêjÌÃ?¤Ä`Jqf~~žPŠ¿Ò®ã Rò²·$¢Cg¾ÔC<«?®|™™™ `úB 82åš¹‚¸F¸Ë;w$¼b.— `X<ÏeyŽ´ê²ú£yzh÷¥Öm*©$üõøÿy·¹Ük¯äÝÒ ‡Ïj·¿œ÷ŸðaþßæËnk»~œMÞéNð?é{IDÃcÑü‰T'XÒ^¦æQÇ\:†ÄÜ£iÌ?rS®ªAÉkxÆ(Fö“pO’ßGä/Ì.iÒTYþ§j¼ª¼¦wûÌþóÖ×(ØÈÎÎŽZæ­o«r)ø_`žOJO¿šù7 $†úï¾ûîÊìF–Ș-bR>küð„ÿ?¶>ýʃÙ(¹ž —¢‡¯‘¹µl§5Å1º!€±¨WãĄ߄‹øV>t& žC%tQ3ô–ƒÅöÜÁ¼O8ßV®­mž$Y&Ä¥ˆh_4Yåð^ŒßnCÑN>£6qæ'&&ÀM°·rh¥;­ïüSO\‚…?ó¾bå–––<œDâš- ´/ºÄjÕ'Îç"D%Ê!ûn¥þˆµd€ aaaA³ä=÷c¶¯'¨Í+ò©êâ%E‘/å1úô P?’­yîTRI›×õÇÿOú¿ãÿÕno%?ÁÿOBþ¤ãÿãF½Šð£ˆy2…Ù”¼Bþ›ö ßsssjÁ'Í÷\‚H·‚EX1Ú&Dü¹E.ƨÆÎWi©È¦Z@ÚÕ½öwʈ Âülœb®ÅÅE‘JªnGê>”á›ÂÿÕ(>|¨G·Am»Û:§ð‹¯ô“ý玞ðÿÅêã×ÙÙY!=½ÂxÞøú ; ä «˜ÿκ^=þ÷&’¥JÒ»wï*Ý9sµàO jL Ý¢IÇ@¾è"===Ý(‹²r‹ÐÉÐo%Á!ê }N2y.4èîo+Žñ+“,WS)Àx_a˜~jjê$ÿW©^‘×6)æŸÝ;‹œzªwbZ4®³$§oŒ[K‚'±Z|zÙC Ÿ~â<À-´ÇñF†œ¹/1™¼»ËŽt¼½½nxòN)‹¢É‡…$”ÜGªôè,˜4t†Õp-îÎ:’Åጄ-øÆä€ýáµ ßÄî‰;À]Ð&:bU•K%m^7ÿ¯å#ðÿ“^ÿÉÿ¯ôšÝÖfãÿ7Û­`öؤê.KÚqò.œÆ_ÝLÙÈ ð'P%â>Ç-XSÌîîjâ$72´êâwö–t]uá­Ò€²( ‚t¦ŠVM:Ï{in¥Æ}õê•KB$»¡¶<înõ­áŸd>b ÊWùÜ%¸Sà;JÛeáfôÅ']ôPW?<áÿ ÔçûHhØÓ§cÁâÜ»wÏ1¶ Y<€Fü‰:€a¼öKÉÿÑ[³Éžhù þI»ú v¤é¢#bhSP*¼‰ ™’º«}‚v6H>]”˜ zœ| ÉQpæßլÒðƒV'È$)ÀU‹¨%Ÿ‹§˜=}à$u'×Ã^ñ›-€ u³e© ý oT/‹¯ÍÀúúº3\ÀÉZÚ@5 Îz…rat•$—»º$”)5É\à<™8þä1¢Œèþýû:ƒ™wîX\†ÆŽ ž{ƒå(P™*3]NA_rµK%•›…ÿ—{Ý‚8ÿÂÿ½A_t†¤Ô`®,}xD2‰DØõ§(á²È˜çAx#ƒU÷BÚÛÛcS“““¢ÆÚ¹Ø%ÑInÙ4:’°È£üé è9ï"´/ï?¯‰v°i<ÿã?ò wC y0!>t«`—üÚs¾5‡èru)ø_“ ±Å€üI-ëŽ,¾õkóú²“†ý¢ Ÿ)~xÂÿŸ‚ÿ¥Äb£h”+ŠB2“ì¹ÈÚYN Éã²hM~ü_5ÁÑÿ`†ˆÑŒ Q§†£ÿì-fC¦Mô‰É…óÝ­˜An\K1(0šå1Ù+Ðv4È™{,)¤äEè6­’@œÉ•PÏjKKKátP ‘ÞícPlh™9ˆ¹93è\ò—¿ü…·Àå”&‰ qVýáäW_IéÑIÐ72›|@.‹è!ñ6¹0>;ʈð´11ž Hñ›ÅV‚õÉ Ûx‚šmŠÚXGô–·ÀI¼ÿžs‹° ‘ ÉÇÈY¥®?9Ù¥’Ê׉ÿ§ît†þ¿¤“   h 4”‡äû £aˆbp&É¢˜‚gha ’NBÇv$Wá-´M€B*í#uÁNíYY¤ÛYHÑ,‘núèÑ#ô{6)¢}y4(m]¢8u8IBM„Qà 턈þíßþM®IBt\c²ð×»,•"_j1( KÞ_PþeFX+[óº:èŽd´õq¦J<9R Ч”l…&\ÛzC]tÃäYÆä³ÍÅÅEÉsóáÇ8Cjöñ^Óš…Z Î0/GÞ¼yCB†IÄx!Ÿ‚›è¸Ü†¬„ˆ9›â¯-jtÍ{„Õ•BKÈ'™¤Lóàâô°\ˆ>s#cgÅE 9™´ÿáÕF\ë]eSÚÙÊÖ8Ã;Nºá?Ü…Cc7¢e€7BѱøM¥ Öf,îŽiOQƒRI›×MÄÿ+yoùð? uˆ®ûãB 9¸HBj;µyt#ÒP±âÖFæ²× POª[à€ö9jG’î†Ü‹Iýøh@ÁÐÉÈ•žÂj(]=$ÙÄ@ÀA |ËíW¡H¢ˆ¹Ä\¨‰Îã''•¼ÝHÏ‚oÿs*¸QbJÁqwãSÖ4º/îèÆ _Pþï.¢ò_©H)5¯þ— _|·'¡Ù¹ç¢â1ñ¼LÑÐÉ=Öª{<}Aù¿ç5vU¦ ¼ENñâpÒøÐ=°$TÇ`£´é2qqE­ ½Uó©ç"T,—ä`6Kª£Ö(ñѹÅß²ÈæGb¾,<,[渤Ñí$pÓ™[¹û¶Â±³¾‡ÙQ}¬ÖÁRnzöG“ƒËkµšÛK¶ RÓ*‹Ô£2Át©îëfåJ¡tùMË0Õ£.„aþ5šgänþ(‰[*©$üsñÿÁÑIøŒˆ‚€ZRJ W/JÉ(ßÓ“êS(!¨?%$á%¤*Ò ›€_é—$“]—íûtÀÍx"g+ƒ‚ ¹ú’Æ<ì±:;Œc úÔ`0õ1꣑é²`’zš!‘b†­@ ²}º‰‘Ö.ÿk‡ÒöñàÁ0SüӈǞₑÂuJ AxÉgý¹ã‡'üúÀ6÷ïßw"0ï@>\K·þãñÑÎÈ@p#ùþˆøà¦\¢_ÿ¶éOôSáÅôŠáäúúz¨øj9ÞÃI½V ¤#Z'NAvàjDŽ¥òÍç¯ÿãF‚(Ü}dÓõ‡O-9¬@p)Êá ¦Î÷Ya?)€hË„ŸR2ë€ÿQGñ?…Ǭ5Bªójt^ \UP/,0v^h…ÜÎõvó@C‹ ÅÔMp®K<’óYtÃ/¬¦çPnŠ/õÁÈ­DáèEˆ"»¦Hbï\ƒÓýª÷ÑÅ8~ %|Q–g΀¯ štª®@gUÎW0$?¯©Ðª–ˆÞ¥gΚ)1ŠØ7)M"*T£d+ÿõHžEü ¯1ý$†Âs´yŠ2VŽ<û8(zmDÃÔTè;š@׃xn- Z4ùt±ŸxX)K* ÿg·ž OBkµQÙé¼*aÿr?ËÁ‹^xÂìín„°>èd·'DkFæs¿)v$­»»»ny‰åcó¹_ÃB‚,í¹DR$ÚxÜŽˆ.KþïætB<·{}vØY97¦º²ÕˆþȆM‚DM H\¶™Ê—•ÿ?xð€~’íOMM‘¸yþ£0´*üðòúõëÿ÷g|g:®fÞ¤Js‹×;k@O¥`Ö,‚‹Uv A&ß¾˜GÒ …úí?Ñr&Ê´¨Zž—9Êœ(c˜H«+ǾwüÓ=­x\«Õ”ÆQùe¤=qT,r‡úìÃÈ÷hV3&ïfTÕqEÉ.éV±$èW£¥²- >u42yÍÔx© ³€Æ=¿ ]<4Xñ¿œ W@¸¾@ÝóhW ٭Ǫ!G«(€h­êBò:O4ÚaÙ%zâ‹“¢H”¥Ž}{ùòeÄïD¦\©¤ò âÿ•As-ôVwºùoÇÿ±W{Â/ýÞ?ë ÿïÆ&¾ÿÞ:~\ß_üÓO ! ¸‘:x$ ×ÕÏ‘˜®ë£Œ0?E~^… 7HÚàêc>>š@“GÏôåÿnÍKÊ<;;{‰öMD;,=)dFéâÕð_©1ËOf¢Xß©|qü¿¹¹©´J´ä™œœÄÃø;G@¯¥Û_F^DòÊ’"IØ.Ê ¼äYÈ#ÑnôâBÐCbfzIJsÊ?¹ÚÙld]ãtƒïµÛjªWJø¥«$8zõê•SQ'¡t"ðÛ–E=ôœà¢P‹ˆG]â åG–CkÝWmʉ@¦b¶äCGƒgKT42刜‘=a†‘jž^Å΋Å@ç« GÅLò÷”гZÉ/Ø+=Gqy(‚ÖÁô›Õ¬š/^¼ð ¯-— 6Ë´n ¥üy‚ó'=ñÈp œÚ~Yô^ˆ]JÊRIø?›¸ýs£ö·F Tf¶áq«ý ø¿ÓyÞé¿ Ÿ'íÖZË“m1Zö_j]YÜΰ-«ND›µ‡LåËÊÿ=\ ¡ˆ‘GsÒóý¨Ì Z»IRãȨÃ)^ÕÑž •¯ž3Ë.»  Xïå®Ã>’nx>5 Sg‡—~dß‚™šó)”­š¤ín@¢ñrNئà1ÚÔê¾BÄãÜÝx£gÏž¹>‚šÑ¸\ô„ùA ¸Êmü¦JÙMšÇRƒ‘ÜÓbÓõ …ûÐ% UÏ‘!U«¦bKŠŒ€Ç;bãÌ×ãK½“Îèy‘)“ @}…•Û±KŠzäo/hºœTþ¿¶ø?ûײ¹‰ìÞýl|2›œÍ¦¦³ÙÙlf6›[Ì&f³¥ï²iœ™ÌîÝÍÆ&ý$Ýð·û:ç9¢ÊÕE—kŒá"kF–Àþrþnu §H$šÃ!s';UG¬[?ÿËçZQaÏWʸ«¼y¡ç¸2ý nA€Ä˜?ñ}Sš¡”ü÷:àgÌå"Já*W”‚ü_Ìø_né4Z¾z§‰5¨Å (’ J¨Dã”Z÷£Q4GÂŒ)ðy݈¨oJŸë……:ŽMLLø>‚žóîºD¾¨ ¼ÌŽÍÍÍQ“«÷fWÁGèññq`"ãßø“Oó¿(l5›rŽ^l]$¯æ­e9r\øVjƒh%»#¶Æ(’ ù2öGAªe®IÎN Ø]ž5á‘/Xbh)80Õ=Bû¨ìØ+E"íìŽOYg¨sYÄ(½¥¨¾©¦ïa¨mYZJ¨B] Ÿ‹‹vÉÌÆÆF•\¤’Ê7ŠÿÇoÿ|øîçãÚþ ¼xS«õÂz³½Òiƒ†¾jöŸ½®½ÉÃÓÃü¹ƒ·olâø°ÎÖ’ö:ò¿¶P‡ýÅøLù ¹ïßÄxh‘…;U¹É¥/ƒË’ÿ‡¡²$ùç?Zÿj#c¸lÝÚí®¯ }1;g$$”²~ggÇèלÊç–ÿK^E˜‘€T>­—b-à …?+e“ò 333œFfæx#øêqøb{° œ{O·?‹nð*á[ºÆËß“/)€¥Çÿtž:Š?5³ÒQª2ùÛ¢BÕdųkÉÊEéWDs$îà*ªf'ŒòÏSN.£ÅÊ;k\Þí0tI`VÊpZ-ÂQ{`=—0(ŸO*._$¨×œÓÜ{%£ ¯Œ:KKK \U-¹·ó)‡##9Ž•W‚AqùôÝS›7Å]øÒU™ ÎüÈ AÎázäX1w:´99a¥’ðÿoǵw!,o½:lvÁ×­½_>8¨µ _«ïj/Z­åfýE»‘Ý:‘ÿ‡Q~CrR@ËkŽü£­ùŸ»£Ö(æM)Ü:9ºu; f/qYø_Ò§ˆÈŸÿ¹ú†E¯aOáz5K‘‚>¥±ˆ²yI^×ÿGøÇ¹u´ðYhl¡ñ¼t WS¢{‘y>DQ§(l)@xt†i Ø0™áâ€òþýû´0?‡n82§ üìì,À¡ €3Ûòõ§IŒRÐRu´)ÊšlÜ 3á²)sÃ%Ü¿ŒS'eýô94\ÞœuØ– /:ƒK”·…]BMt[o7êÿðÃ@¤Ú‚§£ûÀYã¢ÐßBÂÎ…aMbâî¸Ð³¢»\]ã»ï¾Ã@Ë™[Y‹œBuIðÉw2…«ðÄñ« ®äÿ2??N> Cãe±lÖ©Ÿ7YI?¸l»‰¬Õ¨C©~¤ ¥M¦Wì˜R J!|5i˜ _ð¬Àq’,¥@©$üÿrÐùÛ»lj&»u'›Ì&¦²»  GÙ­ò3=ŸÍÌ>9ÞRâÿz½'\Q‡ñô®'þw‰Üç0URH盈üÃiËOÒLQfbƒËÂÿ .¡ÈŸÒm$ÞÞSYuÐ[uþŠ.ø¦W£m‡Óùw¸& ùeñ¿݇a”{׃cÀ@¹+~Tñ À’Wÿ‡¢QÑ­7aìˆÆ£ŠÎÑi øU\€¤%._=‹n(i—†¯¸^Œ éÝ# Æ×_vº ì†Lq‚e“†Tè-¶à‘ü•–5òIj„êÅ™ÅRaÄ0ÊãÆˆ—ÀÀ¼…,vˆ*ãÍ*ø’û pZFŽ ™’1’›á^ÔCa>SN¶4ž*eww—ÃÁ…e!ðÒGX«ºÇ›g˜µ<Ô[…*âp´ÎÑ,ZÃ%n…?=L(Y\\Ô£G·ÅÓ¡¦æ<․6«âyº¥QÉ%G ^O““ª‡‘¯D*©|›øÿy·¹Þnec·²;@øÙí PϬ¤LLŒÏðϵNãe·v€ÍSÛ(§' f@ÂW TkffF~:nMú쉀@Î;2eô­“¤©ªÁŒp¬‡†‹ö©èÅWeš‹xÃL÷!’¾’¨¤„Ü/ÎmJ}»tÿ¸(€³ü)dµèýÇ™:”3Ò¶ƒ2ËÀU#ú°¥²’¦Á¹Ü)˜É¨g>ú¨¢Ç`âÉ èep-÷)öœÓBËü(ò¹Ç™_L‹D@BϺZp;ŠÈ„ú|ÁW÷Ùè• §­²åšê6¾pð•(–ÊÀû‡º‰@]ûÆ©ã›ë™¹"MM ª©Ne Ä'u=¸Ý˜'”6’¸‚8(€¿_ï2ÓçñZ 2\Ëc¬^ŠèYYSú!ü5eòžç¼†æa"Ȧ1ü#fž¦JÂuoÞ¼¢#]Ekð¤ÛRJnþ'~æ^”(]­ýU,d|¢³1Í€Ü(ðRË&J¤Æw³ø%V ‰ÿÕ[m²lP­q68¥RÊëÙiyœC—DÞÅñÉ£¼:.]pëí!þàíîFàP ê…Š’*êÕ«úۂ€ŒË‰ B캑‡D±XÍ…yúxÑ ÌY•{(lïkʶÐE»nÊšò] ”Fá©qÆ#°PïhÔøcǧ"›zpžÄ}«É©#}z‚G†]ì¬þS–%¯É‘ú `zv—B¹…²Ð,­Êõpµx`=]~ë+-þø03ø^ZZúC½ ^%<>Šþð”9·x4¾ÀإĚ@ýÉ'BQ³Çÿä­¢< r}J”GI1N5uXœåÓ"œ†Ì?jr¤TP뇖iÀ÷”Fõ¨§ã‚€P ‹o"y´©8«˜¾8xYdpBŸ2]åÞ¸[[[´ÿ f à oÐYö?xÖ’Õh6ÔŒg0pb`W}J—DÁ—( oÇâãâ"¡û€Â]žoÿƒÉ'‘’DŸeÿ£õ,"/[|³)¾Q(=ðçŸþô'^å2¥*]ò<žìÓYãâ[#W_´£×MìŸugÙGá —=¹?^øðáC¶ƒðÄÑ=LØ9>`Š0ÃŒaE¿rú#A8žSI囯ÿÙÄxÿÇ ü?†oü›¾=Yü91îøŸ"VÒÒ ß/@`¥%”©!IÎ@áOj$YÁí-}?ŠÀÄ>ªƒÖh½CkRÊrq@+Ç`æ¼d¦,vÒöA1K°èm>]F‘¦q ¤$”Éð<åB"ª£!›U{è6ÑQÔ©¨€%À I{ˆ9áRîY±. ¢Œ¢|„¡/P(×ÇËíussSÀõSì[о‚W_ÌîZ FlŹհu.nòSɵР‘tdQ\t—’ågí¿Dþxâ2––üÇÙt ØWºÉðüu¥<­|…çæG.!Œ/r)¡$f#ÿ™B|zÑJvm&ƒ‘JjQ/Kx“Ñ&%—Pz‹‘!vÏ/ôÞ>®^BJ%õ7‚t•»‰uåS©9üñy £ªÿ¯â ©?œ.%M`o}Þ$ýVŠ+ߌ<”Mdû'}®Ç"¿f×XiÆÎòÿÕ’fP1‘ªrÔ_݇÷,ºä Ñ¢×ð¬q)n³Ûdz}|K{–´›r)d“r=«Aî¹ ¯­±øØy/ Íü§ê<'¤šÊ·ŒÿOìJü ø?Ë 9ÏØÓøølrPìžu¼ž`ÉI!e¾Hñ8^Xðì êh8Ÿ9Ó±K\ƘVúDi6ÁGô2 n᎜ÓѲ÷•Ž›м‰ÄD\ŒN›ƒ†Ó®»J†.›Ríà/¤cò:IY  §eÁƒŒ3eµN îÎ ¸×ââ"~%ØÓÁšÜ+#ëqê Å%#òt€ßÚ…™_’3é>¿â›<5¤`ÕÓUÅ®Š?ªÈ´À³Éî ëÐáíµ¢Œóž»G^f|âX]gõ?ÚÐÑ&¯=+ΞnêÃäs÷š‚ž,IŠŠ»¿Ê¢ù$fÐÛ}ÎsÃ`û¨9ÝK鿆sŠñèy£"n‚zˆ”ZÓ¥÷šûÊý +MdÁé¿àMÒ§CDŠ  ¿ó |g?„¢¸˜Z²TÒr*C®Ø[ó/šÀ:¤E|:|ƒÐ7œØSgΊÿAeáÒ³8t7ûä’à|*p/{·{÷u82þ§è€,a<\g5þg¤ÔPèÚ0´¥/­?>’&[©³è’Þ5UÐûxָĀˆTJÎFܹ&z¿´ hŽå©993¾éD>&\ΧD )ðÈh¡tþ<§’Ê7ŒÿÛ1þ¿UèyïdÙìØDñçøøZ§Äÿ㓽pHà\qÚøáBtÃWpSéy†{¨»óøåÁ\º"ŠD1ìÈ(j~ ñ*“#@,‰ÆÛ·oÙ²©ÎÂí‘ÔQmVç…@àb‚Îâ#x‰|feQO£S%JZRBÝš:yŸ‘š±q÷ÚdfìòC‘ô¥¥%êÁ©B¥’… mnÁñahÂîU÷±åÍ›7’k} ¾¢åíf£Ô3¾±Ÿ íSŽˆ8'¨×ˆxïpF¾ üD>…Šu±ÃÂzîÜiáÞ1_e¼Ñ$looŸƒÿ=;ÕH"—‡‘KOzfXÉ™µ–Üxûê£úÿËî;> =’éq£}A)±ä¡ò'¾DÑ\´h%Š „Ùñ¤¯aÏ™H(ë|:/œ_MÐæÙ²ô–Ìÿ…6yùA³qÉ„ù>F|½¸uæêÒ{­Ê£G£ªyÍ¢hnÏÊÿ¥ öžYÀÉ—†ïÚ|vžB÷,º$U©r²óTªŽ‹%ç)42wÚsyþ¬ühR.àAæ]$ÉÁˆ"ÖÞCmDP¤~ª:Ï©¤ò-ãÿµNaÛ3^$#þ/ÃÁ ÿOŒÿ¯ç­ìö4^Ô^ÿd×ð£Eè£GˆÛnCÅJùÁƒ4ŸÖZí×’ë*bà0ÌJ©\ᔎRM †B&4NÜdäÃv_çææfggIÖД6†3ìvxo‡ ×VNuβ#B;47’´¦ˆŽw¡†"T"¼Éõ 2§kÏ+[°˜6qä B¸Ï§NÄ_²;Ò0ø£J„Ì%úØžóª¾ÇäT‚HÌ Œ#íƒlo8"=qVÿ}÷j’´­š/ƒ?E; þtˆ+€!Ÿq¼&ÏŸ?w6ík•ÿûêrp糊`8VéO±Ö33§]æ ÒÇEèÅÑ—l-µà* €òUјMQåÅ–†Ó®ñ”Üò špJê’0´ˆÓ¯çˆRݱÚ3í Jæìö'Q,V"ÉÕ  Xº×'½‰b÷Ü)XŒž HDäŠÅ.qÓÑ‚µ!aegRØùœº[“‡Á—1î‡(Nµ¯Rra(r¢60¢„þÔ|JÏ¢KUú©µqθ\kÉ•io£¸Ž•wwÆD¹y©ö4ɺ‘³¥®"!çÎJç;ržSIå[Æÿk§ñÿ-Ãÿs·~ÇÿÏ{­l|º3”ÿƒÔH1Çwxž¢ ר ½xHvÖa&)‰ (XˆŒIØ”øzf‰Š`§ =ºŽ§^Rg´ÍQš'š9ÒoWûÕÖ,uâ"}¢–UÔ*?b‰}"I Ç儎"/vL¶0QT·*á ä,]X2,w¿h³pãÝ”;;öQÑûÏ‚îôÔþý…K,Ñ”ë_‚Ùýj€>~ ™±§’w©Ôʳ#E¦š/#zÐU±l%Ã#_)á‘âu|Ý$4Š-ïA<ªÅ¸ÜP?ZÏš´(uE¾ØÑ ž ¥¼ž!DDd\ÈqÒ‰ˆ¶È\$T’¤(\§/l=Ÿùs6'qj\¿üÝ$8*KÔš²;ÕÕÊÞ\—÷r2%ã@Y­«r$…»•ÂrJœé€Ü°JT]7U¸<ù7)·rUiâ3Ëï+Ú $FðiKëÈIà’ЫtÉ׆ºêŒUu\®üˆ­?)7ÄÒ¼ÉúKo¥X¹¸µ¿ìZ#¥•̺"·ŽH¢uÖ<§’Ê·*ÿoøÿöDÿ¿ÿöÿ·ðߨñÉâ~ãëziÿ3“÷‘gÿ¹‡èƒò­«r&% c.Û‰˜ÜáËGA#RoøKí—h7”í%!=ÝL@Ö€Õ¸ÕpCPu,ºtVQ¬S³ÈÈVjVf’Ų™™™!͌쓽‡Qœ7µp1úÆž0ªO¤àv¾ÀgFN¯œmôüñ#¶èÂÁ™«† ‘ÿ¯Çÿ”½M¤Ñp2‡OÇíó‡àOÁÜ…J¾Œ(d–¿Ôž„Ó&¾ahýî—PßýU_i’6œƒÿܾ}[qÀèïã1¾\> à38pó!Nµ¢°ºŠ¢D^Ïì‘c8³IÒWޏ¹¸¹«Dõ,´†EÆGJ!ªª·`6çê¡Ì«¼Ï¥.ˆpyÉØËJ_ÎþN|Âi¯[5Eƒè!*’/ôäÝQÎ2O»æ„N#,tŽ@$Z=Tƒ„‹ž2 0EŸÖ ÈZ†d”'Djß`)?¤)Ð0}Iº‰cݰEæñ±WSQGyœµÈåÿ«ù—C¾!RpÆó¼Œá5‡Š~à\*©|•øÿÙAm7„¼yõ:ïRl6—ßí­îm÷ kµ—­úÆñá›úQv;»þ—hšbùH‚ÿ+ÀWxŽ‘ Ï}Ö¤düLÉ€ªúÙ³æ3áÿ‹‰”£Xv¾2©:¿2«ïíím¹¨(àyMèbÁ‘¾büïHLáÅÞ¿ÏhÀRÑ0˜¾<Ê(Äšàh1HÛ9+Öº®\«"i5z*u”Šw$ ãââªBJ´ŽæšudXå)k%èæ¯¸Ð™Ö0ô‰B KQ+Kr°M SW›FdÙ-?eÂ$"Œ pª€ZŠÏ/˜-Çœ†Iç%FF5ö6ŠèNÛÃÐ/;ÒVˆ‹” Þµ‚åhЙ—0TѪ3胖½ôé쬢íõ»ÀÿûÇGpÓmÇee"J3ÕèפD&ŽÚ×$,b” ·›½¬2Ò?ëœùLøÿÂø_Ú( E5¥’³]¥×'ÃCEwŒLX/–ù+Æÿ|ˆ 8,ÚeÕëxš?b{Ya¹R.´ÿ§¨özNr)zò/7Ô§­¦‚s+×®±(`Žü.y^¾TátÎAÇ¢‘;­K{PsnnNšÔ=ºÓÊû5J8ÌJÄ£. ·K•,>BªRg¥±6„¨%§Ûš;¬…ÓB{Wqêdh$¯ÛÈÚP¬ ƒW³w ÃÀ¡riA—dð㌆™óeÚø+s"ø–z§,ÎÓ)R+;&«~Q?ùs¤|âô“MX.•T¾Vü?þÓÙÌD¶t?›œÌ&g³‰éìÎt65Ý]Ȧ§³‡KÙÔD69žÍMgãYþñòÿHÐä6„Z¾žÎ8ޫȃ)RŒ^ºžôü¸‘Ñ|&ü±Âˆîè¹KöüQºÎ˜ŒFÆ·oßp—ǽD‹_w °ZW. ¦S?S9,--á5‰2h+ñ¨\ªÅ&`=𵚚šøa J¹#C^[£Ð(‰ ÝU Žð0åùŽØ=ØB0 ¹¯L)…Åk0\•gÐÃX Ê,J7—öÈÔJOP4M=‘FÀ#ÿ€ SM´ðÝwß—%"žj0 !¥E¹B///‹p®ô½_«¼óSâÄÒçÁù)^ŽQ¸k‰»Ê:7§ÓsÕi]_ ¶B!¼O(J凌 C¸ÍÍÍ`ÎáH5˜J*ß&þzTûù¸¶›^õÃZ½ùjVíÕ¼»Yž\iï„|³qx1üObâžAnK/±Ë5´ÿ‰“ƒ%——¼1Šr)å¬ü,gÍgÂÿ+J¬¦‡+³[í˜dìïÿò/ÿr¹ú³ŠÜNG® Mòõ4>ÿ‚ëŠõÁ1))¹ROOOÓ칪nÔI¢ ÆéÒ«ú?*hصµ‹r&"ÅÁíÛ·…½ÃiI2Çè:ò5Ì'ÌšÓ¢ù$OªÐ‚èZ·Š º°° x×çîÝ»lE×ÒŸBΛÔàð*êh¦EV=DeŒˆá¦54r>”¼]„ì¾ÐmšÖ+¦0ÑŠ8‡óîZ!˜ ܽe"iùŒWY ÇùsssQ0g](ÖɃ9ká³DûÔ3‹_™&!:Ö3hàOœ§²Ä Ç|:ž4,s0?èdÿŸJ*_+þ_Ï›¡ÿ´q¼ÑÏŸþünw+„güLJk!üߛ렿ËÇ{k‡ïïþôc3ôŸ6t!i¢9îµ}”Þ·HH5RÄtY pd~öóç3áÿ-Ä .fв¯hVñ_AÈMñza*i’”ÀTkò«Ê}Ժ¯ÊîÊ4r¨T)P8Ä`ŒÁ%¼àBõ˜|Gø¨FP-¼t ©Cý“çËH}¦™ÓKñ ¡0?ãš2› eÎt©æ|šú•™æë"Sóóóx^J ÆØûÌWîü&|rrÒsW¢£2ЩšuO z1 {âb\ÏL(T‚(ŰÞ±9Ê¥HV‚­E–B´#gá6TRé$yL~‹t0€›sCUÐN[²0 jM¨à˜\82’¿xL£Ç=#YÃÎ6[GÀ¬=žÐ$X"4E>K1aT¤TRIåëÀÿÏ»ÍgƒîÓVóyžêo Â67ÜË—CÇÿ¹÷ºP ôšÙÄXçBö?«««a ¡êk¦Àk×Ö˜›>§Ni?ì—%|ž`,"ÔÜ.IêϚτÿ/V¢­6Š+JËÆŠ¹‚θ¯0’Ç3¡cã·à‘w1ù?­A~øá® P)‰ª„‹µ¨wM©‚pRéhUP92w¿V% ±N™°²„{â g ˜ …s‚càmŠôyƆ¡ íë€Ô*e,}ízÝÈh3²Ž=zDŠÊo@q\ÆD¢ò;wî°e_Q®Iô„vS”8OôSW 3öŽ|~Ulù#¼ûrPhÕQ8"r@Êð.;+éAÈk0; ø7ù£“8#ÏÃHFUù(É 9Pg¼}n˜¨(;Qás;Ày>+—b*©¤òuàÿ•æÑ¯­ãÍ~>Øßá·ãÆoÍÖÓAÿiÿè´VBxš·×÷·:ÍìÎíöÇãÆØ—A}Ù'AŸ)„Î¥ÈcAu=L„¢…£ÿãe‰ò|z‘mm°|Otš9Ÿ ÿ_¬`wÞKÛªP “¨'~eòvÅÊ–Y5Ï ø&žð¿Ïß ¾&ÿÄH2½ ”[1ÿ•j\´)Â¥,—ì9U–AK¸Ôx¿—UdF6–˜18yüROÅ9Á$`Æ@[pÕí²È.…žÎî«K R}§)øí‹ÓšS*Î?q ´ì’ÌcÙã<¸ØOÜšO„}Púl6K›r N·­T»0nMû.$i$ñf5ÙØPŠÎc* Ð&N²ÿ8fM1éº;Fjø•–Nê­Z¦-ûÉå†YHØ5«·^l]döï9Ñ8ùôÿå’v"¦ Ôæ†¹ãÃ0: Óâ(=ÍuÖΧ’JÂÿŸ"ÿ_îµWònùé­äý'½þã~ÿ×P|~tŸôÛÏ{­æq6}§YÞH²/EvˆËˆd"!ƒö (dÕ¬\ð‘ôÕ±n8Ÿ×ýÈ´õÈ2ßOjŸrç5ïðÔÂízÂøe6ô¼š]1Üä`å±C%65¥pnø!ócꦙ,X٪ٯþ?§á Q$GŽ-A‚ÐÚÇæ¡]½k¬"<ù!ùþHœµˆÒ*Ž(Éàç[„RyXÔhàçЇ(+e´Å|ˆ4@[êÅÚù"r³êóJ¯g* ÿ_Kü_€ÿåÿÿ6øü3ôÿJüŸw6šõlzª…kÃ@B‰)€‡1@Êpdêr¦D¡_Õýû÷ñ§d/·Ê‚6=Ð .ì”%Ï.PÂU.ŠMr¤ýáÝqžn\=r©Šë årEöDÑ3è6Å".À èææ¶úÜ…q^b®jh>)sYd›Šã?ÿùÏ‘£™þ”f–—»Wr/á´sЇöú„ÿþ¿‰àßp¸P‚E™¬Ë|aaÄücóPÉ.=mIÇ3õÎW±i8$ÅŠ–ï«%òด‚ÎGAÁõpr\¼ó‡Ê_Eö ùõUþØv¾T9ÿy¥’JÂÿ×ÿ·—{ÿ'øÿq?üsä‚ÿ†øªÀÿƒÒ¸š/500Hè-Ð5çã'b`jHÃéÜ®W%åW5ý)_ª`.{ G@`Om,¾Ù2îN~AÑ*h"²>u7.·e®ˆ¢.“7áUàÖÖÖx^fŸ¯^½bP ÙOjëaϹDZ‡ö$ÝÜyRáJÔ²³0tÖ“§~å´kP´O öÿŠÍBn4NÃS¦€á”(&ùÂÿ7·(ç,Áð§ø)Ðw€Tć|ÄÇæ¡`ð¢9¼ç‹‰wÎÐ5NÑ{$çÞ!þMõ8ä³,îp^"îó'!Òê²(±ÂÈú.½‘ÁǶó¥Ê9Ï+•Tþ¿&øÿEGÂÇÿ¡ÄÿøôºÂÿòÿ€„Ò:`œgP€û÷ï»™àz°$Š»BLz.HÎB©jòåýÊhº»4 ÊØÅËêÁ­DieÈhà$z¨Û)I=CaáE;dv¢ÌPä>hÃþc8t/ -® áyü9>>ÆŠýÇíè„H‡.î@§•8IöA¶š’]pÓqÖS5¼RÂÿ ÿ߸"ˆî).æZ¥86Q¾àÍCArJ’i$Á_È@èü—Ë*iÉɰ ™9|'G'=ųgÏ8Þ Êz0²ø¦öÄ™2sæÇstv¾Z}^é M%áÿë†ÿW»=|Jü"üÿ¤ß]Ï;/¿ã}Æp\î$%$La…{Ò…¡¸; žìÑÕ@åÈ÷j¯Ṙ¡ann·v§6µéÑ•u’fKTˆÝð¤N‘¾‡§Ž’±¢K3eѯè-çdaaôY›#9Þ}fàT¦’Êüü<3cúXè Æ“TX°0¼ #K(„5Ãåa_ðÄÁ §ýá¦|÷î]7ЊJø?áÿWèœåb𠃮‘¸W?}x aT²!àP¤•p¸þ‡¦D²uÑÛê;‚ÌK”Þ÷×áHEåÒ œ3ÕNÒó|ëŸX%üº@;_ªœó¼RI%áÿë€ÿ7ÚEª¯µno­Ó_í†Ñø¿›¿l4³ÉéîàDþ¥}GËÀ¨” 2ÏNæ+‰rJFr*7L}õê•0|¿{÷Ž}ÆÆ!ªŽf#m,Å õ²ÈÉ×¼ 8÷þ° )9öº0‡º×(ðN¢šö2üéƒÒù(u¬¡8NÉÂD=Ÿ?®dêã¹8©­P¦È Ã,öÞ²*á´³ŠGðpCß„ÿþ¿qEK”óÍ›7¤ÛÎYv/ÈCÁž(ÂC8m*ƒwMÖ;çK-¤¢%éFÜI9\jøµ¨Tí hrq1Øÿð1±t)bkkKû×ÚùRå¬ç•J* ÿ_üOðOü¿ÒþŽÿ7ëÍìÎ þ”%ÍdïÓÓÓœîïï.c«ž0wssS{–Lz\¤ÍÂwiþªûò€'å±1 @Ú˜Šï¿ÿ^!µárïÌý-œÎYã{ßÛ·o=†(³GÒqËÎÕÖè2 øN¡˜„~S|(©aN4cdš.]öµâ4Mµ7±l ÿ'üCYQE¹¿@;#ý^?6…‡Sðj*‹‹‹333þœ†]JYë þŠŸ"?)·,#@Ä>(¾=·ÏÊ*Q¿× f}Në”ðWiwS~ŸH¢â¹ìƒX>dO´9F[!þt)`©úF/T¬ä9,´ ÔhxvË»^eÜæ›ŽÓ0Kô¡ c‰RþOøÿ‘G/-Ý ÌÛYq/ÃÇç¡ a$³ ëUR³ ¿óóó$æç»ÐÊÖ(JÔ¥ˆÜk.WÈ|VTØïôüüç"âÿ‡ª תx^¶mçË.Å‘Ï+•Tþ¿.öÿíÆ³ngµÓYkçå§÷¬Ó[îö~iµ·Cøë~mcÐÛî¶·Ž²±‰þà‚óP eN縶ÏQô¿êÀn;‹q¹þMÔqhrHKϙτÓ.Vð@çææÀ`AFÚ+ùWò_KëꚉH¯Þ¾}‹åMñ •Y&!|TŽeþ¢V7Xv]¹&á ®â]hàqNF yY‚yKÑkÌ™ë0Ô“¢e€yÆXþB)ºÂÐÿ‹þS ¹à‘Ð|Í0xšÈ8‡†“ÙIT| þª|p8ƈx,Êà!˜ê—ÑM9Ly·¡,--á[r0ϷŨºŠâôO Ýàã@ãL7©qžþ€ê¸ù“’oµ=ïÎ'®çî‘´93”tá¦|é8éÇX›½eÿ9.¹¤9 ƒšþQ“‰Ï”KèÁƒŒûÍ„tâ“ üh×›ó}QÖo^('Dù!¢K  ¡Ì€|‚Š[ÈùÁpÇ/•T¾&ü¿Ùë¬òýþF¯¿™‡^xÑ ëýð<„ÿ¹³½³ÖñóÃClccÝü"@tÌ;Q0j‰M®'¸BÏA¥³PW)Š'¡h–årCOˆš¡eW»ÿá|&œö±ÏWA¨Â(IÂÿi]Ý B¤Ç©#6cþ_À6`7¡d 1?<‚:‚yE`À1“ž°2q»èöþþ>[8ËN†w¤Ê€”ŠØÕa0Pˆ§R(⾨ @èv/ q,vVâxÅX£Ñ¾È#G­_Ci·‰ÉÁí€úÀ"ñF‹‹‹â&ijpùa~¤à&øtLÈÜ.èÅIÑjÑúŽáOvÀ”²1;⿼ny…‰õ°® »‡HK*uC‰†¥a§6•1Ÿì†,G«ø“˜ö„NjœCÅýà7fOV|Ä_þò|ó)ƒÐGgð§p8õa˜L †à6Hdgð+1?ùþûïÓ/ŒŠd±$©¤òÕàÿæJ!€ºÏ;=|Ö:ý•¼¿Âÿzý ”ôŸû»Ëïw÷ó||f&ï]ÿàí«ÆW'ñ!®¾¶ÉA'¥û“#³ï)’>],Èö9EÌ(9; QÒÈùL8íbE;;g8"õ ÿ§uuƒ ÅõÁrcQrŒ';üÉ ºiÝAy,Ö¿Ì'€‹pÕ‹/TMJ<Ts£÷³âd†¡&ðhk>P­lÆ_ÙC6èBWþIlOaÂHn¬BžÎ¼!;tT0w:–‰ÔXY¼"š&PãŒáF²’X˜l‘"3ãO´£Ž:#{Ù™ðFè† È€èŒS­”î MFÌ[ÚN–Z8ÃÊJ(錆ãHž6T|džës°¨ÉnPà/ƇíÓæGˆš3‰«ŒÂg‡_Ñ21ÇÅç¾°°à-Gî*äÃé˜l*hJ /D.ˆê•B”-3(îŇ"šÏ¡i|Rdˆ!„3ÀøÞ‰¼¤ò•áÿnëY¿³ÖËŸçùz·ÏóîàYoðŸµÚJ?_îv¶Ã`»Û~ þ}lìø?Ú @c=P$оæÏ4rO“øcüygÂé°¢ Y²ŒœÏ„Ó.Ì™bÇÄF\ÍFšðZW7±ÈäÆA‘å% ÃÔ±45ÍqŸ#…w lßU <éóPÆQ¾Q'þúîÝ;ò׺ã6ëŒâ0ð$M+½ó›››á´žUæp8¢w%Žw61¼#§"Š¥€úJ.FEød÷@~u†³áñd33rƒÃ¯À®Î11I–Óö`6'Ø}(ŒªîG‚¦£±YqŠͱ£|ëmÂ1»êÊzdËMÛbœ‡‘áµ£KÙâÂPª_ ^êfc|¸ ŠÆì R#Cœ––ÜtQ¯¡±{èA¹GFóÀ]Ð+v€c—'‘—T¾&ü¿Þn,ç-¹¯vrúÿ¾ … X€'ƒµ£¼Ã¶ÿáŽà.´’« lmmUãØ\Ÿ"Â(È|^ú•Ûâ¥SqIrd;>Nû”„Ï9ÄmÓ ÿ§uuƒŠÂ” á0©¢â°y:EVãO<¦S@K- cdQL îÒu´vND yq²‘ÃãXÊÙJ–*΀¨óba¤ˆ0¶ò¸²C˜Ö—–‡Y¬¥ÆDA¤ÙúÆñ#âwt-ªC£©÷ʉ6ÎDÛ†Œ±‹!rRO¥¹s äìS-Ó­É6Zsä!»)~GÿÙ¸²³Eb.>JYºFŒ¤g%–îI5ÅëÉŘÏTнúC<‘*pžy²š¨1úF}Êÿ§¦¦x‰/oñGÌ[ÝW{}Ä 9wœJ*_þäÿÏóþZ>Xé VCøÿjï6CxÚ<\Ù¯á­Æ½/€~¨"tî;±?ýô:öäÉ“kû(¥Z%ÃñàÁÅõ¬Ç—«ñ?©¶æñññsæ3á´‹bôY»R’ÿ§uus £¦ªl Ô…·üSÖæÝÔPÇ$J.º™/ ”ÂgÒ+¾hü•·#ˆU(éjW#·Îhh2¿D›ɾD*y€ÖÜo+â/”ÕE}PßhøÄoœÔ%¼t"<ðDÌQBINÉeHvœu’Ë6Ÿ”û|ù³ÖT°Á(ñnXÕgF¶¬JL£ ¸–Ï+X„möœc'CÇ#‚©ÜÓZKüÉ¿¹ä0Ll(B‘² )[\$~ÇLJÿ¢}¹º~ÐþøÔ¦‡”œÍõ/šj1V‰¶¤ò•áÿõ¼µÒï<ëå% ð;þ_ á¯Gû!¼ áEãøñ«íûú±Þî|,«GÃÅHsªxqîö‡©$¯¾r{†`ÎYtC#t¬† »”MÜ W*ÇGÎgÂi+JÄ>W%“ ÿ§uu'Mp…vBΞ?ÅÑ©ã禒ڈÜIÐábÞsòDçƒÙ稫JO0¦˜Bº(9L8ªy[T"̯9Q›Õ\“š%]‚öI{I\äâ ”›€ºã*WÞig¢Ø×ê’°7[-"™"LÕ´(]¦&@ZI:¸a•¶*þéó9ÞFyj|\ßAÁ{0k¿K´<4^m^ÑN§»HÎ&gó*ǧÞÒíš zñ>œ1wµ•?£`Ú = tCO$Ñ–T¾>üÿ¼Û\îµWòné\$[íö—óþÓ>ùrç›/»­íúq6y‡ù©7 §Ã)Ë))X’,¹áèO—KÁ%Ó•0Ξ'WTB1“Ã0:4_|0ìí`S»S¼Ètù™™™¡³CT;¡S>_:Ñ­‰ôGRŠ?,÷"Ÿí(ÿþ¤O–3˜t “C'#÷ÛQâ±bÒd˜J ƒò¡©ÈÖQî~ §}HQÀ=ß1¹0áIø“ðÿ(ÂKÂ?ž PÑà%eu« Ň –üÎ%·ÂùnNçdò•ˆtK‚!'z¥DêátŒe-žzôž‘É“›Êhý¸€§*f¥_’€øÚˆ5%½gü:ît’œ‡Óùë]L‘j–ývl„Âíˆgá¶(©]ܲ(ºPù\õp–üM3)&Å#í\ís*©$üÿ)øÿIÿwü¿Úí­ä'øÿIÈŸôcüÜ8 w¦”¤ù@Ålvv–$šÞô “ŠÇ¥äÚãƒE¦Ÿ¾+ãD¥‰ÇÄY€"á* hª2yÀŒ“(úÓŸÔ¾nBjVeæªO— 0†Ã„’#ˆ)øoa’°iÔ¤ê”xqqу±27eMÖ6,üŠÙPWÅ#`ÒpI5°jÂiçb!mܧ.q ÿ߈+dÑ œñ894 "íì'øŒ\ƒåÅ9+FùJööö"ªÖpGÙf»ÔÝåÏGûä’Iªîªôþ¿þv£3ÕínJ4µãZ Úá³®wµÅ/U5‡ÄìRd¸°ÚÓÓ£Ž,vXSrx6‚NòÀc:¹… )eQ×½°ûP!ûàÁƒªaªªqOgºÂÑ‹"wUSö]u± 7àäOxgA‡Å˜(Iá=1*Û—P1)¶ß‚—ûRf…¹@÷è¥̯Ö}²x TÃ$s«¢ÓX*Y7qª—––˜*‹ºs¨Kʧ ½ÌÓxá–ª=‹Wˆ<‰ý1cDòLŒËDÊVu4£êYºQ¬çK%•Tn.þ¯ÆÿTüŸ³â:ÂTÒÉ„°Š¤5 A’.⛾%U;¯»(Ž™„*£‡ö¶32˜›,=,sdüNg÷ü¿¾½†aÚÁj:æ×å4È™ì˜l‹ŸTR5ËœìÞC9a©'Î%]™±úW`ÿYJx¹W'ãÿ„ÿoʼ1é­¯j…_§è-ã0óˆZÔ ³Íj¨l˜VÆùQ”Ñj¾^HSyÕ!Öu©`¹d8 €†ñÐ"¸^#*fãÎq„Óù‹ƒEKpj_½¡/úC«$QWîãê$Á³¶9œAýÿŸ½7mŽɲ!.Á] %åÖÕ]eeÖf=óÿ?·{f¯^WUWee¦$J‘÷=v>8Œ“—ŽˆR™I‘⽆@‡ÃqýÜÝ®P€ß²/èN•t.˜tLÆ»IånõQYa)ä­f^ŒKë‹Rs ´///S³Dÿ¢p=OÄàäQ?q Î+èrþº99Ý]ülÿ6ï®§Ù&>Ý>ëi-í¿ á½ßÙ a½ÓÜj4öêõù‡Êp®ku@¬¢›Y lŽ5ƺFå¹3*³bËsà/›]3˜:)l:ÀfB‹JCÊB­JÄ{xòAŠÿÃu7{ÖÁ ×Ëkª„¢MÔLT›6-j\zQ  ÐZ"¸@°nGkDu|§}4òXÐma#æÿ™››SpŸëÿÿß!©V£'4ù3¦ñ³gϬUž*Ä“L¤Lý?Εz‡,„EéE3¾.{b‹Åà,LQFhºåˆuO•¤G¯ª+¨B­àüRw³…Qü§°%U à— =ˆè±… ŸNP‘PÜ åg1™]Lææÿïÿ Ü*™«÷Õ?Ïý+Ž*&@[*Y«üm¨©L ƒP&¢ñª/½-Gbѯ ÓO&ŠŠ¿ü)ö–‰‚žd.åÿÃKØàe¬\ÓZÅ„m-H à™yOÌ6’;8µ.GArï±¢éøøø—Žã4u^€ÁjÒ$]ÚðI¯ÿëøÿö“­Û ÆKtÁRÛ¯·Ú&CÞÝݵŤȈž?.oÿ ¥Ú™Ï‘§àºÑr .ͳ’ì~.:äoè¹ø¤-^¦¬kcø­¸4ÓÍYÍÀaæÕ¡QƒWáÁ7[Ë8Œ¨Q+W«hˆ¸Ó¶0ªÿ«««\Tçw¼En¯Âdáz¥³¡ýQo²;&¶F4«ŒÊJ%mY·Ýf­VÜ–ùf(®<ùqäøø_9¯* ¿Å®¿`cUi×…´R³'ê?ó‘rÛV´áP ó|kò5>ŽÓ>’0àTõÓ>Åñ—Ë„Gº9þ¿$˦T46»ÂÐJ»òቲ- ¦ZxËËËd>Õ𮡦$6[õ Còmu°È’kWÁWkk¶ãrÊ®Yå·rþÔøHsÕ¨Ö¶J!« æO,‰@¡ÇẟkИþ‡ë"n?t¨‡ž5´?t²¢J_‹à|IÚÃÕMÛ:©º%ÔÉé Àÿ€÷«ýt=Ï7²ü]ÚÇg= kyØ á‡Vc;„Í^÷]³±×l&“S­VG@%Ý#¥(ù*õ$tþaH,Åé^¢s«ÅªT…úúÏÛ\göŠbæÚ–’gqŠŠ¤‹¢LDQþÏH{C–hËÜky ƒ”DÑ:‚öµ´Éº¹i¿-giº]eþ4Up4ÆŒã´ñz3ûžê‘)§‡0^òÆçÕ7òi­•¥_æ¶´ºårø—¸|É:O*¾t¡â—>þS” /Õ¶*¹S ÆWEu½•Öž;Ê#Ôò[û"ËbU1¼(›âµ %Ž]õ4Îê¶\:قʲÛc¸Tÿ·¶¶‚ñbú`1G=&Upfàó¨þ„¹Gõ 8þJšZ½\¤íwå¿“Ó]Çÿo»ÍWYûMÚ]íâ“á󦛯¤ù_/Îþÿvv²ÂNÚùq{ëé·ßŠå)÷&Q}”„'\/Ën®ÓzDÆ(m(36(ˆI Ù(þfˆìöPeU÷`þ´#+CõÐú_Vgey¸.‡ÛQ jܦ3²òHTÞ±”µØ†Âsy¢aE·¯:›ÌŒªøßQãã8íƒÄ‡…E·-ÂÇ`...)áß29ù¼ºCø?T4ÞV}Á¿¢®ñ¯š Åg"]G•È#c±}ŸÓòÿH ˆ|MmÜqõŽt¹Qü–G-û‹–Ʉ٫ˆ-Wo (:úW<û«žQÖÕÏ­ößþõ1ÉœÇëªý±uª­ÉdƒAç«£[XÙý!œî4þßìu_‡ìm¿·ŽO/àó¶Vûa3„¿œ¿êgߟ½:?Àµ»½~'íZ»g¨Xu•Œð•öD°nëÉÈ‚ÈO"Wubjß…ÿ#‡œ¡šÛÈ‘>ÄNÁgggq˜tVxšŒ“RO¨:&äfP•œ6i¼Vf†Qú™¡G=µjúSf§|òäI˜vÃlùNã4-Œ%Ô§(<›ÛÊÉçÕ-§Qþ?Á8uH« ‹ }☃èԗ“b› ‰Š4çCÉúÌDZw¾zT¶H$÷2pD&6¨FÜÃѸ Kx å·Q=G,=DÎôú³*ë¨m鸢 eÜx#º_Ù…åçÃá þ¨þKì²+Âxik¼lµ?VÖ@ç¹xñÛ’ÄáºC{FÉNNNwÿ¿îÔL›/ºí—öJ»‹Ï‹Núc7ý?Co=„¯\žä)® ÒÍR1+:XŽ’·Wõí`núÓŸøÇÈù IêêÕlãLªoy—øž²ì²„ŠznK.Jv°%m--±Óƒƒ.6‘—òB¨ú˜ôKÖsÞŽa0ÁŶ¦˜D 8¶â@$#¨¸Œ“““ãÿ»ŽÿûäcS%Â…Š±gssóÏþ3PSµ˜;ÎÞ–âŪVÔŽTÖUõÝ»wÜ)oœ1õâ…À­à ò%–±£Ã w… >ž››#Ì&&· a[AÒ´Š¼3‰¨òLÒíX~‹®Î”¤ä‘RýÁ¿´kh bãªeLÂ-KŠáµÔˆµ8ÓRL‡LUìR#ìW 04ÈÎèÞwâ^0Jd)lÙëä:99þ¿Cþ?Âÿ¯óÖfz…ÿ»À®üö©É|Eƒää‡ÊNO~HVOä Îo°„ådãRÉ—Æfα©rÂÀ¿%ª«y¼p¡!JGq]àäçÏŸGäÇç1£¡—#¦^$Ø>uGº ý×ý—:Ãòª ¦úŒÝŒ ÐÆiQ• ž©ÒýE·éë¸ãÿÛ?ŸU¬ø–L`ooI ÂõÌÿ ¥—‹­vÆBx/ÏFJ…‰ ¶ÏëÍ›7aàw„J¨vŒÔéÊ&ÄBöªq¬b‡=”=7”úvA}+w òg+³+Or0ÆÙ¡N•tŒ§‰ë—Ž¡MÖZ@Tð—ê t&’/ø¯\^œœÿß6üÿ²×)Áºš^áÿ—ùþ‡\@ü¿ü?SàÿÓó³`ò‰#qM{¤rI ô²Æ"/}ttDGU³µ°ª^’”T,®û]Ð ŸØL.—²Y«ÖaäUP—Zµ¾¾ŒaÚšÆCDŽ“ùÓ]Ó ã¯¨˜_.pê›´d8ÑfcÃYvýb­1Y xˑɛq^lS–}vCªl[øØqÚ(²5ãT&•nCóÁ:gsü‡DZ[ÀúéÓ§6Û¼ÅíØÇ3ÞžHÛbäáɇBÕ:‹[‘™%àÉéÒ1ª—eÁÖŽ<…( ‘fË#Ôro\ûiȈ˜¶Ø %c—9I’åîîîþñä›.«Çä6O% R„é`ôã i #@Ñày2œÿßJü¿–^Ãÿ¥Pàÿ—ýÞËÿ¯f­wüŸö‹ Yì*¯iiHÀ¥mäY.÷ qÉ9ÌÖfl¦K„]U˜~ÔJgÓG¤&ô¥Â¢C•ícÍÚ ¢´6 ]i«d0ýKΦÓik¶*d‰ ‰ì³²}J¢‘¢ ›ËÎqÚ‰Csc|=8'ŸW·ŸÈµX"Dü™Úi†,EI̤— ¬6¶ˆÞ5`›* ¦YÔêDÉrm¨ìdIÿŒÀÓÄO9Ò,,,ÐÄ ì-3vò_Ú4®¥¦‚¡„ 2*†Îm¥*¸TpG+‘n®~Ûòš¶Wê¤zŽ«`œ­QS>Õh i"¹Èúeøÿ(Ÿ&uŒÖÄãÊÇÿ·ŸÀlÐS”ÚQÊ›ÇjE4òò™“Qo¾ù†BÙKäW-SL®%Õ·|[ú|+>Dñ¿Ê‡Œì': Œ4– Ò¸ŒËÙ¿”ÀŸ{lŒ3¥$œurrÂNŠ‘âxNaôYÔg% &ªËf%rA''Çÿwÿ—"À5üÿ6kmwÆÿýëµÈ•²^Œ7r¨¶…Bh`Uèn”9 |-^±[!{EiÔ…Í/¦¿¸Q÷¥ÊæZ}ðƧh ð¶·#³²¼g-É‘gYY†ú1Þ,—[ -˜ÔºŠ¼€x×ܶewp¿üKµd©vÌqÚPÂ*¯ÉÆ¡cÖt=5¥(wrü'ˆ¹úÃu/‰´œäQ^5• –#˜*xAðš0"àÒV·`«w)«¼öðrCCéѾ^=^K§[Í’8¼šªâH‹‹Åäº+Y‹GÆJ Ì{Iɶ"0M:´‰ÑÚ8¦§§µ„‰½{¶|''Çÿ·±þo·µšuÞ¦µnºÑM׺ò7yïu/Ã_v:­÷‹¤VËû=«x,±«”3\k´šXe]âÃõœuܦeAþÿVIÎÄnÁެꎵ€£ö­Ök«¹´òYYö"6¥–}©"˜ Ñ%V"MqÂ` µÖÀju6;=_:2èdmtGjœAòÍ“ £ÚÇT‰`Ûê—ÈœUî6â®ê˜x6>…˜nY ÜÊ/Ò†yòO''Çÿ·ÿON&µ©dvºøÔfÊÏ\23—ÌÎ%‹‹É£Åäñb2;•Ô&’ùZò ‰T%L˜L®M¥n±Yt¤Õ ×ÕïV«Ãê3ÚétmGºnËÆÙ­;4 ÂiÅ©öе¥YRš ›=CV›ÕSBÔòge"Ê#²hT—Î1–b£Å‘âÌÐñqœæäøÿÙ”õ$¯ f[Ú’ˆoãEcR¶ð,EuI²_û"÷³ÙÛÀ¦Äc-Ò–ò„)S¨¢šS¶ÿQñbnV5†ZeÎ>¬dA¸¡ÁÁ½ó`eO ÆqT¤z¾aà,j¥-,päpøÁ¨.Ú ¬Ó—}ƒØ+ÆÁE¢Äœœœîþßi77»Í­Nk»OŸÍNaøéòòï‡ûkik?ôö;Í×;›ÿþÇÿh·›b5b24ƒJÙ ïd/ Û´\Q9|"/z4Å5ÅêíÃuGzÏr[ÉHú©KóD]W¤¬ƒY­ÞnWLk%Tn«j€Êè*êƒÄ›˜(ÒùkùÐJÇQ=Gkµ]ûdš· †Žã4'Çÿ÷„,/•“$™ªÅ®ÖïŦî!Ç Ÿ!c‰ôrà·È2LCÕ²ø¤/y×ÞÞž4;†#Ù%1:¡w:±‚Mé94ÍŽì¡hÖêC¤ÉQ¤ô3U>YØfT- 2×…ë&õ‡!l /ªB}+ãØÅHQf¬´«URs¢ÜGaXº¼àeÍœî1þßn77º­ÍNg«OŠÏF'_ë¦!¼j76Co/ô_6B?yÐ!GÜ£šEÜ/JÅÃSèÕc-Á˜g”Çò1û—´¶3²S3ÃîšëŽÕŸK6ÁàQËU‹‘u×A¤?µÁ„†Eµ8Ù×G•˜ÇN¹îc@‘ÿR!©¤—ˆtü¨ñqœæäøÿ^‘5¶*)\O¡|ÈQ¥B£ª·¶KœÎ6‰cUè<LÉz6ªAk%Oˆ’-(«ƒN' ¶YvÛFåî’u«`7N±^ú’äYÕbâÃU½ú)íM4bªç¥e°”yû2Ô*¡D¨ä²Ö㳩¤«ÄÀ ëÍhÛÑ”çR£¤p=ÁG999Ý#ü?5¹Õi­¥.>i¡ù/Àáÿÿc³õ}ãòMž½n7ÿ¾µ |Œk÷¶Ak þ‘všž0ÊÌl™¿”'ROY%<#O´9´Á<€ÛD7ØÐµl¡öªœ"k,ÕSŠ;SÒ¼Èj %€ÙØsë´OŸ%ÚT‡K+Äu%eØ¡ˆtG9Ô³EX~n»“ ÝB\¹5Z³‚å“bkÖ.@w—H×T yÙ>`@’\åÃt”R2güU-žÙ i””4IgZ2„Ï%ïhéÑ(áñÉJþÁGom+Z1#\®P¶M—íãvrrº'ø½Ó|“vW»Ý·l½½íä«|%Í_æ½ÕÞ„þ»Ð?û !™œêä½V§msÇII"Ë2UîrþĽ?zôˆmmmÉâ)“kµ»ì°v™ˆX“r¸Y!BêéçK‹Sl6qEZZÕ+Ë ™½ù›o¾¹,‰;mIGìŒVYÕY Ò¦¼³¶ìªGà¿v©R"¿Y¯Ä%˜’zbbbÔø8NsrüI¹‚Á"˜÷|˜z(í§… CK·(©åNhЬ®H˜Ûà]6Qƒ¼Y$hHI¥ƒ°?Xž,*X`‡0¨„>77‡{dý2v^šsM$ƒ Z““““cø0,Súãx[ £ª,£áº÷‘ä…`|A#¡‰Q`è§Íçf7x ZËÂõ,Faí£Ñ²¨’vùPÅŒ_+/Ràätñÿf/[ ½õ^ØÀ'/>o{áu/záU«_þÏÅÙzÖ]o\&ó ÝòBTïÈ)½ }‰“ÅŽpû6™g0IøÁUA†^7Z‰TMÆŽ$I\´ è¢öž+$ù¸*hާHM„~ª= >¢qì‰?Úávñ 6 ‹Øßß×*¦b¾VôP†ŽªåüÔ&Ùë’uÇiNŽÿïÉñC¡µQ-]K`ÑÖÆª¬ž >ª¢MêF˜]?r¿—ªÇbfëWiñ° ®’È)¬‰Ç³)ª¸å!)¯[³ôüùsý”?¼Ä“‹¢ÙÅÅÅQ|˜9™Uä×v[µ‰µRàtk±±cÜO™ˆÏÈÞ>%ÁŽâÝÄÿ?¦¤£Æœ—À ¥Ç¤ñ¤|D-dÞ…ƒ'§{ˆÿW»íy¶’æoºøôWºýWiø)ïÿ˜÷_†°ÂZo:­ÕÆE2= –—¼ ¬ƒeÉ=–––¨Oº×RaGr3Ã"\}XÌÑ*°¸°È£…»Ñ¯ˆÃˆÒ©¾ ã ‡šw7??mË®Ñ`j2²þ/ÏÂúBE ƒ†l»gåîT!Hþ”íXc"ƒ¬MjDáˆgÍÌÌè ì£G°`$Uí—õ.9‘T.S㌥ 5j|§99þ¿WãFÞ&Cvˆ –òÍ7ßE€#YôdH§UÔ<|ø|‰â8 íäÌâ?z"R8È‘ÆêO"ݲêí²^¼mdzd€Ø¹ºŠU(ð'H©!ÀØÉ yDÔZ€p{¥ÆykÕjêÀP>Ì=Xh̵:"¬Öë•¶lÞ”­S©K³4°ª ó.x]ÜHXj(¶¨ö1“ìáZ`ò*¸Y%j¨p–âÑ”Ä6%õX?[^ÝøÙÈ2''§û€ÿߦéË^¾’õ^㓆•¬ø¼ÈÀÿ_;­{ù›ÐÿþüìÜizº]âr*•_s³ê&pN-Öü8’Oî÷d˜Ò±Œ;…íWG5ˆxdxQõMAÀru°ñóóóh-àP`›Zeã§ÂõB½è§²FKÑDþO|Ž»ã-cqá¿ÔÀ“‰:—T‰*6X@¥§007àH.%ø©{!Ûç]ÇiNŽÿï YS#í˜ddDŠÛ’ˆB´¹éÓBÆB"Æ%†Lܨt”TeT#¶€Z©±•êêa豉 ´ëüÆU¸^¨{Q7¤“GŸ•Z·ižL¨9Q°-{"›…]">,†í`ÊŸã#DÖ 2X9SŽ¥v¸`É[ÕJ@hM¡ ;F‰gɇ‡#?”0†|zGp­/*Lb 6z‚KÜL±x''ÇÿwÿƒÎÏÏ“åJéM%ñ¿X(/‡EDŒNœGE„­RE —Ëèi|tŒÍD­Ø ÖÍ…LÉâp¢|”¨Ÿªûñ’Ænbi®YÈR,CÑÇÉ-ñæ*08TëbnðBׯ\ǃ#ÉUž¦ìüꫯ”Ў”BÂÀÞÜ)ž?J¿Ä ܲ .®……€צG®Ê)¶Ãè ?g7Ð¥{]ÕDJfÙ`¨5­ `å¬m,¬Z_¬Î'|¨ž{´JlÕ«§²6Sœœîþÿ¥þ?ç‚ÐopffÆšnŸ={fÝx„®Éÿ­¢¼î»ï¾S– ²hù´cûéÓ§jŠFO6ˆëŠ‘Ê²ÉHØ™’”MîFOž™l^p] à ]”jލŽõíÁ¨´áþ²[8² ê½É«ã­LAn9*¿4Ë…a½auY:"ÝK¨ä)ÕŠ¦ Ù…Fvçjù6«¨®¨Û*RPµg© d$¹PNᚢ`çÈlQ%¹¹ÚÄqcú£wŠÖ“¨F““Ó}ÀÿŸVÿK jeH Í‘å{)V nÆ#m+X©)ò:qËH‡¯¼páz&‡ªæ‡?ÅÍ(((zˆÎh°š|$TFW£r]aDý»@`•‰ÒЇÓ\ŸVB±¦.pV-¦#yb5iVPÆñ¿Ó#›‘¯Ýœ>ÄlÍ`rcZ‹_1nTxxmm-b8Õê$£˜®%ï#ËQÙ%Ú ä)~¢DÇèØú’8†½²k®.¤»¶ux«uÊÄÌ¥Ìy÷î½;-F*ž¥•.粃«b»Žá=…ñ +š)¼Z‹ÝxÿÿèùªHå¨þà6­ PÕ5999}áørr»ÝÜè¶6;­6>)>¥4¿j76Co/ô_6B?ypå¢ÉeX…Õ9ËQ]/Ë£®«z»<žøVˆš<Ê¢wñO9ÃPãm—o•Òüh5± +»fY¿˜~Í*‚x£ê×ËÊl Ǫÿ«þXÃ+]¡˜¬/*.eb"5šô<ÒŒEЦ›Tæ¸ÿÓoNz Ta| +@7ýéòòï‡ûkik?ôö;Í×;›ÿþÇÿè. WCyÚëŠbkÌJ§¿"ŒÊ`ÙÞÊ¢J—æCŽnJvjÞ¸1q<µIç%&ÿ4ÑC0ðȆ+yD Ö´Ò±A\‚Ǩh¯M+j×ëx©(—ÖDJ‘Ø"qÃúÁòAܘ3§ëÿ~sÔÑ€*‰;ýRR…,jÝå©(8ʈ$ >Yy–ž!ZGØ;Tœ[†*¥ÕHÄrUÑ2aE‡…Ò„J^­œfŠ{"6ÿŽå‚"د=ê0ÁjTxŒ¸+8¹/Bk4eë‡eY›—Ðy㸄U©ö–Ä.-glœñe‘°ó‘‘\´ö2«†¤†ñý± ¢’Á:99Ý ü?5™ÌL%sÓÉìt23S~æ’Ù¹dn.YZL-&O“¹©¤6‘Ì×’?WQ×ꔤKX˜ªš]*}ûÓ¦&P>:á[«'̶ʨ¨e(ï„ݯDêÕÔ¸V@êa”@;˜CoœÿjðåŒZ5@iW…Ü)/'ÿÕHÏc5rv5ù˜¸æß ÿ'NN¿‚èÎYL#Ƽ1¾²|2‰iÓ»Rl‡¨O/¯¸\ôR[¾$Ðh9ÞŠÒGW³\Q6F¾g¾D“ÚÞKd4áÁøóˆWë*Ê&§hÕüÿ#†¬%I—Pê ×5™Œ™ "²Èd3^β=á‡ö'Šû•Ð ''§/ÿ¿ÍZ/ú•¼ó:KWñIó×Yþ²—¿ì÷^†ìe¯³šµÞ¥­­æE2SKû½v÷J·,§táp‹WÃõkÖpYÕáx‰ÚágËó©½×aR+龸GŠcŒûf1ã*€ïHE/‰ŽQ+eÍâ‘¿=ïÂÖšWˆ™.‰b¿Z^¥±‘ëTÕ Ý—LÕñqrrº?$ö¥úçy²M2óA«áYä6Õ2"“¢g¼P@§˦¨œ…ÏÃÀl pÛæ&÷¶L˜~þc4'v‰Q@®´ý¼Åü¶®‚b¦ƒåác Þ¦G–2iè,9sZ Îí¡ý ÆsÉ tÖÉÊ& °¢ÄG"ÿ¡áU¡CÏŠ>« û`œH´(Gb¦6 ےU»ÏCÉkö‰[O]]qÔü±²°õæµ G9¦8DQ0c5¢“ãÿσÿ§'_ç­BçE?}ÙKWò€ÿ½üÇÐÃû!l¦íwÍ:ð?^¼n–Ê8km¸QÂO2m¾û|ë#t¹©0š ˜j_xYø‚ß*ÍZ¦Ç„ŸVÁnµñ:KUôÂ2—8»Ä^)Í‚, V °‹pl(“«OUߥp +ØP,%Uf{ äNv Æ)ÔòÞQããäätHSéÀ#¼*¦¡X¡1öÁvIÚ&ûR€jf¥Hm^B\èƒüGšŸ‘õÏjbõHNÐe‡xƒ6‚LNP6…²ÖJdAu1:%ʤ¤»RUÍ—pÝEÓ:E:"-1zv\@GÁuÛŸHç£ÛÁv½°ùN•= ] G,?.=_Ž9›µ6hÞ‚¬0Ñ£‰ˆ1èWF[Ã:0nX™È&P#_DZJ\ÈNN3*¨ÐfÕŽæ&!—{t ºe‰ÉQ4 AS7c‘wrüÿ‘úÿÕ¬S‚üBí¿šöðYÉz/óÞË~¿0ôÒ×yç]ÚÞ*ñÚýÁÛ$ŸIéùéAZÍ„&&÷U¥­>*rb¸ì{­#m†êˆ]ðí¶ùCÂÀ=Òš†#P­‰V·0¹ &ƒ s°1ÕlÕdébƒì’”'9%«aƒèFä dÇAÁhvªŽ““Óý!k=´JNË:”èf¼ŠÞfN¶l;•‘^`IÚNâ´ñ&H«­UT²´"Õø\CmÞZý3cÍêk%š¡ênâ·(‹±þùV½Ã¼º´´:ªe âövÄpÅ(5œ„?yEûŒ¬Ú?ê­w ÑSÕƒh¡Ä¶.m=E?¸dh<kÀ•dÏÞ‹mM𷶬 ôÒ“îŪ³l’(嬡‰¾£åXú@EÞE½âˆ™?QÕêóE V%ô?NŽÿoÔÿ'í ¿ÿùÛnŸ×Y!¼êõñ\°š¥ïºÝF#©Í潫ٮ[‹“­•“ª|OOOÛÚ¾T“ƒYŸ^&öNX & µƒ}‰è3i›•ÁZ‡­2Aݶښ˜ ›=deIë±³´´Äú)ÌíûàÛÍÇÍFÄ+,Wa—lÒ‰H7‚­ ‡iXlìC(K'³VòÇÇÉÉé‹'!yª‹-K;¶f¹âP"sø¤výøøXçZg~óȱaÌU¬Ò;ª<;*?§Õoˆ‡[­µ²ô yÛžÙÐ`œ¸µµe¥¤00yè"ã…¼ƒ¬§w³ ŽÞ#º/i¤vÆñä¬äŒ òág àhªýQ‡quk¾Ñƒ°Ñ Ò€Yÿœ1øŸÃ®,CÞp$ÙZ”ãgq[÷8Šp€éQ^Áª~O#ƒ+~¤[ì¬Ö¹xR¶ÄÓêüá7GË´¿’jJD<2Ê…åäøÿóâÿµ´S€ü´W‚ÿ€Ïj^§áU/ÿ¿MÓíN÷}½‘LÏÿ×ëM»FÐf§Iþ½Â¿Ï|Y8ùÿK`?77gK„JÚdëØ34™³`‚ *Õ­&œ¬Øºáшl£·l … ZKrMNNð‹“D‘‰øiS)“O´œÑ¢UÒÊ/ì<Ëk<¥Uà8à¦pº‡15>NNN÷Š€ü£('k`µHrŒK†uû¯¦ûêÎZ„cŠUEºVv•~/£êsEÒ„\ëÉ¥ ç1À¶W6#™¤Mvõ_¥Íhæ–ωüB€uºõE<]#+I0çÖØÍ*½:† Zë ëQý±5ˆm—lt6mRþ[äLö™]z¬¶ÞM¸î%iÅ)¦}LJjÞŽ²$áZØ£õWÃkC* RCTsÌ|£<ÜŒÍ1ó'RHÒçAoËC“4#+•¯ÎŽÿo þ念ñXÉz«iþ®›íÔ[Im.í_[`€Ïï¾ûŽy˜²÷øÕW_ ˆr'¾iÀÅñü©wY>˜1’ •¸µ‰€x¼iÚ2¸Ø˜šš¢ÁÚ6Œõžòž‹+ò,NNN÷„êðú f€;‘‰…Aßð©ÏÈC¬‘¸ Y8¤’2ÙÀ÷ìÎñ"†õ<Á«[Ž8§ »T^p®îÚZ%¢ˆ0c«.òHeÈ‘Œ)–uº2E€9kÀÑ Ì"VÙjÆNJ`‰ŠË36[×4dÚÛgBÐ`r)í§]¸H}Ì“âÕyGÊÐÅå7 ÀU «9vâ¹H?IgiiI£ý–!“§šé‹V’(×ß/BÑÌX¢ÐBôÓvŒ!x6Â}ÔüÁýbÕV˜@ä¶$×5=Áp=I %ʵœÿß þ]àü+üð¿’…—ýâó¢×{å›i¶Õh%3sÝ~h¶:Z\¨çdÆk ±oÇŸþô'^…¢. .¡tÍbÒÕ$¯¯¯ó,ð‚^¾AlI_²ƒƒ¥¥oçÝ‘#ä‹Õ3‹ `³ö¬hA”NF+ ±PÿÏþóææ&Ç]XE–!ô“Q?2UKdÅY"°Ø—Àà<{ö çR·»`ËøÉ~bCAåïqÔø899Ý"×’|˜õÓÁú„x­fø×±_Ä--³ÿ”“¤Í©2 )=ö­öØæŽ#æ¯zòD†mFa¶r`f«Sÿå¾Î ›YHÀ^ s´ÇÆùŽŠqŸGÝÖÁÊ¢ÁX^EËÙêêjtîøþ(BMÝãööö6÷ìììX[6;ùÝwßÉ,¥æ®jÎå<£-„Ãn`Ùå~.I<’ý·ƒÆÏ:L¬}Ú/,š¢ÆÞ&è}|J+ ŒTËãZôOަJ„Ï£ùõފ¬ÚiÒ Hµ åÀà°ßñÿíóÿO_öò•¬WŠWàÿE^ôÃ!üT„çkY¶Ùl%ss­òB˜ü¥˜í«|%ñ¾“XÀ,x¢ÜÅÅÅh™@O026(&–~0U½ìrCŸìS¥öt¶“WÎq-)vØÊ)’ñÅC$#pe±‡áNÁ7¬ï—B›ÖÊp=ž®"ÚÈgk>W¡¬„=ä0â´öiþ:>þ&:9Ý+"S%—G%Oûߎ­åG¼„!G…’%rƒ¨ìÉ“'8Œ˜êƒÁG`hÔÁÊЩŒÊV…´†Ã°v0+˜¢UÛ(µI„dâ¥Ø‰i³À6ËIX)@ þ”­÷ŽŽ-P¡$ÞK;¬ (þ©¢úºêpÅ.I5¤yöHºË²‡µZMçJw4ª?Z&Ðy-.ì'Ö.ˆø ‡ILìfã>Æ´„ãÑIe+Eh¶f¨â–Hóçƒþÿèn9ÂðgŽ-£êìãc›\C1 ­lgÔÑÑQdÇç¬S "žãòò2íéCç/Më<‘Kƒ5~±'||8§kŽ)Ý«“ãÿ›ÄÿÁTH¹šÛ“?œŸo‡ð:ïÿã¢ð¿Âÿ>>{ ðÿ*„¿¶š/zùë,…tÔ¦Á¶òÁMñ5”¿Š5ûÚWLDž@.½¿|õl¼-›‡!‡3ÄO±YÉS%Ùdj‡ü ¼EÎ< ÐUÆ+%¸¢áHp9i­$µÀ88ÔöpC‚ƒØ}ŸFñ1S‡qÌSذJ;žß|óÊ1ðtë€äääôœս;¦*E3µ¾RÝ!ÀTði/Å©†â›Ÿ0›&€(Ë"/ZUVàBh™XQ¹=U$W‡‘óÛþX•î‘7+6 ÆW½e,¯B7²\e†!ÆS;´¡„2íƒÜY+lH‘Å+ÊñÛpQŠÁ7ÆGñ\2X( ªÕ¸Ê”`+Ƈ÷‹ÛGÇ8\ZѤYRU´õ:R éx}^£ð¿š•ÙBƒC÷.UÕj˜‘ž#ÆÛár†QRSØO`±‘ JHF¡’ÒŸ£×()ÿ.ö}ãd°ËGÉi/)§ó\=w…¥DÞ¶T‡FÞþ’Å”M×ÉñÿáUÑ;‹wͽáÿÙÙÞám?l†ð¦þÿÑîþO–­”"À¿²ö?.NÞv›ÉÃ%â® ¶/îѪÇñ–ñ±ÜhC65¾§‘Ù‘;•ãK&Ô`òŽÚà2y`r§| y$}™B×U²vžo÷˜P5é ìµlölÅ%É‘•WT‰4›nŽ«0ï…æÝ1vLUFæº@ùˆ6åüäJjS®)Mþþ&:9Ýbé^é¸ú™¤…SP¨dŒÖ/Az[¤ðRäÿ#…ÚGOÄh%%‹#·o¤J_AOJÔ`Ù/~‚ï1Ì“Pc='±¶*–Û<—~/D•”,ÐÛbÕ3P ?Ñgkh–|DøJðØF¸.´lM̼/É €âQÞfÅ«´vÚ˜¨Mª!¬†ÏŸ?Wt­Òh„AÞÑZ­¦ Å2È_òQ0±iísfŸqüãÇ•ªÈ¦6Šž×(ÿŸª'-19'z«¿ö÷÷m3‹µ¸ãIQ¼Rûhò¦ÖPtÀzp'šÅC¤wq0qØc=Ž" /£ƒdUú,áZ¸¢:)Íï‹B±úÌ…˜½U¦#öäÉÂ{¹PÉâäøÿfð¿8*a0·k­gí—içu·ó6ëýëü’R?¾ÿ»Uÿ[§¾²ÈÍódfú°Õhv;z/Ä+¬=TXZ¹ýù ¨ ¡¬ÔS¨¨ð‡Ø]¨$F梶)JTTwT]+þPÿ˜8Ù¨x:ZSÅ(ü' ³rͨè­0"ŽI;Éxy.8¿´:*—ÆÂv)÷"#NN÷™€E鮿ôùÙò{)U)2Ô’ž={6*þ—Z­VÉfué" (Ú@÷öö$8iM!ßâ’EU±¥hŸ&]¶F>°¹ºnÓÞ‚té¼Ml“y*ÂÀxŠ‹Ê©†ÖU¬POŸ>eŸÉ‡Ù+æ¨áBo/Gƒ2ŽÚ.j2¿eøÊŒýÝwß©­­- a`+çÀ'—†Ç.a0iLás·¦üí·ß²ôæ{Z%ÔÏ¡ÏkTü/%2¶,£‰E΃‡æÙPþL¼¼¼ŒÆ)k¨)tuww—Žz^œ6´˜3¤×fÀ£®L—¦ü(?œ¨s1g$6b?}Ò°Ï”£-YF+23uàñÑîÀqÆÁ8…é¸ÑI럠áò¼Žÿ?—þßr¡«arb­U_ÏÓ­Ðûñäòê_¶wW»ÙO­ö÷íÖ_Î_‡ìMèläí·õ“dz¢[^/¦êÕ*UWöÅÈ,¾2‚ÁØ)««5z†ëÅʙԷšómh^µp=3§Åäʱ@ΦÚ( 7 ÃR( }ŽQj}é"¼¦ØÎ,S²-õ¥c¸Œ}T³Èî òJ%Z•k¬¬¤899Ý"ƒ˜QˆVU'ð1„ZËÒ£|¡’ÿÓê^lÊÂ'ì3·`/âÞT¶Ûè]ÕgW@®Õl‡AÞK´FžlWácòC\:Êd“óW#yUY>Z§ÄyE,Xž àg{©ËäöooM㦲²eKfQ; [ó1L\×Zœ¥§’Ï•–EëÀγ·ãŸW5ÿ'fõtõ““Ý>óIT¬æÙ¶£¤!²#ÙSôPìƒàé¼–¬èãò'TÀŽk@†ÖÓ´ª<¼ ‘eІ•׳ƒ*5h¤ô@`Çÿ7ïÿ/ž#®žÔj˜¬/Ž¶Û­wõæV£.°ÕN7ºÂNùùçñÞ›³CÌïd"±jeåòÂûÂè'ýR·W¬x…Õ[C§Ö ¾×¶¦0zv™ˆŒ­¶„·’B(öÖ2´wAÄl´T¤ÿÇNÛÿ¨Æ¢´(nUÇ„÷h}“´(¨e¶…cdfõ8#'§{E‘J_>ÿâdàÆU«è¨U ¼EÜ~Tý/[À×ÂEúÉÈa—EæH×f›ïeh½0›xÍ– &]ŒÕºX¾m“ócè,dµeˆ±­êQöÒ6NAÁYaÑH,ò̬–0æéöY¨.¤E‰¬ükù¹-ë†nGù‘¶··å˜af^NQÏÑÞEõyªÿee »`ÙØ Ý/dÒQu6£üx´§àt¶/§Y \|"‘¥¨XZZb潪”$< \•Zf‡»ª¾Ê#Z‹‚©­Æ#!r*§‡Åýrÿ–ø_½•W¶È ZœZ^žX\J&§“¹…dr&™šÁ+·Ñn¿º8]k]‡Þa·±òîm­6U¿<·PÖ– ‘D@ÆBv!]Däý"†o5öÖ‰…lÁòq§ˆóËA”¬LBZ°ªÅkÔ%þ­&Õ7ÝV4S¶Ul´kU,p(dp±l„CAž3ªŽ¹ÖèCſЦFRˆ½ð¯ñwäääôe›ÈåÈŠ‰LTºÈjKÆè!¥À·\È*Àå,x¦zD5§ª ‹ìÎæºgéHYLœf„¬„KÙ2nÇól£Nihõa,샊G`Lú"Þ ‰ªFŠýÊöñp»ÒY¸«;ÂN‹ðµˆXõ²ìÖÄ`“×…JyeÆ;ØE“S®‘T©ËTOAѾcž—º·»»kW:nHÅGlÌ Eºwû@íÈÛõ±ZñA¾dQ£}vÕ³æ²øhdì¸Ùº9VгÃh ”êS1€‘bq‹½)cݽœÿß$þ·™ ”ìwai1y0‘þ{Ƀ饇O“dzù»/d¥¥dz:©M%s5ü977óla1´;¸ CÌì²$Ÿ^(«~ ÆLŒY¯¶åêr§'ëŽØ‚U¹€ÃNÛ—KœÇZèž§ÎX«¢œŽ¢B™£H 4¥ ÐJÍ¢ÄQ qŒŒÕ;É$aó q[°XÇ )-X¡R”ÐÖ¯!wŠ4o®gprº‡¤¬6sš±J53^Yde‡ªÚ\0Õ<Ÿj-rò+zADïH‘buÎaÁFêÜO\9¨ 'U˜‡žTM º«9Ò«Vòe:÷0¨úÄ¿t\wäíO„lÅ.*UOµRä茭]õxE»îØà/A_ h¬‰]»àòF$L…Ab ž5ôyi`­$m˜uü×vÌŽž0Rß±ÓQkR% á)ª\yÿJ÷ÈÁQÿ#ÿ«( Ï¢Øe»ÉÑt’ dŸ ^kî‹·Æ i–~Lil'Çÿ¿­þ_>äzI eryð?Îï´²´ÛÏò€7ª…Ÿ¡øÐç¿Õ¬wÎÎŽîÿüv(ÕLÄçÃõjàrŲeÞ~¾nQÕû‚D Zö"üoÇÙnWù•äV{P}‹‡®¤ÑB)‘Aý‘Ëkdµµ¿m©ë©Þ±N;”€ªüYeܵ!$ÉvÝŒ”ø¼¢ÂXÖ"/¤­¥çÚ–mg¤0´ŸHî³é¾mÒhªyDƒ)—L…e‚pkO±Ï˦˳¦Š!6BD²˜¬Tvµòѳ’Úñ†“ãÿßÏÿ§J6»Üë]5˜—Ÿ~t1''''§{ GpV”QRÚ›ˆ@à\uR¨õ•™UxÉÂBj9¤¡(!X.„Oð)„…9`5G}UƉ,³Âœ’Y¥Î²ߊt 2´¡aUí“|Îmhƒ:#×)9¥S’‚Ȉܟì¹ê¿Ì= Ö°nð2dÛá’ʈÇ3 Ï^×ß'§/ÿ÷« ''''§ûF€rT H„Uieö«¬°¿NNŽÿœœœœ¾lRJ|bÎH/ÍJ¯ÜI}2À¹JÓ†Ro¬JåöÛʰÀŸ,(Ìò©òÿárÚxi¿gffX¯vrr’3Auxy …Ü.--±KüKÙ*\  ØVIYÝWÛ0Æ¿¸2ÚgÁ\ôÝã¥Y¯6 ŠOá–íˆ i Æ+'†Í#„AäÆðêà0ܵEL¼I¡`ª ó1ÉÛ_wÍê´2I„ë™p ÂHxÑaªJ€þpXÔ%'''ÇÿNNNNN÷„¸@µîììp>zôèøø˜å†©f^__ç:\LÝ^4ÂÚ¸\bp=$V°{¸ñé’ÂÀkˆCÄ=ªüeiìðòàùùy€üÇó”³èkdSÊ«zUýJb‡Ã €Ü‘œ²ô«P·‰CÇÇÇ”h@"yÙ§ãäääøßÉÉÉÉéË&[€‰®;wÞ?þ< ]>cÿ)>Da¼ÁTU ¿~ÊtŸö¶Ì–⋜œÿ;þwrrrrú•DÍ<ÓBã'sWˆºqÈ,'''t=Â-|Æ8VUo'ŒW-ZÖÛJükš¦¬ÉÅG ‚¹:ƒ©,æäääøßñ¿““““Ó¯$:~ËUÆ*®ï¢8c]nn˜à¹MŸ(92É›ˆrÊÛ·oy‹…)¨aii‰þó?ÿÓšc¬¿“““ãÇÿNNNNN¿3úyËIem¢›ÏˆÿÃÀíG)ƒ”Èv˜;ÏÎΘ4U©ø±4«,/S€RXè–äñ¹NNŽÿÿ;9999ýVë×ññ1¶#•;D€ÇJ=ôyq²ŠsuJÒ8+ÒÖ;{®œBCî»kŽqrrüïøßÉÉÉÉé¶‘ªYUì €j«BWBÑÏØ¡z¤²t“Ý”˜¢Š…÷’¢¡ˆŸ±NNŽÿÿ;9999ýz:==å¢@?“;× hzÑKûéììL•¼8ž¬`o5ÿZ…¶ zÁØF€ÿ£ãœœÿ;þwrrrrú5ÀIå¿×Ü9ü¯œErûù¼þ?*CŒu–£zyy©š_ÜÏ’¾ê'q>í4gcJ t0Ô;ÈÉÉÉñ¿ã''''''''''ÇÿŽÿœœœœœœœœœÿ;þwrrrrrrrrrrüïäääääääääääøßÉÉÉÉÉÉÉÉÉÉÉñ¿““““““““““ãÇÿNNNNNNNNNNŽÿÿ;9999999999þÿmñ? ²Ôë°þ8ÝìgÁqÕϲ óH+,pCUHnC]E''''''''''Çÿ–û¹App°¸¸˜”411ïùùy|?{öL;———“é`Ð×_ï““ÐNNNNNNNNNNá¶úÿ°V8«Š‡Òí477÷ðáClLOOsÎó¼Õj±È8Ž—] ”…Ë!„²9ÚÔÍ:9999999999þ¿%øxž`tzzŠï©©)|ã»ÛíZ× ý| ôz½,Ëh;ÀÁ¸©4Mu€““““““““““ãÿÛƒÿØÙu HÚ'øßÝÝU玎$8êcƒ¶`~K€?q'''''''''Çÿ·ÿgYƳ³3m/--qƒð0^‰øWøéÖpG­VË•ÿNNNNNNNNNNáVêÿmbOàöÓÓSºú«·réáÁôù§i€¢Ž„ äÏsy˜ÜŠœœœœœœœœœœÿßžø_fø’Wü¯r~*ALŒ¶ÿâ`þ‹¹¹¹pÝ¡ÈÉÉÉÉÉÉÉÉÉÉñÿíÁÿÖó?”Îüè½À?Ža>l`'•üúW@ ˜œœ¼Í•ÂÐO†'èfµMG&€Ÿ2môGP„NÐÓ) Žvº±÷#ç…gÁG•Ä¿˜‡–?ù°4Ï彯Y­ÌW^äîË£z½^«ÕÀ²”©,ß³³³ø^ZZÂ7s‘¸_á'7È÷0Ó8©¼Ä‰““““Ó†ÿÑ·™™.yLøÉøszzZ5ˆï þ·Ý&δ² ~âF,bJt‚Bk âÛˆÓïJDû———€v³%aZb{jj 3Ùk÷æçç…ÜDø‹“üÑ£G„¶†ð—A|1-øÇ”À³ÆTY\\´~ŒGGG2bZΆ9†ýýýååeIQ'''''§/ ÿsÑäþhƒ ‚´>ÚFîþ¯×ë\ñÕO ütGØ<ÈG*&DˆÔéÆˆ¹j¥Ëe•:ñèÿ_½zJý¿æ9¶ñøø¼ø5Ÿù—íC@ï`JJJ†Ÿ½’ðvËé±Šç©Ø?;;ãOø'•*ÍÎ%'''''§/ ÿ+ Xè°™u°ü={öLgmmmÝ-üÁn¤iÊnÓ3ÄêGÁ?Üßß&'’ÓͼJÀiµZ-˜ týËçÂçK8'åm¸ñ jž‡7Q5Û•ÓÝ¥ãã㯾úªU÷ØçKÙ_3GÒgŽ„ ¾'Iߊ‡4:99999Ý-ü¹¹9[ö— åÄÄ„ü(ì"xWð?zH¨ÏêfQî#Ý)¡DžQú¦6²Ž"î |“D†!á”B›Š_ìWÅ:Lˆ=˜®ÜÉÇg½Úœ¾â †Æ§pp ‘ee…Œ‹v"ò1N Îùé_žK1ßÁ¿““““Ó—‡ÿ…¬@‡‡‡:€ÀXÆtAß;¤ÿ·÷k5ÆØæÝIÿ1V~Ü»×ÿß$1?íôôt4ßøÔô4m}jKµZ­ÓéH-Ìù€fÝ•ë‹!¾’`eÕ»%E"¿JòL ˜Ø†ÆÅ•$ÍKœ89999}yø?Rþ#))õ{ÇO¥Ä¹ýø_BÍóçÏySSSŒw¦uCžä|@CIÇ|ûí·¸å½½=ŸÛ7I‚ôÖ{S‘Û˜®‘p§¹ ¡õììŒxQpJ;òÿˆ”I‰Ciß±±!¬Z™Ãp’¨â '˜dI{'›°““““Ó—„ÿ•#Q‘’U˜d­áwHÿËñ˜Ÿ¹) ó‹‹‹JgD 9”l5æŸ ×Ãn@À7ž×ÅÅ'$Ä7;KCi#ÐtÅs—ó¶õü—KÉ |l¿$~‹Êïååe|ËÕGÃ2@3Ê’K[îÇYç• œœœœî:þ¯†ÅqÉ£[+Ýø¼(J‰o—K,¬ÖtN õÙ¥%~!\dQc¹6…'¿œ4Äž² FÖ0¤èr‹à|˜žž¶LÌ牓Ó#½ªÜàJ­Œ*DŽP ™õòµqZôµA•)¹„2 ó<Ñ­ÌŽÿo þ·Ú{f,seó[¿µZmhj1ͯT>Oœœî"M•499I ñ –Ö3b™?*‘˜çPò~´ôÒã›K v²@aƒ…ÖJh1†›˜ÿßüoa9¡/Ëû.--áeaí$¼Üxüøq2‚øñåÒô¶2/£ðvÈÝâsᾆØ@Ÿ±MY ”ùä•"†/¯´:ñ" ©gêÙcn’˜‰ |ø¤ÕVWW#1“ݸ ¦­mÌj>2›Öº¿<~‹•¯*×kêÿ­ O\+5yòxLïóÄÉéîRTÿQá{Ä-ä ¨uÄæ÷+À+O} ~¾ÿÞûÚÙÊ2½^¡Fa{Є}= ·ÉÿÇJªÅµ‚0ubÕüêU\mA–KÈÂ|Y"[Ømˆ`ÜŸ4ôÿá6:Iå¿öðuæ€h§Uþ“K|Lɧߊ4cÁÉåfA•Ñèx¸¶„“¶ T×ËØ)š˜É]}x¿°©BCÏþða€Gqn¨ò…›ˆ:`†ûI`[À6ÈÈ«:þ¿=ø_‰ë…©¸Áu“³—ݦ¿ÜPâ‰\RíÊHTŒ—ÅfÈ‘oÆçÂ|±²K%È;UÇ4ô°ÞþŒ¤Ú9”*A›@Ògø™­üÿeÕ}úô)àSxSÕí„x‹E+ž©  «v¿â›ÎI"K—`Oœœî(ðµe*`.\¯iÔò.Þìì,×Zl8d(S‡üÛ$!Ø Âaê9¦á¹vRJj"Žÿo•ÿ¿ÌUôvÃlÇk¢¼yÁÄÇ %¼PVNY[¾ñ܉6?{‘,Úภ¬hË`#* ŠŸÄóóóxR6´,‚|ƒœDbŽÏð›”ã¨Ã—ÔÆiÌGF°åiá$Çcÿ«Fü9~1ÄU[o.gqd¯Ä7µVwaëùOœœî.ÑáŸ+_^ë–ÐÉAb‚Vv@‚¯¿þÚj°pèð ‚œ'OžÐÄ@ŸÉ’(;ˆoà\7:þ¿mø_AëR—1>7€êiûȸuêÖª^1Œ™ýŒJ3ŒF»ÛÑwò á·…÷2걫¼ð lC@P^ žÛÍR|çýÞ¨‘q?¿ßïQ¦yfU:Å#ë‡~^|÷²¼ÝlÛ¡—vð‹—gøî´›ÅyŠï‹óÓ‡‹KÜŸ¥îÁ7Îõ¾óó£üO¿àÕÆÜè“;e–Mê[DU§‡=KKK|÷ù¦<¸ÏÉéN±V8ðÝò§˜ŸŠö¥æS ]zÙ…‚ SVaŇҳ”a ôáøÿVáÿ0¢þ÷¨²çð'äíÔä·7‘ÿªÿ3øÖPäå§¥øä%òÏR@Ù· ŽÄÙY±Ð×ëÌt%­àçÔT-Ïûlgu"˳rO§›µ;éõ‘/þí»ð;<[ lÚÇÄ K‹ôÔê÷²Ðï¿ç`³˜É¥·eègÅöØï)ÌIl§mî9Ýß/qc)M ž,¾3È yÆ·éÚ3õ|kðþµ…ðÒ&^Ó0™LL%““j<í©Ù™ÅÚÔ …|ê—øn\Ö#¾i?i p•D´Ýì”3"c¦ +qh¯˜…>!œœnþ·&{Àú- óH-É#e/®×ëüÒabÿljaØàþþþÜÜ\T[„J2‚œXRðƒ½U(ùÍ.átæ¸` ^WvL[ÆÈÉñÿ¯ÁÿJvg'á'âgm’ÆÏ…ÿ[i¡þëörÀâÿNž%…kÿ„ƒxG¹ÖgY1 {{ËËÏ&'§±s~~±B˜Y˜?8;ÉÊ6O/ëCQC>ø8øÍŸíy£Î}09Aï²§Ë'“dvbâë'O H)×ÏÚ—gió²ÄùiñB»þ}~xˆ‹ãqLy ^ƒN£Y¼1ýpzÚj¶ ™®Ñl¥ãÿ»„ÿñɚ݅Úâd25=9»¸ð8Ið"Oáu^^^££ã"¿gggGæ7®Íò“f½fCv„LÑOggg}Z›œœœn ¢?{ölmm?‰mXÉKž~Þä庿÷äÉzAб™Çàg‚ô0ˆùµþøVu!œEkB¸^t ”ò§<¢a[§IDlüfå#ò'îøÿWâ[í¢š ÿ#I^v¼ '³-Çs“ð€N#Ä€ý³ósøÙh5¯^™Ò{$O³Âo¤×Ϻ…‹~âûì¤p iÖÅXö‹ƒ);llo奚–‘ŸSW>N¿íÓ¼’­ú…‡Ý;'L”¿’™Ú7jÓ“ ó³SåÅ'y}ÏL×xäÃ¥<÷ýÒ}¨ßläýÒc×:«·J)ïb$þwº­ø?mvóvñ çY¨7:Ƀ©NVÌœf7ÝÚÝË U@¿TôhÈËG|.ZÜo¦½¬”÷ÉCš­ÎÅeƒ6A1IOîçätÛHú†þÕœ±³žVð¯¾úJù?#7?Õ‘ì à0̱9ª'ˆ® $É6§"v*3¡²™q'#à>YOëäø_ø?r‚Åûd¡ÒæÆ¿QÀ0P¼ì§¥¤œgêFq¥ÓøÁÞþÕey !úÝvÇåùiá+Þj4!ÂH¢·ÿß Þ8¥äÕI» è¨ÍÎ`'¶ëÍFá®òRL(¼‚ ëáàò¢o¼VÚÕv·W|7Úýíí£^!ÃòŠŽÿïþçöÉñáýÔâCˆèõ¬W«õû“3°9lƒ=µúá´Óåþê7>Íf{°Gz»×£ prvåEL&ðë›;99U‰Là ÷]F ãl¤Qg™€Z­ösLÙº ZK'O’Ò‰Á™X ´ô44PŽ2‰+²œU#Dð)C.'A@…‰ýq;þÿõú&¢,üÉNezƒÐ‚Š”<ÿ†ð€¡χ2*0„™éZžf…÷o¯y~Ñn¶û¯L¥Ú¿Ðù—m^E††•þíÂW¤O3ÇÞA|ÚnofÝÚâ|V³³NÓ"7pçF¿× ·èsØhò|ïž_àû"Ë;%V$æot2 Ív+àÿ!R¥Óí̧ÓI³¼ÿèéWE@m&™šJfæ’©éâ3==ùdßÜÆ÷Äò²¶ão|ææÊ©âƒvÎÓlëèpçð0/¥ÎËëû”prºU¤Ä>R§*S‡¯Ê_üV§RÝ*? 扽™íߪƒñÏá‘ 1×½€Æà%]„g¶hPPJ¤«ðNŽÿ?ˆÿ1ßä¥#=ù'˜lmÎjL]Ö׸iü?ˆízŸ^ÿJUxtÌœ>úà,V;”Â$ZÈrYø ]•ß½¼ÞÇïò|¯b7&’Ú£Å"²svªøžžHægŠo|f§“¥Åd†°mzÈ na¡Ø˜M––®vNM×ó°¹w²}xV¾½”y›ìÝZü_ºè1þ%bŸŸOæ‹ç[›N>‚8°Ÿ…÷Ýô¨ޱÐçaý²¾ÓÎv:Ýè{»Óý~«øF§¹Õií¤Ã~¾Ûm£Í‹^¶}|ÔH‹«Ð°èz'§[ˆÿ‰ä?~lþ0Sí TÏœÒÌ3j8˜ÐÈ0ÐØçÞTÓˆE‰S„XdücðØ›7oØ>”hÅ@çÿã?þC¡I¸4úcÝŠÜàøÿ×ëÿ÷ööø×ää$¤æONÚ¯Äø²”Ý€ÿO? ¼€A/¤­6Ð;>óµ™+§ñ2ŒTŠôá½æ «@!H= ýÒ»`²"þ;V¯ðæh÷Jýqo HvüÿÓÅE½tò´›(àÜäÄô“Gà¯M$OŸ$µ©Ý¼{ÂêÅéZýb?ôßµÚívõÇüëà`7Ëß6?ìíï…°Õî¡ÙɹónÿÊLлšKÍv«*͹×mDþƒGB·Ÿdrê$˶[ú0úZ³¹Ölï‡ðê¼ñ.ËW.š«ÍÖj£³ÑMß6»o[íê7 ÃJ«ñ÷ÃýÕNŸ­¼»Ñ¼|`z‚D…ÐÂå}'§[‡ÿ¹QÄî }žœœ`M'rfzsþV¤€-%jLZ.KRû(X[„'òttô1ÅOmªŸ+6À]@eÀcô¦ÆN¦µ·¦BÆþ¸ÿÿ&þ?ázUÜOžZx³Ø¸Þµÿ?çÞ4cÑ:¿Ä`´/Š\SIQÓwòÁÄÔÄ$DìÉé©€‘35†”&øcŸ…¥EüœŸ«ÍÎð/Œ`ÿÌdd:[›á픎è½üÊ?< ñÇé7¦B䯹¹ýË‹ƒf}·UßËÛ[æ›æùV¯ó¶Û|qyºžµ7òtµÓZO³¡ŸœócãM« 1uµÝyyYßÉû[N2·ôîø¼Ñ/ýˆú}8þ¿CøŸ| ÑË“¹¹½vëõÉÑvÞÙLÛ›½lrßÙÅV;xèÝl¥ÕÙ/÷¬e½êç->ýðËó6q|ÖùçéŽ_o××/Ï“¥ùó¬ÝÌÊ8”f«Ÿv=¨“Ó­",Ù¬^ÊJFÔõÕj5þœœœl6›BçççÌÿŒÃƒÊMRPâM‹Ï%&XU¼Â'µçƒIT$V°$™EMü)`ÆXƒ¥¥%™²’üq;þÿxüÏxMc%¶ív»xeÀþ+åJM{´¯÷ë¦ñ¯HÒÂÉ?+{ù²0™Ï ö³¯ï1;ΪP~zízV ÓâW£y^¼”é•?UŸFé7'Þ¸<²îâ«tv~Y¸vLNlž¦Ýƒ^¶Ó뮥­·YñHÃçuŽïôê“æùYëæ›õöQÚK¦f¨Ý=º¸¸šA¥‰§p+}Ëûýÿ÷J &ܦ’ÆlëãóÉEÇàG\Û4H¡¾•ØÃ ž¥Hmê”{…ÿ1=.ËqI¦¦Ö/Î6[õ•‹“÷¡ÿºÝ|ÓÍ~ju¾¿l¬…ð:ëáó>„^Ô¹}VòüeOŸt%OËyÕZK›;i{/m%SI÷gVÓ»R\Gª.Šù€N1÷8çA¢Õà=zå䉶L!Þ_;=TÞ;Ù²ƒ¦ÍÐyÅ#¹h iiXRJ›;1\¯˜†”´D/=¢ifåâMTêHµÖp#zSœœ~)E%MA¬áK‰@©; ɨZÆ[ƒWL“Ë%Ú8\¾2ª—ôÉüv(þG³|_¸‡Uɘ¯X|&z•œÿÿ«'-¦¾ôÊ0ó­]}~‘‡kN2ÿÕÍèÿ³ÿ<ñÏO¬†°¥Éôd§Œ½èfØ8ª_Å„Ö{y»Ì }ãÓ-²Çß܉O³øôö.O;¡wR?ËCV/Áÿ@,èÛ“CýçaÄÍ"uÇí§nY“«Àÿ³3çyŽ{Xo\ü÷îP°>iü¼Îr~€â>ò"ÀN7_=9Ûmvð4{Å#LK¸”vñÀ‹$±xei€îe½ÙnwY…|˜ù"äù¦AÞÝݵÀFÎfâÞDe²sášÂõß|=m’ ÆppQŸ:IØÖ‹*qÜüŸaÝgX)òt¯—î…|µÓx_`þOâ]ß×›ÿs~ùS»û6„Õ~XÚ¯|^æ½=|r~(`ŽAÌ|Ó<ßÏÓÚóåƒË3VŒ;;:,E€¾ž¾žàU°Áƒ`“Š01\¯P̃…Ìq0³ ZèŽ|…qX4…ôjã0ÎÛ L§BÖ­éªL‰èÉ·ß~;tá$ǹGGG¶Wì­ ½nÊÊ#Ö:,Uª ÖMÔ‹tº„IÿñÿábÁ· {úô)^´Z­¶½½íÈßñÿ'ëÿƒ 3×Lã4SlÎóOÈdOÑ’¤úŸÿç½^¨Ûê´ gžÉdúñb25QÆ~N¹>jÓÉâRòøQ²ôðjOõŸÉò£Ü µ©òSÄœ¥ÍË^÷ðü8½n·Ýí4ÎÏŽ®Är-»%úv=޳³³»h7Ĉ_^bêï5›ÿÜ~̱\W"À3)lWJý-U¸ù pøæ²Ñ9ÎúÉÔ€ËY³‰IȆkÅŸ¢ÝôêÍÑ*P£ð)¡œ3déâÛvb05_@L«ÉG¦¿¨jfûËËËØÀÒ&ñ®DáÿÓ(Szâ!bŒ¶ÛÍïÞ'ß~õýéñ?/.¿oµÿÕîüØM±|¾áŸ¼êõõ‡~Jüßû©Eˆ–… `=k½k7ðÖwÈsÒNQ`˜µ'j50:[!ˆvO‰~³³³T9ªx¨â »I¿ÇÐ?Mü<Æ_SSStiVSúN$¼àh8dzzÚª q0¼|!Ȭ_D”.}øð!ÄL©^‰˜G1NÿöoÿFÙ““½¥®’êÖ0ȵ®Uó³·ÀKèF{ì½;9ý }ÑÕ\ªÛ¨F Q&LWIï…^.{ y~$¨~šËÄÐø_tï»Þn<~ü8\/mL“çvüÿ‘ø?*~Ç ðj2^­˜iŸÆ‡¹´YåËç}ü?ø\œ©cúyR›Lf&“…éd¾VÀþÚÌÔ7ßâû}7ý?këø^»¬o·;[íNô]|Z)>[m|:›ÎF·…Ïf·ÐøC ØkÕ/òÎy£.«C‘eȰšæ?£#PDï¢r¸›æEhçÔÄi¿·zqº²d~†àÿJO["·+n/ÿøðÿF7}}z¶Óê„uJÿÿ>=+:­‹óÓ™éZù^L EîÇv§HB4ðÏÄÆÂƒ"¸¤ÀH\èö†³°ÿ¬$l_‰{¿ÿžŒ-°¾$öà,fâÚÙÙQMI«vBShY¯0ÛDã8˜Y/d¿»oø?/Ý·°vî@T„„>3•ÌNCT(_é°ÿ§4ÃÚ4šøÿ?h ¸2t›ïû)^ùv™Š¶_”›è1'Àüü<@‚ÕÚ ê_¹& WjÆj’p'K‘bþ'KTäð÷Ûe¨µ€ò#ÿEt€•)‚qOBËôÀ‰˜ièeHhµ„»‡{ÇOÌI›óë$…ÈÓÉö‡ãÃÚ©|98ýJ"'|öì¡»f&&*öÞó­‘ã\¸îÆ—Tú,Ž*\ñÖZß> /UóÚՙѶÊ`ç½ø¯ãÿ_äÿÍ™••¬A€ÀÄɯ&Bn?}úô÷®ÿ;ÿ_ž/æE³Q ‚ÚƒÕÓý7{!ÝʳÏÎW›-`ƒìl‡pTFƒn–Q¢Õïõ´‡O˜½Íñéâ³–·ÿ~ðþ¬Z¡eÀˆe‚P¼Ëà*4 Êžþ¹ˆ<Äëïëè—%\ëYoâáÕÃÃ"Ïç³ådafþ ö2+YxßôÙøÈÏë,Å üm{s%™ž:)ŸYÿj|zµ‰¬"1;;‰I¾ÕNCef*9lã/–½°qQf]ìùÃþ@4ˆSÈá©üÑ‘T«J©ÊÒ68rwwWÐçòZm~éŒu$þofÙâW_¯ž…>Px2S[ï´¿¿¼ø¾ÝzЉñÎN×Ê@à¶šÃEÂBàgü_˜Òkø¿égÀÿ§Ç'|LxîZ»é¸®—AÔ4`P€0<žéìì,ÎåYòIÆãf Sðgl@Äc €Çââ"ÛÇKm>99ãµS‚Eƒ”S(JDrŠfŽA›è6¦V"9$[庛‘ÔOâZì<&9ΓÁatE°?éS¡è0uÃÉé·"L*‚vú'[%&?uì`žt{VŒ÷ÓˆF- m[Ö»2r¿ù4oœQõ¿äìÇí003ôÀ*iÍ÷íøÿãýáù0Pó+ÕÔôz'·urWüÿsþÏ *Àêûþâ$y²°“ÕBï'{½ÞÀ@³ý׃#llô6^µ:#BD˨ÀkŠå”x`3ôöB§ÓJ¦ H@ép±((6 Ö ¹ *w®ã‡‡‡wÎÃ6Ë‹íË4Offû½í^ºÑË’ù¹—WNÚHì'þ/D€ü—áÿ7Î^?ìíO~õ ÏñàòâÊɧÕþ/^ªÂù³Ãiö`ºVo´,^¢3ƒUrê…¢Ö«ƒtžøÉHO©‹ƒñ‰RfíïïjiÐ_tmå…ÀX  M¼zQ-ïûƒÿC™r⃹…ƒzc¯Ù|¹ûë÷»nw#ôÿÿzqä¿‹<Û?Çàÿ—Yñˆtë¬eÝõn#©MµK…C:ðÿAøìè*MÕ xÜ@„@æÏŸ?2“è§`0Û±FŸååeO›pÝÀ¦GS²4aòØáXc“üˆˆêÑ,Í ì%JN!{!†½ð¨XgH‚dXˆTDSÜFãZ±I»Ö'ÊÉé“I®•v.ÉE_/ §¥ÞA¾¡~íûȳº‹ŽTS˜*¾O®šjÅ‹—´]]¯)›ûƒvüÿ‹ðµ¶/ …”Ã4×rV35nþ Io…sKƒÿ ;5ÞͬÝ(BG“•úá«öñ^‘úã|½ðï¿ìfozáUšÿÐlo…áñ€eHàÏþøüòŸúé‹~çM¯ûªu±V??è¶’¹ÙÓËzaq(/MW+J÷áäé%KTjÖ»•7˜)V/óÀÄêÙéN?[í¶“‹ÿC„ÿüÁðÿß_ãѦœÚu¯’ÿôB¿wyz¤¯““Ó˜K›;{øž›/ÀŒu¿¡C¡N(=™‡z2`YÁ1, CÓ˜N!‹°>ÞrÆSSØÿèÑ#ìßÚÚâ‘’µ±<=yò„/_Ã/95t¸Ðh¶‹ ñSõÓ4=ÇNOã±þÏÉñ.Þúzýešn†ð—££7ýþÛÀyRùdW²d!ä×ðÿËV}'¤_=Û«Ÿ¥å9;Úý²ªø`™ÆsÔÂmE~1^Ùà$Öi)—¡ÐúOãÐe ,r.„@¥º 8˜!!ØIiÑÚ#ªq‹ÚÃ^á›+§–*Ñ ¾åöd}8ÑÎÃW¯^Ùžã*¶RªÅlŸÝZêôѸ%$nzµãÞÃB`­zƒ,¯Vâ>…FÒô&÷i¾|×~’SÅzÁõ‚9ÈfQ/IaÈb,è¤ëÿÿ$þ×TsWa†s‚UÐ~© ÀnüÞós¼þ¿p 9n2Yœ~Ý8zZ¯:E&ð¿œBø©ÓYí‡Z­íþÑl¼ÈòyqàU–­¤ùJÊïüE~ÊŠÏyÿ_=|ò{ÙO½. ãëvs'íl×/“院'i—~ãí[ÅìgÀÏ壴n·Q*¿[Nt¼§k7ÌÛËó—çgÉÓ§«YÊ4>+eæÆÕ4”Ÿ^¹óà¬/ÎŽ7šõdfú¤ÛîQ…M¶Ýj@è—]iš£ý2)“í(^^zx® Ì 'ÎçΧŠÞ2ÿ¡™-³É‚ˆŽ,º“«ªc—¾pÕi8¿¨'“Sç­V2UÃFQñyz:yüä/‡xÇ¿¿¬ã­ÿ±ÙÚ)¿•-ªò镎d½A8y1IV³ÎFÞÙÎ;Òÿ_Uˆè_åâ¶î´JîJŽ*k¾?«yrþÈW‡Ï]‰Ôl*rmèBTÔh¿à4ÃÆ-\QdS 7  .jY·Ò›Øv¨Óð"g¶0ðg°nÒ¼Ü(Ö'l]×]€œ~Šâ•¢Ç °exÅT”J_ˆÙÙYN{k דßâ/Ÿl·’ ‰;Ê…%fA)%þõÇíøÿ#ýl8ŒÿB÷d CÖ*£'׆þ²Ê Q˜_nLÊPÎyvF²­ ÍüfÆ]å‹¶Êpü_–ëÍÓ¬Wzæ×ûi²4³Ù<ýáx;y<h¼õ¯ÃÓ•Vë „Õ^þÏz½Xå{½7ý|8¡È"¸°ÑM7ÚÙ;@Êî•zy`è•úÀôMÚ}—¥[Æ~£‘LÖzƒ¤£ôÿQÙ>ÂE% Ɔòzñ¸†êE¶…lþa´c×ÇÍÍMm£‡HÕI¬Ä.^lD0Õ®û·S.¨_¶ ?®<$¦ÛE ºÇIm¦ø=Ù?8ê体‹Ë÷gçÛY¶Ùï¿M G¯õ<Çç§ËËWÍæj·[ýà¥~“¶W²âƒ7is5m¾í67:ÍGû;í&ŠvY*lÏû²ÞìÿF¤5½ªlwrrúE¸ ÜBn”5×bx¬ÎŒpåÏLì =ål ^R®Ñ lQ´;Wù¨"Œ•µâóÛ†{2Çÿ¿þDÇß z‡ªD‹üßž={f]X#ÏRl(E•=Œj%fRà̃ѵ€6—––Ô‚u¦Å)eó`ÝK«ÓÎVÇ]Ãÿ…æ¶(ãéd/mÌý雕³ƒ7§gImî¤ ûýëáÁúVYëó‡nk5ô’ù¹âóôÙÊù%ŽÙìäo»Ç’R(<„ËÔ‘Äÿïšýz³Àÿù PÿŠÐÖR51 EEn±´Ñià›<L ÍÒ׺ÓkQ-sÌq¤äò¯©`rcú^UI2 )àÅÚæa£µ¶¸×n¿9>^»($Øîíô3ˆ=/ëg¯ÛÍòÓþ˜ï7íú?¶6Ób@“ZBÿŸœèâ%xg=×ÌÜûìñNó,™Iv{ííNwâ»?ü¯µõý~j5ßùgí¿œ¯…ð¶ÞääÏÎ7ÚÝ7õöjjãKpÚ]ÏÓõvã=PÇt-í:0ÐöË \ÒÒn‡ëQo¬¤ÉŸJ BÆLî>›^I€A‰»± ®…ÿ(óv”·?Uô-sü-„ÿû'f÷Ù7ÿ–<˜š^z´ôõ7`¾xFÉôÔÔ³§«§Ç˜p{·þýî6æÍnžŸ,ÿÈïwzÙ÷ÛkϳöÑÅçe?ïU?c§0¼Ø_x)ÞÛDœÛŒã1ï}ò`¢¬î1½øJð×ôLYÅcìwm*™HfÊÏôà35λøüVñóFsP¢(¹ÿF$Î<”C:99ýJüo£ à©«J*°®ôÎl «-éhóú*(XÚËÅÅE.ëÁÝ UÞoIÁ §/ÿ3σv䚣Lj ghÝa!ô_>¢ØÐëUuˆ,þçk¥ÖC‰ï&º!É"*iƒéô–Ù{)šø¼¼Ý<¿3Á§7žÛy'[9OóÎUåîÐè<£>íò˜öàgwPØ»åÍV§Qf*j‹ŸËØ÷Ûêÿy ôí÷z¸NN¿ þ·ùó©1ì 6”ÐŽTŽÌðLí ¬˜ ÛÁN.îaà¯åX•Ùå ôøñã÷ïßkÕV¯°¦ÛÝNŽÿ[ü/P­Žñ-P!d!x&…Óæ«K/ŠåÏ&¶…lÂÆ¹ ã_Ú¹0.þ·_¼Œ…n§õ`qöÍÁNRKvß÷³dnf=/ŠþÏÅÉ«~÷_iãÿ;~ÿ:ôþÙ¹|Šô€É£Å½6òôÇ‹‹2Ъ ×ðÿL­5pé—ïõÇ©žgò :~õÕW³³³¼U^{ôèk}Z‡(ò‡'OžÐeHæBau[ßüG–^W·5§"…Ãîè#ù.ÞBý¿(¼•6:Y'—íôÉWßÒQÐXî¨Ùj—€íÿgïM˜ÛJ’-Mp_E‰Ú3_½*ë2ëÿÿfzÌzºm^ÏÔëzõr/¥R+)R܉•1øˆ“ÎQkB¤»ÁÀË‹»ÄËq÷ã»íöilWù´â:k§yô¶yÜçu<ë¶šg—cÜ{úôi Ú_•q2勺q¡°=ðÒ»wÐÏØêø%Æíêãñ¤~ãCÛBë¨Ù;휩-öÊÉþq¯óiìÿ¨ÞÑáçƒS ¥¤$þÿLø_ßšÄí^«yÖ†}ÇÔ—‹Î½ @{Dsóµæ÷hýKIüÿ¹ù"º¦}ûS­T _b®ºêI™¶¸ˆa.:üë˜àP‡GÁ§9¥Ë0ߥÿ%G€¹Óëž…ùzÔUûÍîN?uìJ?jïÇ7/‹³•ÅŸOOžô:?wZ?•NãîÆÿs¸ûtè¿ï¾nÜYoÜZ‘‚ Ïò_ÿËß÷ßþØ>'™©øÿhÿÒkþrz8ÀÿóÇCäyv‘jŸ(¤sêA¼íñÊdÔ1'à°ÔÈYÚ8W…Ë4£ê‹qaÑö³Ðlmmqå) à·#P™`}èÞë×öIç Ïç¤ÛU8»òrÑÃn u`á÷¤¯3Ú±§{Öÿ´‡ŸîÙ¥þ?å¢;œÛyʯ¿#ëëëçì4ÇÍß9N;­ÓöY«÷»—àèwüô~ÿèÜÃ݃>ìïöµÄþÎN‘"ð‰c£¢×õÒþŸ’òIðùDþ?šIAøí 8£ 8TèW¼\ŒHœâÁŠ>®S’,"ñÿgµÿǦ¦(°‡*J&ëØÝP„‘ ´é`v#FóÛ”¡wÐÕëÊ„êqX]ƒÐµ£Ýû<µßÐd7Šÿ÷ßöËÙê´ûˆq®ñdûåÖÉÁóãƒröÃÞîß¶^n—òKçô¼úíu);Úýgiÿ{Ûë?·Ož´Oõëß·^=ïõ~nµjëÓý±OÓgŒÑç§ÎÉO­ã§Ó_Ÿ÷³ ä‹W/cyä1ð6çR´õõ³ G'rëTºO­o½×­Ùó/à·Ì{‰iaŸ>}©i*¦‚2­¤ñíN?´ú¸Õ~¹ýæä´¥w»´¼ºwt¼û¶Ÿ¨ëø¤‰9wÿàh¼8ù3h!Gƒ(òî œüðøh¬A¸[­4“üíØÕ›òÅ$¦]3½Àülß6·¶´<ßÐÐX_\¾µ²Êöeßñ3>+ ‹ëË+Ú¹º¸ä_µg¶1óIî"]Fí)))ƒÿ˧ˆÿ·^ÆÎ§ÎßAÿðJ_Æ‹%þÿ¬ñ¿ j\÷#ðVƒt«.²Ÿ–ɵí˜ÁÒø²v/ÿHG¾ŒïΩj´½¶¶æVWÃç!éFì¸ÜpV¡²Pý0çÁ¯ÙFßÍ{q¶±0×wùÖT«;.,¼îuwÛŽöŸv[?Ÿ¾(Ý÷ß>kžnu»?¿}»{vöìèèéióISŸöà»ù¤u¢ÏÓæñÓ“£­Ó燇}þÏ…ùV(uB_fÀ‰)Cü/C•©MX J Ùö;ò «0¯ÀÌ3~Å•/º³€E­Í@SˆZÏÖÖ£fkyýÖú­Ûþ»œ›_” ……%}/-­è{~va¦1;Ûùœ™¿ò÷ïTK3ýÏÂÒ"c>³ÃKdqq1.~¥ýöË žoö¬›é£ô™¹A–Þ¾ý¿ÙjŸœ^I1Y йýLÍÖñá‘6:­6û?ÿgdåR­8ùSRR>ÿ*þO‡.²á?ÎÚ%,ÖÇu/"Ä"±'foLIüÿ9ðôü§YªTìŒ.=ú5æ*¢qúû“ÛÕ2󗊘>À45¶6pƼTvÙµ)̪„æôXȘziŒWöÙ9ÿ?¡^waey奙•5AÅùÛý Aóóf’9ßæ37øÌÎ÷ÙæõéŠ. ¾.&¬8À›+«}ÒÎý·¬ÃNĽ¤2Þÿ‚ÍUÑ…÷î?4ì_^\àçu·›µý£ƒc³þ Ýiá·qvvNÌzÖëØ™ãäøP-z˜°¡öì?;W:tÂY³Ûy{xÐ_h·°ÿ·»8¸ܺu ,æmqJ +žY܆¦Z.!X»RÐèPNô—ïå"Ý4QjB÷Ì;ôÁëÑô>i¿·þîö½•^óô˜î ãÛ9ÀçwÛçºy?â~àÖ=ëõ#ý›§gaÌŒS¿#^µö}ÿ¼Þʆi¾Ò˜’òâ”yĵEc7Z Ô(3¡Å‹Ëè8ÿOÈÿ•’rmðE¯ŸVVVl@‹L“üû_vûöí2KÞ»w/ÆËŠp)» i¦³o¼xï¸ók¢t³â”aÂSÏŒ—áÿs¸:u»EšÍ×™‰\÷›'ç¹ô§ µ§Gw%Úº÷·Â1GÇç:Nù÷ú” íãÖeñ€%ð{ƒ§lgûÑPX]»Õíõë¼Ùlÿþ–)XÏZ½æá)˜nðKë´u2ø¿···ÛíG ôÚíæÙùq=mî†z²Ùêui'Çlìpȯ¿þ•P:x\)+«Ì‘ů¶D9ÜÆˆÝËp/_¾¬<ñF•ôr1geôõº*€ ¯âNÕžÞ¾Þu«uÊ{oöcÄ{o÷5 ½qK8Öoªž{GGÕ{៶šG‡çNbí–TBý¼ÚoÒ¼3ÞŽ5Ýãæô+•ºçœ¤ì¼±z\JÊ ¦u1¡÷’ãr|ðìÙ—~o!¾n†Ví"šÎä˜)‰ÿ?ÿ—¡§vò/¿ ¼w~óæ ½ R]è_r_zÐÔ°| ~÷üùsBã¥#¨3ž$ÆÎx¨Ìž.¤nä‰Õº€ÑNî7V8ø½óvWPQE>§²ì³´»»7^ƒ8«k¸]£ï¿4p às´»ó{ìïŸóûU¤×Ó-G'ÇÒÝ¢Íü`oÿäèØvÚþ ü«Íç¯_ Ô‚=ìÙ³±Ý úí7ã9£†;@z¯wÞÀ$äß»ø^Õ­Õ˜s4.^ýÂŒX‘Þ“>í“NaÝ0jÇêìwËá”­­-kÔ)'8÷Æ¡´Â½6ÚZ%Àm@Û[»;´ ½ÜÓNûœ¨}º¨¡'@ßÇ퓾ªX:­~BÁÞ³­úÖç°{zRú{Ü,âp_"‹§*•!DøÃÈÉ[†()))Wí#…8;Ôù ¡÷îÝ#!Žù<ÕUu"á‡éœ“rýð¿½ë£õLûOG³· ßÇà®ïÓ±¿©[ ¢Ø¢E?ª¼\^¾|çÊ?ÿùÏNÚˆª q{{[ºƒÍ澩Nt᯲‡o=é ¹Ö „ë<¿üw„n=ÔCΚ'§­ÓsÇ›˜Ø‘&ªŽàjfrv;ÿå—_Ê8z%f%+¸ôÐþ­,°asqt+­®©Ó¹Ôõ+cuجKõN\ÞÚoS‡H `ãåöVw8Šíw‡ßú÷õ®~êíŸèÜž>»G{Bþ­Ò‘vðòõïÑ7æF(!T'¶“˜`…–ìâñŸ Ž®“¦¤¤Lg&ÂäXBb#|‰½P(¬r÷î]\€ýÈÚÚš¹»Øe’Ô”ë„ÿ=û¸©¿xñ‚öoÔÍñóêt ÌžN ëÙmggg} $ з‰p5U{ý+|®_ï߿路:LwÑeÊãØd|5öa½?ˆÝì{²¡ï{›wgQÛ¯·ú7\å‡97BŸ›¢/üÚiµ±9ŸGv{Á8~hŠ TE¯šr™Q—h´ SQD§*_¼z¹¿ßWööNnBz'§§-!÷2 bdk{§ÝîÖ](àÿV¯+`~±¯ä¾ÝÙüÐóa¨Ÿ*›æŽÈÓ>ªŸêÐ8þù´êVÈym$_eÖ&#F´* 7R'‚úã7?…yœ¿L;aÄ`Z?#ݳHøÏ;ý9:>%º¤Ÿiâø€tçí›n·Oô‰§P¯tOø‰O³OÑÚd„—«zl«Ì„T¿ÑÛ_%'\‘sÕZ"ÑqŽ))ï%ôšh–ŒûaÉ+z2sNÄ`ùW@"=ÿS®%þ7™-{À*äœ2Ã-ì”ê8 j¸éðó‰”5fž‰AÀõ÷ööØSÝ©¯q;Ovlb"m°Ö0Ö¿bò[€Œqnf–ˆà~ hßp!ÈïU9ÆøüûtØÀÏ£6tÝ¥ï5ˆ ¼L4é µ.%AßáL™ 49ºDjà;wlñ>`âŸÓìvX&4¼^·Ýû]oÓ«ïžuZÝßßroLç)Ù>OaŽm4Ôxú2ƒ7ºß_e0¶ÔK—®J˜ìŸÆr#í˜înhä;’E³á^;BßGýìŒu.瑹±¸1.eÂ$|Öçk_œÜÛÚypp¤5œ«¥,/¯¶ZèP탃=÷÷ã~P@£Ý:Õv§ÝÔÆÉ ~¼ÕüÝJ ,FÀKEß'ï^ŒVbHcàåzôË %彸òèÑ£2t•4ÇÒ˜Z(ú —¡Ï@ß²4ôÿ§±1%å+Åÿn؆U¤šõÜFµK1q?ŠQB±ËØs#Tšê“¤ £„º;„¤ Lˆ¯íýÏ9|ü3ߘé;ŠˆûÎ+øXùN[}çÞN¯½óöM PŸc§£ÏYÿóû§§Çínëì‚ÇH4ö.a,ƒU Š+ûïÓ‘ +€DK8¸ñìî½=xõ¨KDvû¬o¢?Ø;îcõãöYk@ärÐt¤°Žk7{ÚÖwç¤{²|‰óO9n5—×ûØþpÿàÞí;/ýM?¬-,=~ø(ÒA° ^ªøôŠg6r1;LžÅhé†x~"‹´ZŽZ>Y&Yk³.ó;»óšžîê‰ÒZý¤ø÷_íLc^Ÿ ¿sq~åуoÙsrÔÚÛ=d{¦O¶0h.½ßêÝ[{o¶Û—T±­ö¥åÅFƒoíé¶;,‰º$¦ÿŰÏN½\çé#©Ÿ YqŒØÍÀQ)))W·Ü¹s‡Qó¿þ×ÿê(Eû*ÌÏÏ«?²­i÷Ƀ*ÖlŒËJ>ç”k†ÿênØš° ­Õ *®xd[¨¢§kÌ fòÿ¨DÚ˜0àù:£œ'e˜,ï2~ÅËðÿ9Ü:9íuº sý™½9ðÕi¶OAõížg¿Bþãðÿùþê³?p'>ø–ƒÿÏÞe™´!b‚ “_'^÷¿S1—³¹…ù•µÕv·str¼ºq«1Ó˜Y˜'sfÀ :ט¿·y¿uÔ'i_š]ÖNíùæÑ·ÚÓ:m븙>»ë‚ŽùËçÍîN?€å¬¾w·:úìí¾ÝÜÜÔKp:R¬\ÂO;ûÉvQ.úíØõÔî©V­hx09O~7XüSLLs[ŠÆ ¢hI)¢ûŠ÷À§_oq~iyn@{Þo÷o?`ŽY™_ÒÉvþÏÚ-T}6VWT§zU}Ìßl•n¯¿ÑíuONæffÑ΢ @ÛˆC¢¹ÄùI×p…48+ f?Ž#aJJÊ{ ±~ëëëN¨ouÏØ¡èŒÚo?g¡ ÛR<ŒƒU"¼É%€”¯ÿGN9GõFDZÁ˜)Tíc|§}¬9=(®_AôeÞ»§Þ/èBâ€!Çdû1åax¢Ïð‘ èÙy„Àô¥ÕØo•*:o« v ŠM(ºXŒ'­U™(¾’É*1K6vD)!Øpì°omW.íŒYKXiÅj4¸£„u"¼#>Œš†2à6Ã(Ë  Ÿ´K}c&Ø~mYp®ÿ°gö ´ÂÛ¤ˆŠ+Ìî~64ärîY·wtpm>?þÕ}ê2ü_m[‘)8×áöV|0ê0álªmÅñ%ãà……7 磼C.üÿ^ˆÞ}z×Äz÷3ñž¸%œÞ½{wg{—=z§3 ‰R)m“íkf˜AŒ µ„þF¯¿šˆÆaÖqnç 5 • ÷E‰ÆŸð‹®FV&<¯ÇpbiÑ+’•G§ä_:,)¶ÏÑ °ÎÿhãŒXPæh&rý;¥£ý±iÕñ`›Uc ¼#YªÜc%:{ÓËÀ{VŠc:Ë”›`ÿ½ÆÞþ´í*1GÕÔl¢ÓrJÊuÂÿr Tp! ß–P úò7ß|C¬âT nH• 0™B“ޝžñàŠù‹ˆ QÅ耭b¼‡á"ÈŒ ô"®Îap¯S›qÇËðD)DtXj·C~åŽT‚q>Ç8ˆ€câí§¨¿Þ/|2¿ûÒ¼IY£ ÀEÍžôÑHôy¨øN?Ò/…ÊT+•šFö[È¡Uøð!¾7„“¨ð÷îÝ3Úo“6 BÚPŒމu Û:ëÖ­[ÔFþØB¨ W¥]æÿS.RôÐu>q'Ýpee¥ üÃé›T¦†T Bîß¿ŸâfÚÿ_¾|é„&ÎEâjÁÖ•Ÿ*;¡ÞltÐOÑÉŠPêDëh~w{ú œõüùs¿t;tÅÌ)*§”0*/7n%n´s]¦W½#¾}çp¬xK@>03”á",fM!ˆÃÞJ•…!ŽŠpœ:ðAÛj«Q ‰U³³™Íqî£Ö'/ªQo̓ë>ÖÅ¥dgUN¹Æ¢öà\º~û±DæÀØ5ÿ§\cüu(°~øÁ^0fX4ÍM™8*§h Ë“!¥{·gØø«Á^]@#¤÷h·6uX†Œ î§¼#¿5mО>}ÊÕŒa&?¯s/'ñ¤* Ž{4-–NÁ1pôD1xNáy^õƒö{Ó¨• Ž!ÆùËZÊê~³!Åõ3 º÷klPdØÑ—á®is\œïê…>%bcÀy•BÂ¾Ž³„`eèI^‚…ÍGšn½ŒÍ؉©ßP–ã—ãÔéÀ̳)^©—Ùÿ}ºn-Ú(%ñ„îܹcâ®l‡‡8Žqºë‡ æñ²ÎæŒY¾ ËE—ªíímžÔ'>}ú´ÒÂì¿d'^öDuFß*vßõúbd÷ÕÁ¿+ÓW †UfnáU 6¤¯E/ºg¨Úi^ øí·ßx5\3¢k¿Ó qê$ù|/ËOa%Ñåw–yçŽÆIó߯wáœV®_âj‚úÅèêÏM›ýUÀH¼°œCÙV|6#Ä­·Cw nùil´‘Õ=lŽË¦Ëû‚V £Œˆ×-ü*^ëŽr#ÑwïÞ¥!yD¢Ëë²Bø1´ß6 £mŠŠV«§ÀMg1úiŠCj2Ö­ _¿~Wß( ÜðŒo,v2§ôd·Ÿ ÿ³¼‚Û$Ϋƭ ÓwärÎ5vBMÀÍž+8B(7t$„B:ÆÑF\ §z“ ½ÓY½Z¤°û™Wb£›Wê¡u–¸bR•M«Âd˜A¢®ÕpZ¸UWÃý«êGŽƒvÙ,ωüÙhêQ=gƒ§<ߨu±hÿ÷BüèZ?v¤*¨0ñÊM°ÿOP 4ÈÉõaARºMø%ëÙ–á$±Vipp\ ЇMšÆÒ¦LygüÚ§0D\6zú÷:7èUòˆM;ù›sr Kpú2N†v7*aæ ÄÁùÑÀ2á¾pR±B‡Ao½ÄçÏŸûRSè×Að‚WäJ™x3%%åë’Ú—‹Ù·=õhHÁ5NF«íF˜ë†)7ÿ#1oûÇ–‡6e‚èýÚÏq1õ³á<öÁ˜Ì×ÚOÖpJÊÍgÒq*¸M^0ði8ŒR…*ð–’r½ñ¿§Z͘Ò677?LÿNt¦gÇIžŽVásCôÑT5e˜ÄÖæ¾ød"mW¹H5gè³Sùö¯š·ŽS¹V²,bÕlBþ¬”?Pp°z\¹˜Œ,f›­p8G:5­SîJ4“Ê-ß{JJÊûн lVšÎŸ´ %þŸfü/ ©WÔ­¤Xô"ÆmMèž¾] /^¼°!·Œ$ˆ¤/³¡’D«¶ùÕ£p{ Åÿe˜éÞÇdTæ—Ä®m'P%ê…FîeØYn!_,9ZÊU„$\t:©lUÿõŠ öyuŽ&ã°M€žî¥¨|ï)))ï+d,5`˜B\~¡‰ÿ§ÿÛ¸‡ï:¹3>¬óÍé‚è¼ú޶ÁˆÀaŠL‰±w*"µ¾W„¢ïXü¯Qô=??ŸÆÿ//G˜ù“b»Þ&PPWp¾Lžâ”+Ž9óíH&]€îÉë†^Û‰zõ–ïß¿ï‘!ŽùÞSRR>Ì(aäÆÐ(”¼)‰ÿß ·ÛÿÇæôqZ]]ÕÇ_½ze^G` †-JgŒŠ˜ßÙu .¦+•Íê2üÏ6mnnN×´BÊ!ÙÖˆ.Ñ+0®ÃCŒm»‘8Øô³i-™Qÿ²iËÃEŒ+\׎ý0ü[œí7ß{JJʇ J&žþ#y¡ÿO-ÿ§S?{ö,fËýxüï`Ûrѭפôæê4xÐé1-gùšö:ˆ£ø_çÂÀã8ßG¶Ì/&ø{4²Aþl¼~ƒ‘ÈÑž]9TNÏ<ë—ˆ²öôéS@»3YÛ·Àƒ“@Þ©.ÂafÞˆ ùÞSRR®ŽXØT°{ÀÚÕ3/dâÿiÆÿ±e~€ Ðeþ?–ÛÇàAhÐ;I‰5Zÿ€Ç–Q÷2ÿmèvÊ®÷åÇççÏŸSùdI‹´Ì´Ü„Pë¬Äh‘”?üæÔŽ#†Þ”­Xû£Bç5¯Ç¥ò½§¤¤¼¯D7BÄ–Æióÿ)ãòåLü?=öÍ¿œ/--}Ø#Æÿ|qÝ(Rt–‘LÁêÅ8”a¤¼¿{ ==æ,ëÿOÍ—@žò%qcÔ 1oook?®\j$î#‘A C?¥‡äT Î?ô;Òm”¡©qqôþìÙ3Þ»|¤áe¥³] |ï)))&¦ `T™Â¼0å’üD)‰ÿ§ÿ«ã8þÎö:•öƒñ^Åÿ{¥u0~ üK]¡>Hõ0CˆÐ‚ ÁãÇùW¿êýªctmЛ.³ÿSóUF°”/ Õ¢ìðzõꘫ\_,…\Ê„—X.²¶š^;*ã1ƒ†!ýhZ ú¦{"*|¾÷”””÷lŒLŒ'‚dœ6¹,?QJâÿi°ÿŸ3W±™KÿX±Ƚ¾¾Ž_ÇÂÂó»öÓ ÖÖÖÌá©_mÆ×-tÌÊÊŠº6;ùÚ9;;«#uwœùÙCWÒ1ÀKc`'ÿj@0oa‚Š‘h§-ͼFn¼Ffa¿è ÍWð‡¿¯HÊ:v¼ªt±2`âºsç}óÃÈÁ®°ÒáõÍœÇSRþpˆåСQ»¥óFê*»c]\;¨pH&^!®\cÐ`(€æ®Âü“Sÿÿáø_J´]nÊÀÍþÁƒj½,®¹¿3¿†ŽÔÃnnnZƒÐávnÁu%/øz˜¨°jÍŒt4ÃKØ ÝNt.×4óOz|ŒèÝQí¼è2`m™§\dn‡û…aÓ/ËÛ)àû*!>rΑA¤FTë¸Ôétt"_öF‰ê0.‚ŒÕ¡RRR¦ÿ;3¸Ä“ºp•ZÈu@hÁª½†A]ÄJAL]䉬êþx±Žò|&þOü?µøß=‚9öÿòåK@5ö®+š¹lç'Ýöüü¼®IŠmÉ••ú…¶¿ýö[çݦ+©–p‰—Õ¿ÕNJ¥SÐM¢{‰—Õ gggݵZMòÂË š«·o¦÷ø¦*­Bj#kò}_ž¼ž£Öã%Ñ”””éÁÿ¦ŒP\àä²ÔBx&ØÎ¯ÿò—¿ðè"ö[ŽkÙ¾¦ÇÃÈ}QB(÷$þOü?Íø?NýlcȽÿ~eæšì¿áh—׌"ì1«ýš==¥FŸ:©ôS}{†ÕS0í´ñÍ‹ ›››öЋ{œ_¸düïGˆÞ`ÒDîëëëvøáešy‰š‡Ñ\-™×iÞWŒÎ ¯ö‹ÿj̲©ŸÞG¾f»±K94lU–ÕLº¦¤Lþ/~&¦Ê*…"ooÆÊÏã¡FHõk(Êõã'ƒ^ gÓK÷÷x¨¹Bå/ø?ñÿÔâÿ ÒÇ52Ú­aÛ;M^<²´fâa¾µ>®Þ„ÕQp A[øð¡™r9raamX]]õq›«ÍÎÎrµø“c« S—§|€lllèŽeÞ/È;yAj~)ÚàH^ûSþØ÷E/`[/‹ÃÔ=yq~S¼,:£¾£m>~ÓÄO­F^’Ï*%eúð?p]]5F-Aþøñc»"3j¬ÕèÁø{÷î1ôÙŠhâ<#§v‚”îÞ½ë©ÍYJ¥t¬¯¯3VpdâÿÄÿSžÿw¬ØTè˜ú öŽ1ë;h\Ø Ž`ì§Nô q aŒб! Â=qq ׄðÒ}T·cp=h\ŠúPЪña¬¶AŒzöÑ~NÔk÷õ½®A}Z=*ª~X ÇÇJP ¬êÛØ>c…»ñkà ;ùfª`§aÄ{i§oŠPx¿¸iSF¤G0>PlVLô°äÆÎ놞ëÙælnöϤ|Žt½ÎebVÀ*Iÿr5½/‡¦¤¤Lþg¹ß Cù¶£#NrÙêª Èɽ':ó0‚E¶Læ#“¦ý?çWÿ휃 ÇävûòåK/" »×İz" ?a9}õ¾û÷ï³xƒš­¶\¾na§±>ªÕø‚ì‚èʯœ7ØŽNà„f;+«O¤0îÅ[Œ²€~u2šúÍ›7BÑñÙÙÀÍ$–èfS†I(à‚fÐ8Á(c ^7ñeàXâyN¿Ë1®pÜV« ¢|óÍ7S˜gÍ®2À{[ÕÂÓ¹¥9ÂÈkŽ:€màa‰¿£BˆúwbŸ/»ÎX±Ó åqÀ‘_ºš‡d'£RR¦ ÿÓÇ?~Ì€ÀªÑ¾=œÅɃԋ_¿~ý׿þUÝ\ƒ‰z7—]XX`€…`¤ ]ƒ ª n­ †šH{žø?ñÿ×…ÿíÌïÄvWÁQF2Ut!½o¢OKÂc@ x°bn°BPÁìÚôU‹*p~~ÖM‰j4×O?ý4 Ñí^.&tðèA£jÌ+§£1ÐQ½xŒs»ë'K@ š£s3?hv¨uT©ÜYF•2¸t¢1Jõï‰Ø@’{{{¼â¨zhW¦Â#Ã’JËêßìÄ/e ëÙ¼’ù‘^é>‹ P嘚„êšÑN6êõ:؇icòuÆÊÓ§Oãíèk&Uª:ÿSR¦ ÿÇ5Çû÷ïsŒÆg±Õ¨wÇ^r©;W¾¬:Ý0æ·ß~Ó½¶¶†?¤#uðíÛ·¡¹{÷.v_!úQ'þOüÿáÿÈ¢Y†)³'øÿxýiá(ý n˜FÏ>‘Ä2xŽ §êŒÑ@ÍM¿övÅ3Ú,ÌΘ’ÕÄzX#.׃NÖ’­¯¯¸j§.µÿÚ),ªƒí5TB©uUöKq³Mɬ8£F~Bh]üg&£é¤¦|úô©+YÓ®š±ªtyy™zêŽ3¦ªÑÝÖëP‘‹/ºfÅf××Ô{œpwŽ'\“îVÆ1„ä4—’2UøßûêõÉ`îÙ_ƒO•lTÃ…Žã ‹‰«àÿ ’© ¡Î1¤ñ܉ÿÿuö›Ýà'ðçÐSX߇n×Ó¥ö˜:Ût⟜—všÈ¾x-ùº^_‚éÏóÅÅEaÕ6`Ù Ú Â܆¨ÆTñ•E­Xãê:TæµQ¼Ìãi9pœ—ú'†wÍ,ÑŸ‡j,GO7Ú¶Ã[Õ¹¬šQ··nÝ‚x_¯Ò³Ä +W¦*‡£O]yW†¾?¶ÝºØ<šÉ±á,5E§~eéÐÓ®ÞU¤š´Óõ¬öw_ ‘ͼ9zËÊ©·ÀÚåñªŠ6´-Ýô*|h)))_ÿkÒÍlG¡ÈkÁ¼é¡Éï`ºx_¯öúH®ë([úÿdãüzñ?ßÄVWyd7þ&ñˆc–7§ºm›Ñ}׫êî’ÎÐGØo dc©fd@åîb0ìþ~ š–и]Õ¥jä¡€4Ôjô‘à¥PKª7~ÒÁ¶l0BÂuöiyY¿êyDc¾ÚªjlssÓàŸj÷JSlfü«I‡ŽÖ€ê¿Dœ/"™¼Ñ¬:ÈgZ›á™@¥°32”`l·Ç”iÇ`ä‹GËËË´|ö@©tþ¿ì:îUX·—fX,°S–42G{àÊ))ˆÐ[+nuRS9EËe‰rœ„%æ…ºÇ9LÆu —]H<«£ÓX5cæDRŒ]† 4zDÚ›GØæx3vÑ1•Ùÿü+B Ñ‹Ñçáêøß‰óè°N(PBäcðkEK¬ý{+“f4š­Q;=§Ç8_£‹Hü¾vÙÛÛ#üИE@®úd¬¨F *ÍUíèQí^‚-'þç_ ïjKú7Fx9”Œm½w¶)5rÀ­+<^œo4S¦u[½Nâx*ÍT]¦Zrå@ÄgLþÝØØP 7©¯7<>Œõÿ¹ì:åâêóiì~/¿þúë½{÷ÊpA_W6ÅwJJÊ(£‰fã·-krÒ>@C½Ç “3W.@dìØãh8(ÈJX0ÿ@™CRõCÜe –‰ÿ±qF̺1p0ÓDÐUm»GðšÊ»Ø´®™¸Ò¨dáv7<µ^fU³EÓVœ£cڋѵï±üŸ®3p! ,‹Y¡í:È5Url7S_NI™«‚cj¿è¢ùNû¿º¶ …“ªUÔľ Y:ËÃTmÌ—³ó°“¹‘sšÄ¢NÁMãx(¥Æa_É?–øÿóá,–jš©™'#–±øŸÆŒÕŽmfرðÀ>o£¸«ê‰Õš~ÌÙaÊ>‡ä»x×À_N@ÿj̹,,ú0› bMb_][[‹ïÑñ76(i,þwȳéâ£sˆ*P8àËô>ñ:ö»Â±öÇ»sqÌ××ø8ñ´«QÕâ¬Üž£=£±aj£HÄç>mc»,ÿ×e׉S'q¨~‘$ÐÊ ô¹iüOIù…ýìÆÏªŸù~'󇬬¬è,ùFþº W{±Œð°yzÕ~F›ÊÿG;cÄ“iH};C¾xñ¢z.؆ãåŒ庙$þŸòü_ž©¯â~™ý_mÛ4†:`ii‰ÊAŽ<~ÚˆÚº~Š^+Qõ&š¸ "Õ­Xè¹¼cþßë´X†j³x¡PÆ‹_ý•ÑÂl'ÜøîÝ»ï$wºø¿RxÍ·?ª“Ú8CÚO@¾&‘š«ýöÛoU³¼Þ*˜ž_>l_<ˆ“£uó˜^§„^G¸aëßÑôa,ÿÅ·vÙu|£8¸á+)UýŽð-Ô %è~jó,§¤\{©ºÞî@ðú“üéO²§k\ ¸Lì¢à1‘ߣ½Y í· aÙ7¢—hä_M<^(VÛ£J +(sDÖgÕ&&)»Q+ȉÿ¿°ýßåÇáÄ^4ï‹ÿËÀeEÍ^š8*y‰Qú¬³MîŽnD+·³Ö9:ÊMèzdþõàðçÊæ‡ÄÕ©4ç7qýs5F¡›éR8ÿÛö¢š¡Z0ÑhÛTTx³Ûo\¢ §ñ2LЬ4=þœ‹jFÛW¶šv-ÅqvdXˆ=”ýªöè4E’…2›aܨ±2zU›§¿sͱ׉=Hש™Üqœ:ÜW`´¡©äú{JÊ%ö÷³UÜCŠ~bÑ7CÁÙ%¢î$Œp¬®®nmm±MD¤æM<L¡b˜M”̃”RGí1#Kb<#×ÄÈÏhžÑØue;g¹FùwÿO¡ý?N—´ðÉq þW±t^™oÌ÷‹Ö-½ÓÎBc±¿SÛ³™Æüò⊾×VÖ{’¿µ¶®ïùÙ9ýÛ:mÎpÁOú>><Š{Îú…>{ûú^^<_k›Ÿ;»Žø_ã˜ßô&l8¥š~õvEVè¥ñD£“µ¼ëíÏàõY¡>?);ò¦:򮮠ùŸÍTc‡RÀj„¯—‰ÞH…`o o³J¼"ÅŠ†™ºMÔ˜>¹–ùSR®“ݦ+½ãPo]s$m«¦?'ÖÔôÊÔà“û.ž øWSë‰æ<Ѱȇ¸ »˜W|ºFE,Ìì.˜Êà †%ÿfü¿½½í6†]î<ÿ÷Êñîqÿ«»tú°] €ŸïvÎKzÜ>¤~—î÷»ÓãþÝg°êõcWÙ373«.¦ýë·úÇwº«‹K\DZ¹~3³a7¹fþ?X'ÀKäMP]ypӆݢ®¢Üaü×®÷xÂJnÌØh£.;L’Q ²a_¯³ziƒ¶äàßw:Mýøã ÞHþvÓ$Zþ™à?![7ûúé§2d·žÎNWANÁ))S…ÿé›1o ‰Ý5Ù9Á§_†ÿûc M”‹ë}šs5’G> FÌûÂ^íµCQô[v™Íÿlÿ ŠgCÓÉåí*™þÿ‰ÿ?þ÷ÔV9ë¾þñÁ½‡{»ûë«·ægf³33sRš¥šë÷Å¥m7fæÎíW\_=8m©½VGH '0¿¾¾Êþ7»ÛìY\œßß«‡î¶;·¢ÆLˆ,¸®ñ¿z"†Ö"K Ž# Ë…°£\Æ{¬_+Ö‚ëíÿoìýÏþ³Œ#!DR«öô 4µm'2Ì{ù•kªLæ—ŽºXÅÔtsGÙJÅžf3]L‹3UR©0‘î)%%eJð¿;©ubšõ?ÿùÏåbö öO²¬÷邸älllDgÝQ¦YÃ.@àHdöÊæ£G87š›.Ô¦óó󺋤+++Ñ+µjâ”ÄÿŸÉÿ?òŸ¨qN¦¼‹ÿ÷Žº=µíYt}(êñIÓÅ~»w ½üt|zrÒ<ÖS4Û§úîžuôÝ+]}íï¼ÕÆÑÉ¡”‚{î¾|ý‚çø'² ·ÀëÊÿY†I@\æ%aŸñ”M>Ò8öÚSÔiØ`N•Ê­ÝŽUÿY £DÌ%=UZÉÓ§OãaqÑᦉùúüͨ¢Jvú³©Õ@_ßf¤ìHIIùÃñ?i¿ Z̃íÈò¦Â‹ÿµ½½½M¼¯ eN:À >Ñ0ÞQIÈS.r‘Ù¬ÊxR…ìù.*¡¹&ô«m™ù7ñÿçÆÿ..oÌ4.ÿåÍÞ[6Þììï±}ptè§è–Þ‹í—úÖçàôP߇ͣãö {:¥Û쵴јÕûÏÉý"¼¿®ù¿ 1¼ˆÚx'’w’#޼ ¿ëW-1»™3JGÀé`j0š¦£î Ææ†d¡+:àüsÃ-6~žŽ%<ðtéÉn:•n§ +C¦ÐœéRR¦ÿG¶)=??Ïð‘¶c/³ÿs5;äÃíæô"V+|Þ£G*Ë@4œZ=‰‹ÂV˜_œP  22ï·óg3Hüÿ™ðÿ³gÏØ0šl?‹ÿû˜ÿ`¯1?«.÷|ûµ¾[½îq«Ù”yÿð€Â÷JYµ:m=ÂöÎÏÒéõÿmw[˜ýõo÷¬sx| mâ´u¢»{;[o¶uúi«±¡¾vÀóL}Ͳ`¦–¦Ã¸W!##ƒ¾'û¥hø²1S×;¥Œ.nÃX‡XᥩTÄ’^Oq¼þTVü.X—Õ³×F•Ž›#žÈXlr oll0ÓQW~;Sèÿ“”ÁìšÓ\JÊTáÿƒƒƒÍÍM»ÂbÔYËúÓŸÊ0ñwÅ Tᨠ‘.¯ýú7.—[ƒÐ6·ð4JDž.ë•_O+c¶O¼L#õóK´9Ø`ŹvjšB IÊ5Ãÿ1Kš_E®uEüßêôtó øO_þ†c¼€ðüåËçå<$¸wp°ÇÆé©°kGø”{}z ócææfô­Óû)Ôƒu«ç*ùÙyȰûËñéÉõÈ®Dúï»wïúéÜØxeÖw&¼¯ˆ^tØt]?¡Øá„ ÜNpìdÏÖÖVäƒáÇ^Õ$Ù#ÑÄe÷uÎmĉã Z’×Mž={¦úÇ–´£Y€§ªýŒæ%¿±)óRR¦ÿ—¡ŽFZVowvv„í½hî2þ¯ §Wßëùóç¶ 8yI7:ÚÙ0(naÇÃ*¢ŸØ ŠQ(FSɧ$þÿTå7€´Ïƒ$Á)WÇÿeXª¹…Ù† ¿0»´²Ø˜ëou®{é;ífS€ ôƒ|·_û§Ó¡  cô­³Ú­ÓÁŠAŸZô¤Ýj—³±PéôºGçÙ—úLAý,çÌ¥ú‰U†kЮô€fø,éÎÊЈ}•‘Á¾…ƨכ&rKº¢ª 2lÀ´°¸¸ˆmÇáÒlÇ ø“Áªç—;|óÆzݼ–þß³„ ›+ºíÔ>EÌ×Sn$kJÊ4ã<¡²@hÆý ŸCœ4uâüWÃ=hG§ H\3Ž`œ¢yÖ#†½mµQ±÷x~©Ô—*ƚŠ%%ñÿç°ÿ«%»ÉŤº(¹ÐlFä9ÿvÒWWW®põ,ÎöÙêâ’¾Wõ=ùske•µ¥åóss‹ë«ùFcavneéüººæòŠ.®Í…¹yîØ=ëÇ·:í øÄ˜ðs{˜|Ò ð¶*{¸°¡¸„EFâ/lj€‘Þ5üÎAÀoжžqÚpi$Òôb„ éAwjŒrFNWÚ$¾%Ô3ɶȜ®6à.3ö”Ö°Ÿ Ó8TF›É”ª)WQLï £þeï%«+%%e‚xœg<Ò·®08;Ü?ª}´'ĦîÑ,œ zG6ŽûyÁúݼ×%ôxþŒ&¾QûãÅõSŽš½3Šü£M€ _Û«BœÑ;ã€t§¦-mþSå—‚ç’ŸÑ>á¼ÒW¯^™°ˆZu.W?lLØT<-1ÏW¬á˜N%| _ƒiÙ-<×[?Xœ„×ïè²÷’’’’2a¾vN.ƒy[øïÝ»“wÎnš líрϥgÿ8oF„P‘Šø ^ðõ5³lnnrâÞÞ?¹T¾Q5›ÀD÷%逞qmm­ (pP€~Bƒ°„¾lÆ 'þ¿¢T¶VÉ?üàˆÆâÿÝ7o£Ó0ì ãô[þO?ýBÉ_lmë*§n§{vü½µ{Ö?}þàðxÿ ïÉ/5BWbS9vZjÙýLbÍv‹ziŸœr&C›GÍÓ“vë*ø\ã†óO%6¤Êpêß2J€Eé鯱q½€àßh ™ª=y*S—ZÅ#¸x.ùØðd“»R,3™ éÜ,øUV=Ô†Ýů{ggGodqq1Þêî¹äúñ¢ Èηß|óMv]½—””””ÉS[ ò„è ï‘ô²+TèÝÈ VV5اyA ´€²À“öÁæký‹Š"Ñ„ïÿ†GÓ±ÜoœÐWšS¡W@t߇Rȸ ’øÿê«g]ö¨#|÷Ýw>Æ91/Ãÿ²Ñ÷Ñ™Õ÷ÜÒòâê­~/ZZí?ÌÂ’¾nßi,Î7Ö×Ë˹ùÆÜÂègýácooþË¿6uäÂóýý¾}ó÷—¿–ŽÚý´}Üx±^ú9§'ÝáÁeö„jì3=*“zs&Á(X-Ü~¼šI/Žã•$†%^&^©ä;U¼” ˜ñ‰¨•œ¡LU¢ä6©ý„‘ª6@’Vb„—ƒ³T&ðÁ#Å/::¼ÅÊvÁÊaícìu¤N(^IÃÀeï%k,%%å*‹FiÆmalGΖ«…çØÎã4( kyðàW¤7/Æ¢­­-+œŸêÂÂÞ Ðš»í€ä¨d»RK0¼‡›Ž[PlNqÙLFdX…/j7(ºˆ.kþC Pñˆ¦$þ§€ LvÍL½¾¾nu»RW/ãÿ|½»?·¼¾z÷~cv¡ïç++ù…Õo¿ùû‹ê«?ìí¾ìµÿsgû§ƒ½ç­öØÏ“£ãÆâ’ñÏûõú‡Ý·:±±¸ðª×ü­¹¯.ºßkíµNšÝßx·é»?p:jž <ºÛ­~¢“ã³Ë–®Éá?­ÿigË{¿Zd“»»×GVտꯈ¯2ÊJéÊlë%êRS˜—ÊìÇ.˜ é@-4£¸Øƒy£õ¾ s¢"IÛð£NTB @®›üÇ)$Jò½|Ü`R]¯Oóõeï%%%%åCJ ÁqÌ Úšlpè\"žw°ÞW‹çÚàšß|ó vŒ˜|Çxó²Xà=¸ú0G¥U³¿ÿ‹ÿý«&&MŽ‚ ÑUÒŽ=º×ææ¦þK!žU3®*ñÿ…oÃ0_5Extã¿cø?¥{vzÅÕGÇOv÷wz½Ÿv÷^ö:OŽO~í4ÿ¾ÿöí¼ú¹×þ®yø[)/Kù¾Õü¡9æó÷ƒƒù¿þõ§v[ÛߟžþÒíjCÇ7–g>ØÞ9k å¿ÚßmŸõÎëö ³rtÐ_ T/ÒOìÿÝPãÆ'–±QÚ(×ø“©É˜©–**ÅD0¼æ/{¢*jµze~ÿЫº{,æwÄé]âOÖÈX1ZªFû_yŒ¥nãhë ¦*aÊÇëwšž4‹1O]ö^RRRR&9Ü#l~ôè³䨂ô„Äê{îq,íÒÒRÌëíÜ^óóópA<|øÜN”AÞ¾Èýû÷5”q<‚Zau@w,Ãxu}°AÌÚ9êÿÃÜÄ)ùË_¢?°×UaQf…Blœú5Q¦]%ñÿhQ3UKò$@dk¹Ìÿ§;ðÏ×ÔÞXXùyÿ@úê¿omý|Úü¹Óúµ”ÿ¹óúI)úü¯ÓÖòo§‡ÿ÷Áî?Jçg½ÑOãÎíÿsëõ¥ü\Šþý¥”ÿãõ«ï{­g¥Ýxtûeûè t þõ×_ûfÿƒ£Ò=;Þ?èo7›ûÇG¨ð? ÄKŸÜØMÙ%0ÃG:ÁQFD'® ÄãºaŽ=VªH(NùñÇm˜rœ)ž*?LÕèŠVå^ô¼¿âŠD#h<½»¦êjÀLãÉGJŒ>s;Ÿð^RRRR.›)¼½³³ÃøoK‘½e `&çÁ´[Ž0@¦4Ù;‘[€çŸ§P¯O÷yÖî´›}ZK<‘3 þÿeèAWéàŸD¢?ºâøu‘Õvæ.ï<³’õõu†Úh24å'¬¬¼) 2 j]Á׬¤ìxS,aºYYY‰Ë¡YõŒ1ñA¤Só{¬èjËEÿ.סnäLñV¯ÌÛ–#Û·ÿ¨ŠÆEœÉï%%%%e,>!̆²hÇ‹«ÀæG†›•¸Q½ž™|µÓ†ý겺£·#b÷Lꌎksð]upÅÿÝS+„ƃۖÍV¹}Z<“r½ñÿœ&HF«VêÇÆÿ¶[g*Y£±°upütoÿuï쟭ö?ŽŽ¾ït¿ëvÿÑí >å»Îùçûfç?ŽN~é)ÉÚøî´¥ÆÊÚíîèç§vû»ãý_ÛG¥Ù£Að6t‚­¶jâpç­:@ûDý±×î¶N»Ívé¬Ê»]ëˆY…¢[Frp¸wÛ8ßxDÑîtq@pˆ«×¢s ðÇ‘Í@jNäb‹ô‰ŽcZ$·±a”‰Èp}„Œ(¾ÖQÖ( ¦ŠæÛ+’øµÇgí´þè޼_Ú4¾ÊèesÐUÖYR&ˆ ]Ñ=çççSŸJIIIIIüÿUà§Â´&Z©ñÿÀ¿yxÚhÌ¿ÚÙ;<ëGì6n­ßjöÁ¯Áÿ÷íòc«ÅZÀ?šíÿlµÿííÞ‹Rþûë-éÛwž”ò}§;úù±ÓþÇÞγöiãî-ìÿ»$¿´°XZù¾Ò›ë£ ÜÔa3çвÜÍÍM «IÌÓŃíÃ*,(k‹4;;;dôÞ¶N$ä\†«‡e`G•দ”ÑM···…í¡÷1 :ä]Fæ:fyy™ìW$òcgxAzýÆæEh;ÒHqÐa¨6Bò:^6À&Ö „DÀŽ;0í€î®Bš§}¬Àe¤ÓñrÄ-_Õøüùó2$¥„VŽœl7ª?e¸C83Xñs$b®Ä‹Ž&»}û¶ÞÙx.y¦PüH=Ë=ˆÕ«””””””Äÿ_þwv¹²oØ;zÿ«L}ÇûÙù×ÇÇ¥ÅßzíŸ{ÂÿKÿèµ…ÿÿ~Öû{ß“¿ èóÿžK5øÿßíÖ³ÁwcmíoÍSÖ ªïï;m]p·O:»_z‡½>û§ÐÚêòŠjü¿qkíð`¯KwãÎ-—p,¯0¿]>œõƒm«ãµ©VWW…çÿò—¿°GWÛÛÛ«xu\oøØÜ½{W ˜Á1º”5,6¬2€ÿÁŸÿú¯ÿú»{U»¹¿âé*ƒ0?e’Ö ªÃØ£[Pl{±¢AjÅ«4xjÕ9¹Š«g¬†Yeó¹°Ç#Úè§4à˜8†`Wnœé¯òñ¢¾ÃZÏo¿ý–|ª)))))‰ÿ¿û?ÐÑÞ¶ŽŽåÿì (@Uî'‡¥…ßÎZ?÷šçøÿ¬ý÷3©ç«Äóÿ·7¯ôëÿî6õý·öIãîmÉñÕ÷÷Ýæ?['OOŽ«KGå þüÀÿÓ“™Á¿ËË‹?ÐŒñB¤€gʶS½6çx¡ ]ß»wcõòò2¯Õþ*öT§B677 Ý ÎÅüÎÁÎN®ŸìÃS-·@/ÀÎ}ñÿÑñúWº†¾¹ ÕúE|A1;ðÖÖ–i3})§#Ô¥ì·Ãž‡FNc•ÍjÈX8좡<{öÌœ¥L V ³uú”p ›ºâ_ĪÄg•“X½ÂKϽSà¼Êaíc*¹ }îß¿OƒOIIIIIIüÿUàÞò¯&tgЛ„ÿW—úVúùïvéãÿÅïð~ð97æ×ééûßöß~Wº?—ò·æñ÷¥×øæáÛzù¤”áÁ>?vš[¥ü°³ÝX˜=ܨ}6á<+gí΀ÿ¿×ÿ”Þë×/[­SÕÏhÖ <=JXÎè3ˆűº&ç¬QJ°j@¨ÕaÅ1Iô¢Á·\¿Fól¡_½zUÝ$ï9LFi#bD­~R•'’8¥³S§K#`O•zà2q×r1¿€y;uxÏ\“HVÉyØ>«T4AÑ%IïÑûÓXý‘BSD3­’Y§¤¤¤¤¤$þÿ*ìÿNÙylþßýÓS•ûÙÞîÞ@hÜZù±yôSçDè}ðŒoÿÔÖgàÏr,dü=ûõy)ß5«Kÿ,Ýg¥ ¾ðù¹ÝüiïíîY¯1?+pvÔn·úv÷ÍNç´©99Øÿ÷)€ÚÍÁƹó¸Î <å"å©p/¹ºJ ”äFÖM£èýýýÑëp˜³Wp½r&Ñ›››ø9YX<À .Úh )ØFÙiˆf½‘sŠEMÇÉKài7bŸL†JeΧ奄Q}°‘¿Ò¤L³Cr­NÈkö©Ä¡.ÒãÇm}2Ê'QµT·ø¹¥¤¤¤¤¤$þŸZü¯‰{yyÙpÈŠÀXÿÿV»;ðÿŸÝ:=}qt¬Ï«“Sañ×­–>¿îži£±°ðâääŸoßê_mŒýì÷z?>!ü/h{Ôlaÿ`µA}œuý9|Œ:"©¾sÎÚƒÝÀÏ@Ôˆ:f°²ðêÕ«êíF~rÒ˜óµ•a‘ Jud®D#T‹6pCúè¡DIpìwÅ~uvr"sÀ^‘ï4å}E͉ÄsÔpæSNIIIIIüÿuùÿ,---9ƒ­`òÿwOû~øsÿÙ¹¹¹¥e) ·n7fæ KÙ…Æìüà{ðY^ë/,÷¿çûÿ4æ3ÿà_ÿÒ__ØÛëž³•RzÕ‡÷‚ :2~SÎGάr1'lôö‰vÎaXѹòòòr´ZHüIðt.ŠÖ~Ô"'(äåš¼½ ™Bqì÷pRa0àWžKSþMRZ†¹ÕrøúLbðO;É””)))))‰ÿ¿û¿É3Kð¿ ÿ÷N[Ý“æ ·ÿ¹µ²ºÿvÏ…oµ:ÝÞùv§{þ Í–Dן?>ik£È{V=éïŸî Äxûmü7[“ÓÖE¿‚ÞȧT™µA`¬Cƒ+ø f#9f¡+^ )Æd8ð˧ŽsüTöç·*ãÝz)Ä™H^˜[8W§H÷¡6b*á¯Nì†wúä”Ç)\Ãj<óóóÑC,%%%%%%ñÿWaÿ7¥¼3ÿ^ÊÿOÉzå¬Ùnçä •Çë‰Ôý…#WûŠReñ¦üÿûYñ?u«¶•Í””””””ÄÿSŽÿí+Ø/¬‘Þeüÿo3õ;·äâi¬Ýêoaþv·Õ=ëï½Ùßîö#úþ9ú©Ýl‘Æ‹‡ìߥsϪo=n»Ù;ëÆj/­N»Û/ÒÑçlð)Ýþ·®l˜ŠÚ"p ,‰ŽC¿CxvìùxµŸªÀ·A'R˜4møŸ‚é\+AUV¦'Ož”¡‘ŸØ^?H$Ab¥ƒ÷þ5Ftòâ¶¶¶ôBoß¾ÉWS>¡À…뺽J^¹””””””ÄÿÓcÿ×C %...šô2üÚi MÎ--ž´[Ç­¾£~§×ìï•®J«ïî Øÿ'Óãö‰ »0@`ùŽÒ³Òiu¨õüÙu…ˆÇÄÿÀCÝ#-ÆA ŸP’âªs¡1DMpt€¡²ÿÕ|ÙiÃÿDò:T9JýJ4„ŸÂªP$GŠ®GþŠâg½ÀQÒøÿ9sAÌ^2¥ZJJJJJâÿ¯-þ· © ½g¬ÿO»Ûé“ùÌ4Îóq0OÕ´õæõÙºŸ{ EAרÒñ3°=Ù®nfž˜™7¢e ⽈Z+$o2LóCòzD?za$“©93ý“W\ ÆÞ—XOÑ)1FµZ°°ßQewIâ‰äçõsUÀ7P¢óÏÂÂBÉ<_!´Iº’ó婆cJhµd5–’’’’’øÿ«ðÿ‰¨òÞ½{N}5ÿ³óÎ;p}ØwÈ THžmøv¤=88xöìY¼#Š€ñm¹‚ó°`F̱ëèÔ24b«„öç1§0Â'¶oëFº¯¡žBGÕT1ŒúW8GëšÓR{t¤ÁvTˆG&蘇uê^Ðã|Ù«•¥]ÇÛ­Âï;?IW£Ó¾ÕÊ\Fœùodå5QKIþù1âïˆrÄÖ¤¸dÊHIIIIIIüÿUØÿ=q¿~ýK²ýCÆðÿ [YY¯ÚŸ§òê]÷`#Xл`¼—âÝ'Sˆ¨$·nÝb;Z¶cBÞÍÍÍhWG€2ÀÏ]eø Þ›¬ý¾úŽýsð Š9v}<×_]]åHÝŸü¼’Ð,($* U! ¦ýªsµºQ‡¯¨0:íÀHø¦õS¿½5fÁÔ›©}B!}ž›·:‚SE3>¨Ç}Eâ))))))‰ÿý\Ìà^ŽÅÿ¤‘ÚØØ(Á6ˆlmm ?Gu@§ØëýXçíœ~'Xa­6þÏÎΪxº¯®©Ur=ØOepR¢Ö©ö¦½õb é””””””ÄÿÓÿ Ì¢i— OèšîP1÷•¡Iç¡,ìç:ØN¡SÃQmãÜ"À¬SØ™St}°±±;fæÅcíày¨Ïtúü@Êñ;®ø ÆÒzFãð˜¿ñê€n¤gt홎ÒanKÑ•‚Ó?Ø_åÕ«WªgeÂé¦õS³^*Vm ÿ?^Ô,iK4§wê¿))))))‰ÿ§ÿk~¯oyjLeÔÊ«<çbxjå”ÃÃC<^Œ“·¶¶"ŠŽ»teÙŽ=Û9,²‹TŸ ¤\Ìí¥ËÚ™Ç|88*pÔ@›››¥ÉOLþYUŽD?±„a/h§QÆY"jUf *]©?ÿ³dP­ÜL±ëŠM¿ôõîØaY€›ìÿ–’’’’’’øúñ¿®½y±“ ÊšÏS Ó½Õ¶ç¡8fSn•a¾€2L‰å«UJÁh\­ŽyþüùÚÚšñ9žtýDññ¿NOP>‚ ÿx ,§ÀÑdžPSàSÜrŒ PÊÐXÊ)ŸÐþïè``[Å­t£„å$kn&Ò§µç§øæ›o&Ä¿g]¥¤¤¤¤$þŸ~üodnü ïö›vךèx?;;«S¶%/íÁÁx`ssc —8%ús}¾®‹Â¾š¾èŽÿü¨-wcc#†DS¤¯Y>Ô99.À\ªkª®2i¨Ñ« ‚ß2.ÿ]JJJJJJâÿéÇÿš¾Á«Ñ>·Ìwß}g˜ŠC‹Wàêtø-èwiiI‡"þ´1WyïD—øù'»0®v œ/«b­ÿ‘bõÁ‹×£«ÚFM{N ‘¸zóù«’3Â:%%%%%ñÿ×åÿC€­d¤â÷Ô_eSŠô1@›¿¯ NÖ¿Tã(:m6›ŽÓôM}˜N´ïñÊÊŠn7º@öÆÑȦþý4ß©Óþ–adª‚ûze £#—ª„TkœË÷'´ÿóà>]·»™¸W• jZ¤?^ÜœFY•ÚSe¦HIIIIIIüÿµðÿTR¹Ð˜«¿ ùÀ5û/,,DÓz•½K0ì ÀàWшím#ÿÅÅEÃl“mšr§ i…ü²ì,)€*‡p]q@ì£,X\vßiBv™&ùW¥2ÜdÓýÇ‹š%Üü~³N>RÌ[E_0÷oJJJJJJâÿk†ÿONNÖÖÖÌÄÔ_.zÔãcOž<)Á ~‚T zZÛ¯€‹ÿøã<í¬pP pÅ R1´‡{á{ÏO|G"+>˜úýÆ'Ü7ñÿ Z›ßéG¾µ.vìWÁy¯Û””””””Äÿ× ÿucÇ¡‚máUéoß¾Õ§ôzüø1D eèðìÙ³ÉúE ù¿"—¸©{$Ñ–[ac(G"tHÃ9ÊØYw¬5ð€NË»°°@Ù88¾ô꾉ÿ§SÐU777c=gµ|Œ à«§ãŸ’’’’’’øÿzã{×€©* }b„aÅ¥;-T¢“¯_y ëx]Ÿ…ý&·ûÓ§Oã)*UÄu¤«‚±Ø—høüDŸ"’àäSQôÛ\,E`ò}ÿO¡ ÊA›•ù©D}„àwõ÷Ìó•’’’’’øÿZâÓȤZ†T*ÂÒFø>’PbW×ôèÕ É)!kU•k¬7ÿ‹;GþüêíöÿÌûÁÃ~ø<Ù¯b;_ÇWéMGï›ø:eqqQÊcÜ“¸¥¼—ÐP–ïß¿“}§¤¤¤¤¤$þ¿®þ?ÏŸ?/šÁ*׿b9ׯÐlVîôò.Ù¿ u9w}}A޽½=ð9ôþˆÉ+oœÊcÇæ2äš1(ذ¼ò&â"cï›øj…XB¹£ßWʇ :õÊÊŠ*–Þ”ÄJ)))))‰ÿ¯%þÇln;¼õË0×êêª]ƒ*Èzxx(ÐõN îu‚Qðyeu·˜r“<\Áù‡s ×õ›Š¼†î”ÍÀúס º‹½}˜pßÄÿSþ×ÖÖxeRx_Î@—òaÓ¯º<=(ýRRRRRÿ_Wû¿@ÔÊÊJÐ},--©Â´³¸¸È'$Ÿ˜–'ƒŽ7©øÂ‚·Í^P€7õùí9¬rïÑ‘ÎD¦kâîq •°Ê5ƒ…ðãªÄè}ÿO§à£^.†r¤½ú#íeè•GìVKJJJJJâÿiÃÿH›`ÇH\Ù/ “ ã766t¼ö“ð· Íàl{CÛ™Çw'¥°6RnQÚÕßð›c¤qPGø'”]ÜŠ†ñ‰MýGGG ”¸šÀ‘ÜŽPö8—™.Kå˜(âÆ+ê5“Û×ßßß÷Ò ®V=(˜‹¿Çê°XÂ2\¹@{ò«!vc:SµZµŒd°µƒ–¾yk~´˜¨îöíÛ‘ðó ûÿDâÙÑ·£·Ë£cF¹IÝM8Ò9)bEQ¢Q\!Ä>8#ž/Eðû´1Ná¦î,œEÏZ^^¦¡NÎó‡‘êU:¿ºÕj§IIIIIIIüu1š…ë>N»€j3ê8²Ï4)ìÙÞÞöÕ¢ÿOô¢±ÏO¤è1ØÐu W€ U2/ŠêT¦ER PrÊVì½d"«Œ’“ë‰"Á˜?G`X⼈t˜±·:÷¡œj@˜ÊaÔÔÞ‹/ÊÅœ~§Kb¸æˆÔž®æÂ ­ù¦+M³ Ÿ¥ ùcýÈÚÐƵ瘈{ïÞ=7T³ŠÿL¢¶Aä8ý‚FȺÕh½¿»˜«ÎZ­û'ÒkÀÞj½„ä¼SuÔ³‰yUnê:]í*V¯‹¡2ð¢r½ººê†:y=%&ÔóÝõ˜4c2îÅä÷èÀœ\bHIIIIIüÿ¾¢  oÆK»¯0qÛé¥zº8­<°èoû?xOà*G°M¸Æ·/_¾Œ(…@ZŸh îPMJÚç:.FÔPîÞ½‹>rçÎ~‚ÏÓùUmƒ—ü˜:@{¢{¿6ªe‹¸Ü`åÅÕ¢‚R~pCҫᦺ#OÑŠÁ¡1ÿëׯ}–1aÜŒt™# ‹:Ô¼qîkZÔiç™­;/Σ&ašYêAue¾)ë•(q“-ÕŸC\·‘tˆ$tc5/•“îÃñîDq‰ÊxØÍ•¾3AÐéÔ‰ŒöX©ŒK„4!•ptMÁ“–êÎ>9ùWÔ_¬ãÄäÚÜTâ% ~U‹ÍL )))))‰ÿ? ÿ1A1‰3ùFþ2tº0o'ßœ¢oæ}˜s8‹=úiccCS<§àpR™²KȆñ:‚™“,CD¸â Á?£åè/dÅèÉïeÕ‰ÀFÄcàI€É ’‚dŒ±®·÷}/Ü‹ú1œ[XX ÂÂÂwÔ§¬}¸¢°—F[n Ž%~^5ðà±éçÃ¥Íè‘©«˜ÌwTEêƒUÕj4 €;r/¿)Þ `@O'…ÎQ->Rß•&®·CW0Ú­ËZ·#$¿\ô4MÒÍãlžôW¯O¯ ¨Zb ,!¹^,L\CŒÛ))))))‰ÿ¯(Ñ¿7b ø9m‹³ P³0OÇ)> Òþhÿôè‘ Wtª@:ˆÙr´!õÁ Bº`åü믿V¸BQRŽJtºQº°åPÒù€èí?ŠÃ#“?Çèx€G,‰¨x\\†š®(‰Ê¡Q‡¶‹îííQÇe`Ü6ž„Å´Òb¬‘Uh^£êÆ™ÓÖ¿\Õ†—nÀÖyÅXÅ£“‰ž–œqeHQõ%ËOsZ[[£DÐPÏjغÇI  =üé2Øc;¤eÆHㇽL±.IÙ´GÇ» 4iÆÅ< °çKÑPÙ~øðá„û–°*¡¿sç+\®%mÏÍÍIÅ‹k‘¼2¨žþμ))))))‰ÿ/Ãÿ8ö³»¸¦WüvŒ1Ó ´ø\ýk[´*®õÚ ŽPp³¿4‚Ö@<³3¹½ÛÚyÿþ}âÈ´¹wЀ7úÉš·£`xà€aÀÞÎ5< °R‚§¾@*F’9Ì¡¸ci„v,…àtôöž"š‚———…©LPãh_ ¤U‚3•VM.’²Ú[ƒZu'ÞæÑJsëéäÃ1RµÓ;Á&Lj'•Mý¼  «‡UBçÏ-‚µU<»’›­Ý¹ç¬NÆöìÅ ¸SOZ½¸Øs'·a3_ÅÆïu@W;n9®.˜ÈýíüwzUzµÑvŽbî—b'm4<†lx˜â_wŠ””””””ÄÿW@ |oo/Fð‘Á§òº nY=¯¦ilÎáÁ Õ€™…ŒLì–S‚{œîu…hZÔDn‚ ÷­[·b\°ž¢:¸ i3ÁQÚãXs"V9|m–´_Q¥¼p`ò”ºÇ´Èï%\E‡Ò¿€[ê è…'¿nÁ›2?E²–PŸA£öH½â"iòm:VÕ$Nø/U1ÈÓ#†ñøGÆ~–ˆw¦ü• ™Þ¯/5=¦¾ù5úØ|VÑ‹PO¡{•Ííß‹>*Ñ+þÕÞtÄÞz]îAàD¸£*ªô/dB‘l·‡½ŸÊ)C~Õ˜îHƒApòÑe¹Ñ÷ÐþT7ºJPý›‰×ïÑçºH<šWaÈé&%%%%%ñÿû Æs*M¬š‚ ù4çj*/!.c>XѽසdK<‰´ðÍ*g]#jìÛ†âÌò†²XãKº>ÀÃw7"Ây  3ºæ]®"2¶7&$‰‰©€™±´*a}}Û©l:ØÛVxÑ^nÀ£Fg}@ ¢Û_‡ñ˜]’J0ÉZ ñYÑ¡‹=:À¦B¨j/¦”¹\:æËËü@„H¥­è]Ûn:³¶ —nnnò¢i BÔ:WÇØMÝ ‚õ Ï]~µ ˆ›\x7Zþ­(w¼QBŒŒÞ»ÉpAxu\úÝFÅ®bñÙ]:¯)}"Í—uIú©þUݪ¡ê[¯CÇÓq&T…t7¨ÎËà »˜ÈH…qÀ‹¾uY^J뵉Äÿ)))))‰ÿß·œ`AYðs$!×7sq¢š‚‰óõÌ«ýWàPüгëÊ@‚hl×~íÄ€Y††hƒLc°xYR_¸¯N·?ƒKÂK æ·ÄþïÐB¯Døh"VÙvww…1ÊkT‚+”P‡¡ŽX¬à“7ß)vKÃu³FÝç2©èúiEUN' P «À,…ÄEœ<»\“®dâ©U3Ž&žNçÕƒš«Þ©}KÌ¥:ñbS¬êJµÄ+ˆÖfkµ±V?«˜ÒJÅŠ*ï"†ô‚çI™Ç›UùÝnãú𕾨ö¬¢ÉÒãf"á ‰š ¢²©ªi!Ô¹ÎrêŸÅTÿj.§ªZ?Å`v^þB<…­úÖIcE±@éN­‘Áe‰ÿSRRRRÿ@Qí7Rͤ1oóõþþ~\7>×ÓÙ¥ï_ƒÔ2ŒÏ-ù@“×8Œ{Ù(ªÂ¥º‹ð†ï‹ù1*ÚŠæ1Êupÿ >¹šÐ‘@ˆ‹' eMÁ¼FÆŠTN„I:~Q]PŠI´ÀG½&"·*×Uð¹ÈSTᬕèÁÍVÊÑÊÊ U‡Ëå‹•í÷jEŒ×®0¦ÐøïD ‰ÚíüQiµ™ÅÐm[-“¶d€íÜ _@ÜéôFTN5È{÷îù ¢9Æ ]»ä©¡ª‹¡ïh[‡¡ú¥‹jÃe­ß‘é@×ÇŒÆc/NyðàCfìæ5´Ú¡š.¤x.v\}¸ÿ¾W4Tr) ö^+µ© ¹FYÑÓ¥bà||<¦¯¬žWá*))))))‰ÿß)š:š‚Áí„ì=F—ã*“/÷ê[àDدNÞÞÞÆI&ÚºMm'Ä-‹,ŒæQaîÞ½k€ÊíX&à\á,íýë_Kè±à·}À9Q»q°¡q£“rfTŒ•˜08¹E߬Œ‚/‚|óÍ7‘ õ‡~¨ZÈ{áÇ>W„Ec™‹b¾æ2H ÀYZ8ºWI“y/:ÑK<¾Ô´õ/·Õ‰GMŽvèw¡¶ä×,ÞBËx‘•Ÿ ­¨ŒØ¿@€`¶íü£ «”Ê¥câ '¼.!µ\¤÷GÃ9ÝÊÔ×7‡×W£¢µø˜˜AÌyœ•€Ðr‡`À`U‹Êt #y8EÍÞoä_yÇAÍϵ:€Ÿ¡ëøˆ/ó¾RRRRRR®þ/!÷¨yÿ˜^ ÚcpeK‘$D³¿ÃþÅ‹ ,œR|¢Y1™Ð*?€ý‚dBhöiQ8Å=Ôj¤ щŽDŽTö*Ltœæqk‰y‹ 14“ 9ÈÊHfᘡ~’2äG-~sôI¹³²cd5™Zÿ2û k(,ˆPÚÃ8óW¤»`˜#+“©^b•×À•<ɿܿ¼räPt›µ¬Ä¸£Óöpþ×ORôMý^þÿ콉rG–´ÛM‘€X$JjÍhzlÆlÞÿi¦×iµ6®"E‰¢ÔR/qÝðýå×AKp7-‘•[fø9q–3€Ý–žTÕ¶,æÙåÁ‹|»ž9^­Ê4^žÃkNæOç÷S<ì£7TÝEe˜ÕÔ‡â;Ã~SÎó¬§C MýÌù”:Ùvtp€)}ƒÛµz­(Š¢(ÊÿƒH#l܉D]yÎ'‡qe~ÒÇçV¾Õ€èçGÄÉAN|NÌõÑ“c½ þÃj¾œÓ²á¢ºkû·ãâÍéí¹ì œ“kJKšªN $«Ñ.Ò–’( ÖÊLÝë¼ãu·Jrœ¹&oËÿ]%ÉY™×À7Z°rýý i›¶™¢š`¢åRëùŠ ŠY¡†Ø”}ÓIãØ7÷B{Lš3áL|z`Z.g¶ / O›¤ÊS–g4êPzßž£I$X¿:ökŽ÷ñˆdÓ@xjDÄÑe~^""ká ÀYÆïò xç‹Ú"k,¥fKqÛ1~=Ãõ8oL9슢(Š¢üÿ(˜²&y‘eé7IH" Äñ3M°‰{9QÍïß¿oo\’ÿ¦)¯Øµ™÷‘œs#,\¾£Œºþ–,rÂ'â’À¯]ë„}%†_§‹ÍÍÔ Žº2š¶ ²þÉB¹ÝÄìˆËù?MH‚¤€²f¾€$„ÆÓiñÇ[zÉ2<”¡Y[ýjV,ÇWýæŸh3#sÚÎ[¹¹¹iK›±0/g•x9§•–:ïÕú$±N k³ ¬X%;֮ɶ'F&æ +¼‹dÐ'Îsm‘3GÁÆ?“Ô9âq¡†¼SlÌñt„¿JøãSyÇÆFèlFª(Š¢(.ÿa‹Ë=åÃÒºìíþi×Þ±;ž={¦ãTâa†­ÿ‰"¶+Ÿ&Ê“VßIEUšôU‚ÿP1d XŠØÂ²©R’p7аöæ6<Ã1 “‰™Ù>Êgè7•i¤T˜«z™ìl,t¹OÆ›âL®àÿcaårà‚÷l°m¯g§ÊâJÛ)Á£Ì¾²CÎŒ¿-  éœžÜ’úÛ-¦‘f—ËË™éö³Õ`_ÌÁlä©Â[¦V¸ÂˆiË!m5v¼¹žŸ~y±ˆs™—jû¨t¡'UÈäî”Á” úh~:î.ÕCòb®fC¼wã&,Ïd½ËÓXðŰçF­íUQEQþ¿žüßy¦F¨ÇYO“õ¥—"†Ö^Ч¼·°Ü~íA, R;í„\¦Í®‰y{ê—×z›î'™ñ˜A¥˜ã:ÛØ# ª©Cö‰ªAù“^ÔüÄž˜fø;;*¤È{G‰0˜ýÏOûÈáð-xRL<Ðúð´ß°Ä4ÐÜn¥. ÈÖóýÊÌkd¹ Õw^éú›p:BÔß3ð 윱wš´)E¦ýx}gY"›25L^H¾™½w,ü\¾gšÓgO3ÇåÛâÈEq/R¿çü´Çd ?È–NÓöbJ@ž«“,`y¼ÁŠ¢(Šòÿsl2šXì|Ĭ2?ÄÌÁ5Ø¡Zä¨;Ü¥îâ2•Ãy§úr\§ãz"XâÔé‹y„Žý¬ÃÀsy(šaPdšà<¤®†o¡9”F"¤<“íÍb‹â?i—ƒ=Ò(ÂéÒîì#ÇŽ7_Ur“—k¢ÆºáV_MÎS.Ÿ“®§ûßÓWonw£¢vÅü,Þf5#KßzV¨o§\EQEQþÉø¿WyG‡éA«ÄäkûÛN©ˆÐyþøãÖÖ¦Ú3t#… ´)‹ÕgÞ¨'dÂ&@#lð£ÅŲ̂>–äVÆòhœÎd9““M­ £ÉT3–éÑ•Ÿö£¯ï¿,ë`9©þOÍsV’?Ó~Ã÷ª¹‡2‘'Ó ­ï÷1U’’Ùm™4Ì9ôËîáo„ýd5!…þýßÿÝ´y~GS~XXŸ~úiÃòEQåÿWAÿOcÑû¥…ޱÄvé#lˆ2–¬bTŽ“ºŠc?@Æ®ÉßÖ ŽUv|’ERÔe¤EÐØ·‚Õ§¡N²vU†R.GqOŠ«ÊgŸüá˜xõ_ÿúWSÜÉëëe*¥ŠeŠÞÃÚ5"Ì;.“¶ðIÛ*Ÿ×ÿ¶qrø u²;vÊ à?Ý(œ4dÌð-e¼zwÊ¡W'öÛz„“Â[aÙ¤'G|y~þ³X ûþ{Y ÖOš-»»»cᣱž&dEQEQþÿŽ@INð$±S4B4·69¨ 9¿¹k’pó ¢>&Q´eú±fª¬å$Yù øªyµAV2¨l†F'ŒÌrQrÚ;Å3'|J†s̰“±WÏØ¦ÝÒÑ9 ·\Ý›ad¼ib7*¬Ë2C“ëÏe¹E’õgG&{Y‘}2ÅÉ8„îUá å$XáÌ›®¯oÍ MoÁvÅü,Vw&ž¢ÓPVÿ_EQ”ÿ_ýÿØ÷K¹—y¬Ò—9®àˆˆC7y#`»yˆe qEgNçpt¯ ¶3deDMAu q q”óÂC¬NTñŸ}ö™ÛûjËSÈâÃrìG+äW“a(=Ñ–rÃźùŸæøÊäêÙémê†xãÁ‡>ÌÀP‹R!ÌL8Œ‡;Þé;NK§<ËžôX,ÏÏâp`® (J"u£MÔ¦p¸EQEQþ™ø?”ûúõë¦ÊDy› 0 —&u>7K6T¤E™ýÇÛä Úé(ŽS”{ò¢®¶ñC]¾Uâ);d¦3ÛÉd¼ egêðõ™Q7Çëúü/¾ø‚Ÿ2ÞÇ®aî ¬¶ÿÉŠe#z•¨Aù §Hž¹PY!Ò>JÍÉ€6™õ)¡Û5 ®Ô·ìà8‡¬íp¨sÊST©†ùVðËèhŸNcwàü¬…Ïj8i¸M¹R°Òy}ôœ) ËAQEQþ¹õÿwïÞÅD,lÅ­Å­r z¸œC¯èzGûêÿÛ·oë'ñ´>ø@¿îììpÍÖÖåC3677)P÷êé0LÿÍo~£ÿÍ–EZl/t (f,ÂP\¨81 õÕJ×à!Kñ' %¶5ÞΠçÞ¹sG7B,—eh­Î[k:"Í+DÚæ5i+u ¨ýf¿]æ$ù× ðÄðÑ™ z‰ðìNóôe  utš©rLì122™ ¶··Ýpº]7ª{É“n÷¸ìíí©LÆÔ#~tX¶Ê}Çž=p~oûwü‹bãÍ›7-ÇMyEQEQþ9ø?ôµÐ«¥†ÏÉT}Ûæ_ÌA|®¥õ …;ã˜á7Ìá‡6Åç'Qð,lD!!ºþ(FÖ«דúY8ü ×®]ƒ“‹ÇB#©u³h@+$°à• v½œzáf›ÙQq|¦(˜°ž˜:íŠI®¡æº!‚Êóå¸ÓÓv,”· ÁͽñhÎV¨ij›5j2õÏ`A8ùê'Jæ¡_œ# “$Á)_QEQ”ÿ_>û”ÒwïÞEoo²7Ix­Õûv)b#üOEêD3Í®J»ÿ¾îÂ:fK&~ºÞY\7ìSÌ-I„4Õ\Ôn§¿wuê"ØjȼÔüÖáîÕêÉ¿XUµó¬hvVÉçÉ• Í&Ÿ)w„«ìrÐþ̤Œaµ|†M“å“ðwww±cgÏb 7ôÇ?þ‘ú@}—coŽp°™OS G­ID…H$¡|I4$¡Ïˆ9êU|¥Õ-ÖÀC¼i²Eo¯¸(:MýœþÝTsÊñèŒ%/`ËP*D2Â7ß|£ú¿ÿþû)˜,›‹èâ?üp,vˆy&góç †Cï3a9U\QEQ”ÿ_&þ&4ö60Ì$½f€6Œ±Ë-þ§¢¦Ö]ß½{m¶nÑ}úô©˜6^À@…ØÖÈ¥‰=¢^!vPš˜:Š3gªÂ®­Ö¶rÞÕž³ˆ*œùä“OlìdÕ}fûÅÀš:iã‘ЇÎ,6»!’Ah¬D!õ~ÖºFi§áîXÝòË®$^dŒþÔGã '\‘¢2®ÖØ ö³æs=oYIŠkmö¡wˆÆbã€q\Sèy.Ðÿ°JzWS¸eæe(Îÿ÷ÿ‡PÏ ¬HºQEQåÿ—CÿŸlßL{,Œü“RN‘6ኙÕkŠi¿Ó?ºZ›ÞˆË¦$bÎ*e†y ƒ°ÊtÄ]p“¡äL„Š¡ ²Ä!:4Ù©¦ ¢S×éç¤D GðPز{’Vg¸ÔìÆDÖDNþL3}‡#»ÈvSî½4ó`,–㚪äÜ|9,ÓadÞÁEmj¾œ—¡øuÐÿpêcÞ¢(Š¢(ÿ¿ üß s¢»ˆí£6áw‡Ø¦Ýn¿ËDΉh‰dzŒ¢ž°QjÂ*ÓVÄFƒUñŽRnLȵÓxézµÚ=<±z*ã¢èÒÌÁœ¡n\¬Çùz:ßÜÒ»ÅùBÄLûßY¤‹¢(Š¢üÿ²êÿÅÐÕǬÓLG®]»¶··gTuŽé®Éê¤Í†¬êW8ž pRŽeJ)~*¥4Êf\PëáýP‡¬t2,„ ˜³÷ÌxS³MFàIáѾµ<͈ôî™”/ØS@õ:“»joîƒà¿< y‡3Í\]I×Sšcø&Ëm®QetÎû ô6[º2%›ùXÕv²ër|Ý´4øwRæÏ?ÿ|,k^a¾õëâ\qûöm½àš9›››Œ¯ä¾Æÿ)Š¢(Êÿ/qþß±FÎBÇ’;§I<–”¬i<`zº²&§M¶Ÿ‘êyLžËø5uòÉ6Í`©‰þäqVÑOJæñº1³ÍlOÆBÿï 3s„êÞÔzD €¼,ÿ´Ð1µh„˰/v_‘ï8ç!ûTŃ‚ 4Á”Ø+qJ¬åŸd"ê}Ë ;K+©¢gª¤I•ëCõœxJ^L5~ÞG _î–Fà£Òˆ”åûÀã\¾/s!ªC^ìRÔ¨ìLG%"Äâ@'eºB‰¡¤·é zãõñ@«oéj=‹daT€šè)Tõ°zæXxfîîîö\2ç ê˜ÈüÄÐÅ¿2ɹKuÆfE“©wqì‰Ä‘ñ TÒº+ç'?Ñç®éðò%â^²¼ ¿ùÍoè?7ûöÒÏÔG}•å 4ßÌ_×ë'§±&R+²‰>,ébq ûEQEùÿ[ñ”v/øñ§¿ýbûŸïø.Õƒ“ÚÿéÓ§,¸Z‹Ÿ={¶œ‹EÙŠG”uº×¸™gu";YΓ'O (lþaÉ‚ÊP` Ö@NÞ¯~ÐT$íá-øØË5õÃNã›Q=ÿô§?¥þSÿ»÷r›`²¨ìÛ˜Æ*lm8šåxÝ|hý‘N´ó~Ë€¶Ôr«¡yÜ«‹á‡#lø=sŽQŸÉ5 Ý–­ fÂ0¦+êéd—eë²åGÛ]õÏ4;Œ¤:öK“WÎLf¶LW~6'zuÚ§£° ÓÿËïæˆðJög㌓ñÞV/^¼ð>ZNã”4ër^o'˜ËHP*Ï}üG¨(Š¢(ÿ?†þÿåËW6þúìñÿ¿ÿó~qìôdÑfË•q,Üô¸n`¶ã•Úžžbæ?Éõ‹E!G˜4سÕI¬Fê ››ÖÃ÷¼3–o¡vkB_º¦X\?EòÔŸ >kb ¡šÃa¨¹so™&ÁŽÄ?þøcõÕWcaüâ7✻Ì`—'ç• KÐ0£øM·_wé1ê“<ߣŸÒ¢ê“þËËõêáǪXŠ +âXò3^ŒÜ<ú#¶ÀH{g¹ÏŸ+?_OfWri&¼ÍŸÚ‚Þg4'þ'¨¬…‰Ê®ÀˆySL§qPÀXÒóá]î~¶W{fÊðÃ]ñÅ_,ë–ßú¢(Š¢(ÿ#ÿ§ø¿ÿã_/¾{ùüÅ·úë§Ÿ\öÿ…0hɶ²ÝÑI.XÖìMN—6Ÿ®áWë3yþÄÆ·C™–cûáSåX…΃(št"*Y]æl´Ý\kr˜%œ'Œd>ãí†É‚G˜Ñ Ž“Ž hêìΤu’b&%pÆ2bª“ŒLÙž?hòÂ>:HæZ9Êÿç6›]®§ÕΓØrìî}(ŸÌÉ0Y°`'c…QI=íãÀ’g¹þ™GøõøQo“œÂÏï ôÞz–ZPµ¤3ìY$Õ×d浚j¿”OÅÈ1ßG¦lC P‡xìô~aO¸zs¤(Š¢(Êÿ³ÿùùç¿ÿøÓÏzÌ?÷¥Í{wýÞÿ£b,z¢ó%‰Š_¿~ýÞ½{Ðo›˜£¦ÿ,V=ÖÙZŸ†)`ß‹M5ôn¿···±±aÂ`¦¤r`2;Ò•®s{ý Ø‹å¨çÖ­[é–›d;·3ôPÀÔ³tW>ÝÕË­€iu€· æÜÚyxGx§êdŸ4~¸(ú|uí¦=Å;{Ç¥}·'Ù‡~›¬³Þ¶>êC}MãBäOæ[òù뉥 ü\ìp²‡éçí<!¤8ŸÃJQ<È|ÖI§ß¸¿¢ÌœN#¶-rƒc’Б¼<ù-)x€’-}#¬ytìáë͈ì:RK$iÏšøYª{^Nb™ÚSÂñc©jM€Š¢(Šòÿ·µÿÑâ©g<|ôDÿÿê׿züô‘õÿS°GK°—f´vVn[õ¾ãÉI±ˆ}«Çè=9ƒ}ï`Š0ÙÞ¨(±Ç 4ÁæNz Q¡ªR¦°±1-EúpR`Únæ3Y¡çä¡*dè• bo…¶Í¨Lš:;ÿnªTo2¿(³×ÆÛŸ}öÙxÝ~,YŨu1Œï§ ¹ç8^}(Ù í©2i X=¡Ê—ÌÈp 0òIÀ˜<ß=µ<‡™™í@h{vá•ÌÆóçÚµkšiúÿÎ;ª‰zõÆÌvI—ä‰óÛ$yá)LÅÂT¦ûÄÁëÓtóæM×Ù?ݨqèÐõ\ÆkbÏßñò}g£!ÍŠ&ÉhYœ)Š¢(ŠòÿÕü_´}ìûÿê176nŠÿßÛÙÒÿ^gÑo'Ã1ÿG y t¡cŠcèF‡ÐÔŠ¯_E Târôçë Ç-ÑÒoùJc²í( ËD…z^ÛI ª [ZÁsE6TŽ*Æ£±DåøéV¹›˜%]!à‰Šr:05D÷r!_0fPT>Q©¡_õ¤z“q5m·i4y».œ)̤‘5Üv%ÆcZõ¨íŽÿ9"¥Âˆp‘o\§Ê~¶»1•<¬ž\ÃUçôñ?>|èHPcËqbs¯ÊÏbžÃ“}åH)˜ÙBÈ\wQtϱŽã7?ßDZØÂso¤Ë³ÿÔ,e4ÇëPn ÓXMFÈÍW senv Oñ+ïû²ï³ zOǼ_ÓbQEQ”ÿ=þ§ýÅüÉÿeþ&ªà”XXh°v§›*|Ãñv̦´F'Í€Ïp Š¥rË&BýùèÑ£?þ˜3Æwiy±ø†J³–^'­]çYcáK˜¤ yÄìŒc&cP¦d ´kÊ`åšPˆÚÈ£Å6Qœê×ÊBÛž—¶1¦ëŽå™ì÷×Ò(rÄîî.J~3ðôЙÀ«áù颦GS²cø3 ))øýå@—©þ ý”ŽE ¥Ó7§r@ÒMZRE¥¬êh¾€¢(Š¢ü?ø¿¨ÙØgþÛ϶½»#òÿôÙ“(ôêZ”íi+fòâÅ‹ÌÝ£ŠaÞƒ#¡éwzõz}‡›6›üØûxýyÿþ}‚ &ÿ‡\Ý»wû‹ÃfŽðjýÀxFTÓˆIç9†Fc©’2Žêì•(í§¼³³£“ÔG[?IÛ½]2=TO”ŒÀUý§ðç?ÿÙ¤eýùúÉšyÚ|ÝÇSsÆ". Æ')!ŠQ›Š»†/ãɸÏ0ß{. úä'ÎÆŽéÊ5øhó,¬Y¼ßÄ$t¤)4Ý»>¦—ðö<È>¦ê‰ÞðòÄ>‘¦:4Ý¢ÕýÏíOž<1Áf3ÇØ×OÔ4cÏ‚nǸˆ\_~ùåˆ;$8ì¹tµj‹ûÔåÁ~ŒŽž¨þ!€q—ej$Êd›F'uŸ eú/›Æk(]â99›/ (Š¢(ÿ?Ìþÿ‡W?ýýÿú•~Ðúüë_mܾ #2öööÆÂÀ@ÿ¿ÿþûâ½=²ŠÚf%­Öz›úÀйQ—™·ˆ-°â›B™0ü@釡ò< ˆJeÖ­Ô*C#¹… ,ÅåøYSá*VÄc…¿Ù”­ <д^NîJÞ1‹M±;€1’‰«Šõv€~"PÌÒÿšu²•RÇÒoš*8u¬;0UÁv‚@眲Ãoû[ïˆõÕL¼Tk8xœÇñACÑánÎÏ ñg&šÍCUOOƒÝÝ]‡“…m"'ºòî+Òso‹?UO‡»W=U×8ñÖXŠ”˜¼ÔŒ„‰”éí£ ôÍ×±“ ö\L˜&¯üŒ2D,\†@_-ì»&O‡uâO¤<ï¼° FÉΑa¹› t ÞGŽUˆ'IóEQåÿÚÿÿëµÿÄÿ7u§¶òu˜ú Žw-äÁnª:™~¯^‹±s¯;gÔ.p¤31.ž;ÅcŸb›¨pç'a2 +p'%“tTO+ùa*ÇçÝ.·(p½ù’®AÒÑæ½.Ö:Åfœtéˆÿ£qu m]Cå3?MÛ»7nF(Þ766ئ±kª®äw2}n1Êé›s˜tKÆŠAZd84…8IÀU]&QE°7Ñ|EQEùÿÄÿµ®þ¼où£¯~úq?À?_¾úÅÔeŠsb7ÀTß™]LÚùÜ:3ÌxnÇgv‡ÓY6´H›|(J2Œë‰²y@ÚFF]Z|àz·šëQE:!‚Ë´H#]¡f4á·(äú[%{Ñù¿êõÎÔl'iöÞ¿ßrÇ×^¢x•€·¬Ø#ihîz ã§û\׫”¤(0åïUQ¸mÑmÁ•ºâ48÷Ö,¾Fƒ¨cNÒ^«£—í…(A’ò"ž¾’y;ù›8—2oWº]äëæq¡s&Ñ{"Ò’V“dBúOÓ Y·+BDæËïƒ÷ƒ²bü㳆9Öy¤O‰i˜š/ (Š¢(ÿ?Ðþgìÿö×/þúÅgÿÿÿb:鵞z/>}“o°è³Ûî=ãö'¡ÂH #™ØŠb‰íÐQþò¤G¦!4„úßy»2ª?ä3•q>æ-°åVû23«‰„ˆ™¼Ü‡9ŒþŸÒž¨ôÎÂŵÿÑ•ù†šŒÄ—ç%)L™§ðNµ¹x–Ó2/v±Ž¢ã¤·zÔÔιNÇl¹oâÌ„0ò,·×-Ö¥Ó'̲ÁŒ'€w²0åÊáÓ„qDP»½L2¬-£2Âa@ÿ?ÑSÝEèØaÝËÓ[má5áJ?ÂMÆãfÿϪ.§uF€I“`5¾“ 8P’óôY@ÈÜy40»Â#è̤?㼺eü›/ (Š¢(ÿ_¬ãûö<ûù¿^ýôã·ß½°ýk®×â)úXD2L’œáÙ3uQZ)ÃRXˆ&%‚s s-@)},Œ–¹×IU˜Ì˜M',L|“f|'Ó8Ù&y¦%á`AVHšL’öhâÌ~bZ/Œ°SÙÿ×f9tøNf•µój©çmfOb)ø¿%ÁÔrçË,o qrû${Ëug_Éùh¹§Œu6ó¨ñ¸Ï?ÿÜ…d^c§°bœà6ùRøØ9#tè+ñóWô¿“šMam2<×t1ïòK‘mŸ²­öirÆt “¿úê+gó-6ò™^LgÐÎŒØ)$:Ù_ë$X-þ$ÍPEQ”ÿOúÿ§OŸéO¿yŽþÿ§ŸÿgY÷*œ!.Ç!‰“¼@ÛtGK­s³Ê§1CšsxÏÔ¨üéHþî‡)—–Tf žR‹Zã:1ÿ´Žæ–$ü°‘´ßv©!—I’:¸+ô«É¤™ÕÎDÀY–'7þgzøRÇç´ 5E•aÍå°l"0vš¨r±j8eFóEQåÿ‡Ùÿèÿ»ã™”“„<‡M“²EfnŽég«ìŒÿi tt¾7‰S¦¤ ]ÂõfbIKrbsôô?]æ®Ø¹Jãu7‡´¦˜TµNGku´2YÕ\à)Ù…†…&M’ŒŠéž„F^þf¯aœÄý^ä6 é<ۓç˜`ggóÛ|±óY6}ŸÌ{&?©½³` Ÿ‹ÕùÍPEQ”ÿ¿;ÿ·W,ÀêžÄ[i9œ\a!5ÃñHMøÛoßkÉDz÷À®àç}Œ°IžÊIj„Ê.AEˆç3 ¶ý°âÑ.½üùìÙ3w—ÍÅÝXý¯_“Õ'÷à¹ä_8b$– ”{ý}œû÷ï#v9ñ“ŽWûÃ^xÆZ ÀpÝò/QìPؽbDØ¢4^J³4çà¯&JqÕsÒû¾LæîÛ2¶ïíÅ’+›/ (Š¢(ÿý¿mZÒLÚü2™Û{ï½ÇöA†òã®7n8/ÏÒbíÌG÷÷‘[vDÀðô¬ÜÚÚÒŸN?4Fh_õhKN"B»“´+†$ #vs0?ÝžY%—àx¤D§±ƒþ'È$UZízÑaÁÊ–ccß…SýïO«ªËÑjBæ| 2/ØÆÆF2p&ªæä—k&ãvÉÁµÖR9¹óT©=ܱt¾DN;éX†e—êùÈÖ“ü7_@QEQþÿ.üŽ-J­M“¯¡PÛoXR àI:B`RÃFPt[gFÑ£Ç{tBR;TŽ83é™ò‘:¯˜’þ‡ö£ƒ%iÿppÛu ¦Î"QŽliÚ§8Iôïq2ÿ>ŠWæEŸç¶$O[}Ki¬u¡‘N%éŒLŠŒ¤éG&;Ûù0%¦}&•½cë"Í:úÐïNN0'/s­&“3=åþë6¯š/ (Š¢(ÿwþï*a¬åžœ9[“ÁŽØ2…æ'Ôï#"ŸèÏ40ÐØÀ¿U¾'ø’¨”M¾úê«.É®íØWxZÛ)ÀöÉEŽ€‰¥ŽÉÚZýúÞ{ïY ± ój°w„]|ÿþ}çüM# Z®g‘"™x•cÉ…ó’Aý“Šn1dÒ7¨¯ÌÙ2áÂEd[Ó;#ðàó;"ò/Wz¶êO^½Ç®*‹eRé^¢'ù!:®gMoÏ@Þ;¶äTïFeZmû×_,þï¹Ô|EQEùÿ;úÿN =ÅoU1ÕðÙ³g¶@†®°æZ™/B~÷î]èœHŽÖekæM¿Éÿ»#nIç>ò@àq¨Lc›IµàBzô$MÐÑÒ«2V:¬*oÓ‹ 0¾»»›.™NíDúc_éÄ©ª¼w"Ä7lø½Íˆ/‡Qº”H‚ʱFS= ù(}±Ç¥°ÿѬÛdºÚ…œcMHGÑ„ü{,Ù8é'RAùòØâv—ÏKçlËpc¨u)œ.3>¶$+\Dýÿh¾€¢(Š¢üÿÝôÿ6NN5 d>£¦'EÏ(ŽI*lÀÃe^(Jb‡à _¦ÊŽ'oÊm; ýäÐî˜îp>-LÄ‚D,±ÉÉЋŽÀcó¬T7‰bb«Ž´½½:—áû ‘¢QØüÃZEíLÒø‰zÓ!ƒ·þÈù .+&+½¤“Þý!åeâcš3{{{~;x¡4èÌ73߸€ æ€N"Úo V‰€%î̽ëY¤{-Òê±ð…@Í´ÜÚÚÒ«§gé=ͽ€ dß|EQEùÿ»óÓòä¬7nÜðn»“(q= ļÝ.ËÐOè'YµÅ=°~—¥Ÿ:Àˆ2 ÇäyX!âxü6uªÞªðAÆJòSÌ÷Ü“íjœu´ù:É^z>Æ–géÝ»wõâÓv8õ1J^Î @gZàÕâü!ßù0ZË SNð)Z!ƒò‰ÔÙ¼˜—‘“>Ï;;É8§ý½u?;7œ:„mGÉAÞäkìc4+öCý¾7ˆhQEqqù?tš%’L»Ož<±²ýƒ>Hfâ¥ß¶ëÑì¯Ï>°©?:œ”Ö´ÁÑh8·Ñéñÿ±Øbaó'¢W¹lÝø¿¤g쉬¶‹ý2ˆöƒ¾Ä®„ ™äë|’N#+DŠQêU^ ¿#~sí´îYš ”ª(=˜œ¾ ˉÎsáË2 ôÈæÞ¢ëp6³N€œn&oh*¦Ø¥Š¥™Ð²„â}O;@uE+Š¢(."ÿ‡rXw·œBÔF­M ݼæIl'V3z+Ø H ÷¤©3ÓþóŸÿ¼ºÿOŠÿ›ÉˆãMý¦?!~™Mx­ø?ŒnDØI²0œ@¤q5œ1¿üòKw/4ø½}¸ç>|ø.Êd“m‹ä:ãÜÊ9ÄÛ‡h-D€ßÁ4³dëüUy§¯™ÞÊL¢=¥ÿ¯çésÒ³úlC¸œ§Ã‚§*ìDäüé¼u:#ªŸ†ŽùŽ4•pQEqAùÿ´J²¾C‡$—9¯ž^uñŠuP?yÝÇš(ãÿ¼U¿Á+ 3©{Ì&Pç3 ÎÙš{ ?ìÃê'È’.^OûŸìÉ33'ÐkžqhÖË KÊö"™Ìþg÷ö;hó3o™Q,)˜¢e¦E} Óµ¤÷fÎËsFÍ¡XZŠ{ŽSéM’ÅÙ¸ÀÛKZîi¦Gg~d–í¯r·1ݨ9xðàA—³¢(Šââò/ÄZÑXЭägùs€ rR§#2[á²Oþ£ãñÿKcg¹{O_h"ËTg íÿa/™@öÌíPg¶ãpŽ€g¾Ü‡íÄp¹wïÞDË1 ùË_’è¦=S4¹=QI3³°.˜öï®ícª’ cT2V‚“Ü­ÿÙGpÄ]›¿U„“BvÎiÃúô <ß¾çN£ÀKJµUd,‚V¹ˆWǰÔ*Š¢(Êÿׇÿ› d8MÕM zjÚsÉÃÀ€c®YáºÈO¶#"¬ÁÏ·”[Ïé:Û*¢ƒ³Ù—w‡Àj, qì=S²õÔÿ( žˆ¹»»kAéÒ'cMÁ×A°³³£wŸ×K„Ô±¥0X=óê믿Öÿ_|ñ…ù9aðùõîÝ»DÂÉž§å¤ !Ö(¥á¤`xNWÝ‹:ÝR¹.¦uV³“òl9¾“$5üöíÛgÐù|  æ&ó}ðl÷'Λ• ™^aGôåÛ’; N:PEQ”ÿ³Žã(7Bk“œèdŠ +L¸ý¶ÇäÕ=†þv­ÿ­²f¥&(¢£œ=©³qõX²ÿñOëÿçøuf\ÆYù3:í‚çÒYî>œ=˜ùÈÔãõ4Ó)E/ª8*9¸‰O _MK{&¡D’/ó‡×9ß&œýù"‡?‰ù“Dz¼îtì¶Øjˆ+-8µw™B’ôl†€,äc±ÿH^oI=Þ=ÔA¦™Dž)ÆW#ÿEQÿ³" æ~Ö .ÛØÛQn„­òý½;à,]ÇX÷3!á¾³?Y¯qÖgO’GÐö&òÏØ<¬ÿ'Íö`#}õQ‡d‡ËÍüsŠ2ax}ÄÃwÙ!™‚Äj&å˜Û[ƒ=ýoùK—Ù‘Ç¿tɸtङ„·ïîÝ»~ïÇI| “úʱÁ†‚·Æ¸àTáÌ#ª¹^IUÃó?u#â‰Yõañ }o ¯-ÇWaöEQ—•ÿŸ6¦œ;´z ‡ÆÉ2Îa*?'>u,4·Ž»§r”¤ +øÿûðŸ·ÜA0aCÆùeÓÔB?‰=É$¦Ù¶öe#´aHµM‹¸—„VcIYí4¾ÝiD رP C¨xôÕ4¢@ ͤ<˘ºOtÞ÷¬ÞOZž[6·nݲMŽS†ùqºEèäµk×ÒЋ)ŠÑZ>‹3™8Àù»õÿ½{÷$×3Öx8] E›ù©ö)·Ôyúÿì¦=iDÒ¤Ÿ™?%öfÆê×)Àïh*á¢(Š¢üÿ‚óûiB ÒÉ2?‡A*lç¬Ò¢$K¾Q,÷‡ùÿ´ù‚íý%ùÿÿ÷ùÕé•ó)º@t}2ÕàâØˆ_}õÕØ×gB{öööTÈ'l0í4lóÌ#Rîàü óÁ¨Ã£©ŸÒIÄ´Ó=‰LAõ¸YæjTx&X™œ±Xm‹þ§?ý‰“`꟢ßÇ“âR ™­®gÈ4â:o§]`¼˜Ø¤Ì“qå$Yüú׿þ•Oƒ´  ›w”¡w ß3àÿt/žz"Œó5ý“4Þ1 0Ù;;;n_‘ˆUEQEùÿåæÿVºžbYož!Dƾ-A¦R…Û˜o=­aÚ+ôÿ¦Í>Ðíº7õÀ~º˜Œ8•=SÃé|Ä»»»Hh}/ª]Õ_C 2ï¤HÓÓF$ØÜÜÄú E®å#‡ A&Ó,Šj«|«©½cBöÕÉŒüJ•¸†€N0Ÿtp­és±üg^‰Þã&rxñâÅõë×=‹<É5.)>øÞe÷„±ïYìÙ¢¼u듉À‰t¹X-rŽ3^yœ¾™r¼q*áÌ>¹ª0þÈp{Uãüc~ ìé@ÿ¤’_«—29Ú¸~ëEQEùÿ¥çÿS…a2÷îÝÿùÍo~ƒÒÒê}˜6´V43æÌ1Š™±(1DBLï0þ%s:3Ò»»T É÷ß}J=¼ØÝƒHÖŒ0"*ˆ»]%,;lj lºÃ•"ö·oߦ†6PÁIgpè Š èYê+Êüè£FD¡§¯¨¼Ý€¯ÒÝòê@½ÍXÓí(¥éŸ `…÷Å>FÄkµÜg1ͦìNbE±ËâÕr”§tž„â±È Â糋½U`²ŽÓ¯ì—¹§k&G¡œç§-jéM”¨å—ë&~M‰é#`—m”…ÈtPûŸ¢(Š¢üÿ¢óx‘‰ëöö¶ÕûVšñ&wÊpFÞ ÈxƒâºÇðÿiɧ0+‘sQ}s<,½ùU½ªë%kØcqä I“EŠLiô8ÇEÜÙÙ¥›‹RŽ$g…KÇRý©»~ûÛßêäÇ=¾ºž?^WqÓ rΫ„ +É30>Q­ôŒÀøgrÞ”a°ìfkâÍ ×ôà'³z®Ç£³{—x†vËﵓ67?qLKö…w6³!ÿ#b 9ì?¦k{•y|à,iˆiåNnðÏ¢(Š¢üÿðé‘DwÅ“½â£É7±Aÿ©Öííí‰<'ÆÎ‹áúõë+ø¿þÄß-zÖ öäÍ-T¸Ü«Çeô!êI’YÝxïÞ=‡yÁÇ”¦ sƒ [;XðÁ¤®¨¡tLÈ´zòä $“H2ní±zÕ¦/¶©¾R@HÄbÇ‘ä3½…{Þö9¤ÎÜ¢™©¾„,¶ol ÄX›Ó¦‹7Ïå'DâdzWžž’Ž'5¾såIUÃ;S#CôåfÁм!'÷ “3³ug64±ªšR³æ'[Z¶Ç#âd©UEQåÿŽÿÛÐ5ÝÌ܆ë¨ÍaSú?]V'«iíììäùüßÁUÒ}«˜ ié`ssÓIöX³/ñvD“Có.‹6T±Äíím•ÆezN’>i“îÒ•7ö‘ÛâoÞæ°A‘zR—á= Ÿ¤¶8`¸‚e&WöSðèÑ#õªä Œ›djꀷ¸‡ÛJ 晑6ÍB¹ž™ì@£.Óq>MìMÅýh 4ù-‘©pvIJzd+ã‰l;ËP²Sñ&Ÿ”3è籿GŸ`–O··ÎÔcš±ÜòøñcoæWâ â EQåÿåÿ§ [¶Œ…æÜ! MlØlŸV®„x»(³2G<Œÿ£“OÛXñùÅ(Á)•Í^ܽ¾Ë1‹LÅa,Ë$ñí½‘u¤im>Â2 ãg+ŸoÞ¼9 U•¨dF‚µN€QÐÙä[+أ¬nºñ´áNs Jïm‘Õ¯¤%©‚3s@€¢lù©3ížàTìWy7­X1ùýÒÙâÎAn=£Òât²>õí„¶Ë/¹3of—€¸Í5Îö¢I»¼f9\žCoe8CåSϦc^”ǽêuoîû2o¡z'Ôk¥Ó&ò~Ñvüô»=°ÊŽÇ¹WmUheŽ£aäª7ùCY·fîä{•uúXÀÐ J ¯R ˜Uõs)ÿ°¯™:'M@G¸ª%eÊ5+ó§{Q¾ÿLï?UÃQг+ô "„Œ¥ÌŒºÞ+æÚ‡-ÿ_OþÏ\"â}~dx»]ùüø¼üFdŒÄcÌ[ìüñÞÅÒûÃ?”@!¶Æo…µ5ª·—–Eú¤_Y?JM9Qù¸9ê¦ÆQÇ|E3‚SšÐ µžBÔúŠ›ˆ7lÜ»wÏî½L{ ¿L9¸X%üÇüEij}÷7Ÿ““¨K±˜IúØÛÛcÇÚ-çOõãCØU8œ!ÝÛ †-’_]ã_ÇÂ@kÄ.Þ)aZ^§€xRÛ¨ùˆ‹e0+íÖàMÌ}=Ö#âk¥ƒ¡A)s5aô÷òõEb:4vï&»`vÚö²kêN±Þ7ÍöGŒÇq™“’Œ0¯Í ùݳƒÕòn ¿~|é±Ìqƒ@Áθʤñ {Ú윔žø†dTaË,®g^“É@ÓŸN~öÙg)”åøNZ£”D’¥›ˆE >ÂÐÔQ;¦¬FT˜™Àƒ,izÄ‹I¹GÖHjnÉbºŒ§ë×4meùS'gHjkBÊÿËÿOV[¢‰Ê«´ìðx¼|U|ëP«Ú‚ú]X4õÔçËõñ†LoÊ:À¦×(™§/í•‚;þÒ"ÁyÖ‘Ö| ¹xÙ-ÝŸSS«¤FnÒ—Öéá¸1—³ÝÝ](®lùãÑqÒ^Üò•AÄ o=qÀ­ÀHL7Þ¹sÇéíÎÀÈê2x ÂȈ¤f©9\ý^O *ó \TO“çMÓÿ,²î^–Úêÿ‹ h¥Íæm|mЯ¦jy±K=³fõó>/ökoÞ›¼:\R½w~/ uóTŸ¨ìƒráó½Ô„˜Û™î<‰‡¿“öŸò+ï†èÞåOØtrŠÈ±üâÛˆoéÍ}¤þÜD‚B›ókãHËYùÜxÍño\~òÉ' „J@³‘_x{cMú|³ˆ?eZ,666™\õqL  9£ÅÂyUrL- ýå/IÝ”çäX˜=EÖÅiO„îRmï߿Ms±ÞÇòÿµåÿÓ§ÏZ‡F±`{ ½=Ú9l$xYŽM¼w™;hiw™ëZ“iø2'S½Rð·¿¥ùÅNÍŒÝ.t0¥ëb6si?Õbv_…²á¢ïyú®jzS>~2’™´a)°Ø}ÆLÞ£j ¡_õ'ÙǨ 7ªæ®óÙ@õ§ÏÕšuzºw"Fä×øÇá°X-¤Âí ”h̦/Æ´)0®¤MñÆÉ£ ï¬î¹.x2óAN‘“©åpÁùEJ‚—»áކ7Æ3˜ òÊ'g›(uðd6çç£ç½Q§5ô>îùÔGrÌ1¿ø8¬Ù’Äí=ð}ɬ”rïÞ=«ú§À )›À`ùf§Q«ôœ>öÄiÔ£G¬!×5ô³73ù¸ýì2\³Êñ@ëïÅ¨Âæ0ˆE^\²Ïu‹U=\óÁØÐkúh‹Ì¨LXöʱÝ5<=&£ ÏI>9kŒCáiUúýï?ÉMˆ?”ÿ¯'ÿ÷¸èåÂÖbúŠúÓñî"§­ޱÀkøùçŸç÷üoû zþlžY|•·Â×_íN@»žõ<³ùÎíuB$éÿÃrrù‹»»»¶N™\T<ÇÈLÁÿÌðÉ6_L»³L@}íç›sXÃ'‚¡§8(n® “·Î²–—’S¢ýhü¼µ>ÅGU{ Øuípht Ÿ~úi*>üðCL•¦ÇÑFD­Ð€^ÁâCÁ»ïNž{oG“à”‘i/da!„ÉýdZ©ƒ÷ß,ü’T”?M¢÷| ½×™N®«–“YrÝjŒ/›ZJıڵmÒäš1µ­RR‚N‰Ý½‚Ø·KÑ¡ùh”ÿÔb¡¯´S·³£Áê$;ò6Žò¢@˜nêL«!Eøš»É*Š »H0åˆù쯥ۈ2ßFJÌLM’íímä8•àVx±cþŒ× Ò&)¦ü¿üÿm±/qDËþ½?Fù.A·ëuÖku<#"¿_6C²¨Õ6þ_O»Äë½\)Xy¥5‹#¬^Ó#¿lƆu žŠÎÈÄ´LLòlN{ýïú áúϱ0ð½Ö¿¹|ÛªˆŸª§½n­¶r!ˆ«Z…Ïl÷–}–QM<–ËLo€ÏÿBUýòË/½±2¹ÛŸ*°£@È ¨j#­@{hW“‡©›üIuìíí%™„w¥õ>d,·œ<Ùü'/²ßyÓPüíéÓ§ú¤8¶_H'§(=_‰±OíTò¬e‹áóÎf7t]vÕ©¿jnÍ3¯¼’ù~:ô8-Q'¸ðN¸þSª LošÐÉÈM:c£M¾<êCýDÙ‡ÊXxWÓT1Ñi)ê+ufº L vëÞmIÅŸú^©ù, t) ̱tŒl•â›·ù€Ó@Õ$We'/ºÑŸGôðz”‹-Ÿ}Æ!ùßÏòDõ• b.=Ž9”ÿ¯³ý¿M, 0=å§ôLÇོLéc+ëÄóy¿üÁñ>,V þÚ¯!ÿ·ð’_ø«¹.C•Y½LäÆ(Q¬taÞãýk¿VÖº¤hÅŲ¸çFvòüñºõ‹W@_ì‘r‰i“7µg<‹ÅÚ‹KÆ‘˜¼íN[´w úÐ 3{.x+üpÓ†ÖrÖ©‚¡IíAºZ!ÝÆ±£—š0·nÝòk ßÖ¤Òì5N Ì2H…ß§•Lêkm¶Áƒ\ÔP†g>A¤W4ôAÐd†ŸÛW(‹yˉûe3‘_L}ñ÷ç¡¢Ü|¸ô Ú;5'‡GøÑgê@ÄT¦kÉ}X]Æ]úÉÖ¥' J³½±”~Ñ/5:eç¤÷V·dx·±0¤wRNwBòj7ŠÓ”ÐJd-â”Øsü¹¸&[è¡&#Dx›x,Œ”TŸœTÜ‹ù¥µþ”q†k$B~òÉ'ú)ƒ}ëMvÆ3JvíÊÿßfVSê¢~“Öôm‘–|ôŽÁü±µ%¡ë™ÎòÖ¯¨¶:Ç¢qB&Uq]ÎϬ5`ž*ÖÛãàÂoæWÚÁârv¡ÜÖ‹Æ2í9째ûˆÁê¯ïƒêd©ËÒÇ=å|ƤåŒ] 3΃™óÙ¸ËÕsŠ«sa™ýqö8ÆÙFÖ=ÐLh%¥&å+¸‰VQÿo}¬£ÆéË€ÒÛyçmpù6¯¢¶6ôò~Š£C;¡f‹Êñvªå»Ì½BõTmýš¦˜YxXsÒûÀrkÖÅÒ–ÿ¯³þÿlXŸ'ù•õ×Ó×R™¼‚vË©RæË™BL³Í)x~J ÇêÁž¢ó¥ ½íÈüöD³½«uh>™>€6.¢@¢dd@ ËÎ6ʇZX8žýÛñðüùsŒŒ™rtÖp xBgÒÆñú^ƒå°xV$:ù´ÛÇÈÍ”å¨92Ýs:þ{H·À²ŠâÀEÇ|›Ù•¤ÇÐ_a—rÁ{‹u†7%QI¸ÔéäBÌ=Êæü™þóçÏ%ah!ƒ³3™",èJ¯?§ÔŸ™þÁ*mèOo|mÕ6o~¨E!bÚ¬}—zÒú|Òå !²iÂ.†8Ö 7q ëñçBñä$`5´V'ê;gl†”S=͇¼`§ï±ˆþwÚ`'ÚQPDx´þ·§ôÆ•ÜÛÛ#ÞgÔjü%Ýáv‡ “'o—¨í ™:Ü!G¼GðñÇçZ0e!]šÝÜ$é¹È€&ù–¼ôÙk£úÿbÅ¢“‰°ýÝ~ ¢â’ñ’yåŒÒ×o2ÑY¾æ­¾Û¶±<^ÐõòÿòÿòÿõTd?\»¾cCn(¨9?‹5¬’ o6Dq\5—ñ©Ä”§Øb Åt³ašÐ:܇Їñ‹]GoÓíŽPÄIg…~öìßpûz`©Îކyìi‹œj¾è·þ'‡çÕÕV¯Êˆ–Ûl ˆ]»ÉŽ2á)Drãóäf·Š"éØÂ’¤”-.£’õ2ôºý8\f–úŸd:W3•^qêž^9ǘ'æÿ¼8ëœ_¦8Kx5Éý ç,örp<²ä‘ïÞ9…ËÿËÿËÿ/ 2Fúÿ+ë´øùçŸÛ/O|Y±ìI:ùÿšÏˆ«™ŒÝßIºÚ²¿ZàâѦîcw £±e nç·¶¶Ì`ÅÞaø¢`ŸÂG§ GŒhggbÿŸA¼9PM¹2Q4‰ÛûõtW;I¨?ÝlÙ茅/O’­’ÉØj1ó×£Ùg™¾<(³B;˜’ã{?űLUŽë\Ål± ÞGí¿‹¦Å_›Éö£¸‚p<:&˜3•ŒˆY—’ãñ ¯_m»|©ü¿ü¿ñ?G¤d½š¼%£èà®k¥ºÏ‘—c¦ ŸYŽŽcDXl‡ÜOÕœÃÈPÚ»žÒ¼³ÿý>ÆÂw8¥3ì~M*2:ÍX¤éqV/èô æÞ<ÅÖ,g¶TYlqòS¶6ÒßÁIͰJ£z‡I÷Œ—­zf-C9"g>úè#Ôøùë$¡dUÉJˆ„®¼Îd·s™ý$—Õþ§8Œrèv”àq¬ìN;ëWþ ‚wE àk¯ÿü™™F¸cìyveŽûËñ2–ÿ—ÿ_YþO˜Õ\Ùø?Ël º5l|߸ÈfP˜¡Öz>2ðIý™ä~Çä»—:3 $Ýžû)dó$±×X™ÿwÝ0›dAª>¡(Š¢ü¿ü¿üá´¶ï½÷Þööv¦0¾‚]f¼fãOŸ>EÕ¼B ÐŒ¢ÇØßÜÜľå?ÿó? ¹³±±áì`ÙÕèô.kÕa€Õ«lM 3§õ¼ˆBhªpÙL±«rQEQþ_þ_þ¿V˜RA]Ù- q™"ð:€‹…&Ù×üóp ÌÖ¦5¹टémªò3Eã%æ‹ØGê—/_ÒutKzO_ “ÆZ³ˆV4kQEùùùÿúÚùÞ>®¬þŸ(á(Žº··ÇŸœ‹Ä»«?)\0™õšÙáÇá@3ÖýÕqâS÷šÞ;ð¦ûAÝráöAì'2ŽÆuÉ,Š¢(ÿ/ÿ/ÿ_ÏM5Qa2\Á~€«»ÈäE-÷Æ«W¯ŽbŸŸé„?üá.Ÿ¯ »:ƒG€KsjÚKì:J«'a‰0ž¨ÃSçpQ`W‘Gݽ{·kkQEùùùÿ:Õåwß}GfØ«i·œq41ÄÆ·¶¶’é0}Þ9ÌþÇN \6±Yqþåðª*“ò3¿íåþÞò±ÝØØ J¾?7nÜ ©€»¡Mß» P[,ÎÜÚÇUN¢QEQþ_þ_þ¿æÌ_° úÊN†4;·ø“Þ¢s¶ÿY-=þœ Dþ¹åÙ³gÉ9ÖO/^¼p´U'8F0À ÚÎæˆz@=C/âíçÆÇï~÷»rÖº÷G•êäÇ)Š¢(ÿ/ÿ/ÿ¿¬"ÀXhª¯rбð†v?R~sseµ¼2 Dh¹=6JlŠJý6g01ÒzÊ«W¯ø]îyhjwµÓ®×S_ þü¾§uÖ”†„¡$ÙºØ"w¶··'J³ú.ÊOpŽvØZÀÁ¨6 ×07Ã80bhÙ'$z[¨|çšfà¹À*N«D`LšùéÙ³g²ñÏm¾â©Ì×;SáúXJ¸nË”¢žiw²ßl;dëî‹à0:sà„‡(ª|;_î-·Î]í®ã'»NÐo>ôŸ\à¤6#œ&4. ùr¥7®·]|Á¤ÉÏ+9ïéíGLEñ*9Iܹ¿ÚEQEùÿZ8µ÷ÓO?MžÉ±;°IÛœHt>ûì³ÝÝ]ò­I’Y5öý÷ßOÕ®˜Þææ¦ƒŒý¨ïê [Èè¤MAŽuãÿ¦dh¹-Öi& òH6¼{÷®ä¤¡_%æ%×KÊPù¦Í"Wšç;+âÿHžõˆ3Ïý§mTÄ÷’Ï‹^2”VüBi£GY·Û @?¥Ü%\nh”ùø0CH‹À”“Ü­PÿóSzë.zÒYü†ª4õ¹ÇÂߥÏ?ÿ|¢è_ýõˆ¤«*VÇúÕùš“ØûöL´JbOZ!m–ìÙýàÁƒ#~E‹¢(Šòÿ³azZïX³ÄÆŸ>ž6ÛÛÛãuk@õ$C Þð1Šza Iì]Ó2“5@¹í²‘ß7=×â-=o3?}\d±°þÒ-:³»»‹˜ ÙJЯWêEýÓƒ»"@QEùÿúðÿÔª‘vóùó禲lakåZmœ¯ÕK ìaŽøh|ý&}éy Ê`? *!’üþ÷¿‹à$-1 ÄöãùI×ÿ³ CW¤VSÝ’2Ý7k2þ¹÷ƒVߢ'’oËljfÅÄÿǾý¹+†é—EW´÷j…s(Ø™gD´d(È¡÷˜t=çõD4Õoì· 7†Û«üf}ùå—L‰¯¾úÊ£ >¯ŽB ÏFIŽ%Œý=ú\×S ¸="XŠ6ø±,àÅÐã¨b¹‘xþlþö·¿åÅ·Ë »b“KHQEQþ¿ü†¬É4àÀp^«íyÌ…°Œ]m/ôôéÓ›7o¦ÚÿUØîÞ¹sç@rbÅgÄ%`zj gÞþ¢ØÿŒ…‡# ö ›r¨vÈ*4i…þÊvªñ 9êaMúsM’^hÿ“#Má‘[ÒxÉž¡¢‚žB¼“¬”ãÎÔó¤uñåοlîÔéóLžáí¢ýyÙµk×r¿é›o¾IAÀ_6f#ªû±é ãÆ ‹iú_·èzX¡á}}(Ìçu —ÜÍ÷îÝóC=%˜ —XŽ+Š¢(ÿ¿Xü?ɧ –?«¸ºžõŽ ý7òXØ£–× ÓqîC¯Т݂汲ë'«ølúëm ®Ñy³‹£cÝøFþg&8<,jmýy”Z>ââÉ^ú@ZËìÜÉÒaþ¿tËÔRO˜É=ïJÙAÉÇ*ÍÒTS½MØ%ͺËí4êÏ¿Ð~ÜjldõäÉ“±ÅG½}«kì¨înL³¦æ¤•² u/ìÅÓlÝø¿åÒœIxùüóϱjððeR°±0uN³Ä"Í+,7haÛÕ^w2?ɜ׊ÿçÆ‡êöç?ÿY¶Ýø³gÏ0#aþïîáÿn2o‚Gñ¡æÃbþ“ä´íÓÕáÿÌ5|{{›‰a¯ u—¦"ô›® Ë(層KŒ¤&îm¢Î¦•-ÓFX[%Ÿ÷ “hÌÛšIÝõoŠ?€<7]f4¸F7rÆÛ nffyvš`ʼÜ~EQåÿçÈÿQáj¡!œÎˆ¨ChÑç[·©3"9æ$ZÎ`tc)FJr-¢‚^vm1²†ú5Vmw{3"¥ ßÿ}[nsrÿÌ莄1ôíÃá‰kÈÿÑX Š.š¤zB‡nܸ1¡Mbé„)|¥Y´% ±ðÖÔ¯8Œ`f›õáÿÖúêÀa-é I¶ù$þèø$Æáœ´{ˆØ>ûk59Jï«Æÿ ºÈŒ:½àíSê}OôIÉPcbÔŒZ:{Zæ®\Î+¶±P\è\¼Ù¬ñ]H‚T#3ÿZjÈ}.ç#óþ‘ ,˜°# GgQn2õ£ËUQEQþRK°Ö;5/În,vØ£ ×6[ïsý¿ýÛ¿eT=õÞ>ÌëÈœ›‹ãúðh˜õŠ4ÄÌMLO ¸ª±Bõ ¨úuŒ@$­µ¹—ëÌ€¬¶³i’Yb±3¹Êúÿìg¦‡}{KK3P±M¼¡Ž›»Ëq“‹ô8˜4LWË ¹À,ÕÿS(àqƒÀ²4­GûûÀë ‰xùÅ—aŠ¢(ŠòÿÓc}ZÎÄ~µ„±Ày÷9wØmªj/y¬¶~ýÄ]âŠh8%AdHÔãëÆÿGdÒÿi!ìýzNªþ4\´„5Ú½¡~R?4s'Ý%¯îÚÆÿÅRÛ™ æ¥)yb¨s8©ý+lÇd‰T¯JÆ<0¡ðX?ý?Ö8Œ ‰!`ešÌ ™i§iÛT‚Ú›é’uœ„Ÿ6zåjêÿÇÂ`&½èU§Íâ«¢ÿÙrÒds2†cggÏz®wŒ É M/££ø"Ì øº‹°NÄ%¦(ÛŒ²ù7E`ïØÎQzï ¢éÎF¡¾·4DC$´S̨ýOQEùÿiB ë”Ý&Y½y‹–'WX¯¥ÅN%°«®s9 < ¬ˆKc×uãÿt‚-² lËñ@ÌcY¾³ öû‹‡©T¯òçæÿ²/äÖÖ–›«wÂ#;Æj@ÓçÑ”8û´_ô-éòAÜ»žö?žÉ’ãvww¿üòËñzH‡6ÍÁEi¬»ìè¡V$·—”¤&ÛLeÄΑS_µø?êUâçóNi&ðºÙ–^O+2¦%¸ÔcÄ"ãW{$±wßf÷Ê Ño¿éßG@öœœôüôñÇKî€ÏãæCe4ÐP}Œ'™ø}îdD~7ýÿ—¿üÅ%«’Ot”|EQEùÿ±áøØ8{j‘‚Û;š1ØÑ{qRàdË*ÁâƒÃæÛŸŽãõôÿÅéu¼øc7ÙUµ½—™p¼na6»s«Sí¹žöÿh#Mk3’y6Á¹®`YÓ’,,/6õr¨ü)ÇîZñÿJ|@~õ:ˆp5I…ÎfaŸˆÝvËÎ#rF+©ÿG{@—BžÅ„ 9¥†Hã`î\x£dÚˆÁÒp M`ãKù9râò<“¦þþ*ºv1vâìôQmQÍ/‘^ü Jͱš;pEQåÿ'Îÿ­ìò4.½"!›››S„º˜u\ëæ¹çDZæØ÷™N°58—‘EèDàÐ@SØóåÿšØZ¸V“5{Æ9?)L &Î}J¤'f!¶1S…°Y½üî8콻ğ\ظíjˆpÔ-¨ñy í­O\Y»åêâW˜°ffé’&t#4Îu"±ŽYítlª/¦ÃìîîúÅ$ôÐCÅö¹†÷Å<ŸÛ3cüh|6KÈžWËþEQEùÿ‰ÃzËÇ£s»ÿ¾Õ›éòéÜX'õé§Ÿ:â8_“WŒ~ÿçþǩʹ¦CíœÃ‹ÞÐO'Õêmõ¼e1ƒswú#•­i,–KL{†é³Ï>¡»~G<|øð¿ÿû¿æœ#ïu~gê`Û'‘4¥,+ÿOPè°aUn‘\>ØP »ýñz ÎeÐ-¶"óŒuÜ]{ax˜@n*Ñ¥ÎIA–¡_Qì§pJáza¹ËM”Ì.§µ÷jZ:èÄg¿øÓLEqýÔÌ¢(Š¢üÿ¡%Œ¥åFË1ú./”¦7'ná „Äs"¡SuóÏ}?hùOBDšûÙ æ19S50…:=¸'yûèÌÕíÍ 2{el;¿¹©×I˜<)›y¯Å›Ù¨ŠMÕ Ìúðy¡¨Ï?ÿ|>T×Ó:}E½½E…3ŠÚó­(Š¢(ÿ?=hUrPš± ‘ysNC9oWGGü>G½7.~äñt*äÁÓïï¤Hæ:~µýÙɃ#é`ggÇí…­©Îöü=)Ð kys¾’J¥s¼žyj™±¿;Ôöäü—ž¦ôXÄ;Š*þŒòß±¿}™æ\Œôêd¾Ë_?¿t)Šp~2úùä²¢Iëä_ËÃocêÝ՜ꪉÎûéëÿª(Š¢üÿRòÿIoÆbçN0)8OJïÚŸÝpâIž¯¿ÛD9îÞ½ûí·ß ’c˜$œ þ,’Æ+Îö©$8ÁÌáäd7È~Xž<'õé–¿ ýDìU¥{÷î™ÎÙ)€i|Rö?ãõtQ:¸Üq`ˆÞil…üaàw>Æÿy†Û¡Ù©Ò÷ çàÑ£Goj,"ÿŒ°#òOT”Ð$#a¨?Ù9âkþä}.‘ü¬Ãé­§üóUEQ”ÿ_zý¿õÞ¬¿âÿI9È¿szFÈ<ý|íȾ:áÜß{ï=¯Î,åß¡°!ϬCÜŽŒ¯hÇIu׉«è1¥8’ßetø 8¤^/^L„ü­µó-[Îqù™DÜ«y¯÷b؇J ˆúr]öøñc÷dŸ+ aÍÀ¿’úm¨ï”ˆ~)Ìê3HéNRÐ@ŽàÛ¬N!ÅNOÜå9fá¢(Š¢üÿ´—à f‚‘3«0VX`üO§Ð5ý;÷|¯^¸ïܹÃÒl ¡—~Ì„Nª2lH2ásgeÎhà\«ŒWJ@'u¼n÷>õùÙÃv8TfŠoaù44´”‰®{¹Ï/’·£y|h <9Ç"÷„ÿ´ŸÉƒE_++á Ñ3e¸¯'­àMO¯ažâÞ_*`1Кág¥qW~^ü8ʱSCãÿEQ”ÿŸêúk\ǯžbþ¬C’$ɘ‹Ÿ¬ªÜÁ÷’æ9»×â³ÑÇZ(“©ÁtœI–ÇIç ðü·ÕúýÄôÈ@%ç.§@䣓¥“4Joß¼yÓßÌÓ¦Dg2é›mE–³¡(™¬Ú'?J å*3íL¥’¹(Š¢(ŠòÿeˆN¤^Ǧ|Ð8†ØÎóçÏÿyN€Žç4⑺Ìèÿ½½½§OŸfÞ[α08UP%GÝÑ™“gØq¢vø™‰LŒWu¸uëBÇ2á'ú͹`@Ô?'»Y ™O´«±ï úÑG‘+Ê1œ©ÖÉœ!bggÇy¬ôÙÚÚZ¾fE^ŒébÝÎy—s÷î]=§8µu8š¢(Š¢(ÊÿßÈúÆ"m¥yžC4xYž l…ØI?YWYu‚³‚’àÕÇp9à뤺è´ÛËsÿë¿þËc¡ú`±À`™¥ŸF¾0‡.Ô³°xOñGâ åìáVûŸªýXr'Šõ&Ñ$ŒÀÀÓ"…3ÞNZ±oÅOŽ`ã(÷ÖùÛNÆCÀå«ÑБEQEQþ¿DÌ#è¥Ù>ØÝÝ…äªòïç8þ¡§at Ý‚ãݾ}›¡§C¶··¹êõäÉ“Œ{¿¢½c‘ÌÈ>3á˜Ì0OªœêÔÉÕ$€öÜ Oô'Ÿ|ò«óƒ[éØNpb¨pÂRi¸E§Éˆ7–v^4%ò‹‘xø:²…ÏaûüªËò®Lk•~²üJ Ýû÷﫞öÙé—¼(Š¢(ÊÿL%²7Bo):19å£?&5?wÝNƒç¨|•LŸ ôæ¹âctBž<³©¨Çq,)LsR”AYOü¹¨Ö766Ò^Å;#ž3ÿ÷ÿwŽï©j’³Q>ÙA™¦:D°­Ã'.Vº‘úÝùòË/§ÒœRíÆù¾@·¸ÔIÇœ£Š÷Tâ!¨ßhQEQ”ÿ=²Á7ß|c'S¯x¦mBÎQN‹]€ÓGÈuËq† ùÓŸþ4‘í3p&϶í=nß¾M(~þÌ̼'=”É0y­Ú°$sãàYÁ”8ñqùúë¯y„žå7îm>åV™üOAž®ées˜þ?ƒÏL·O‚ƒCƒ+RÕÓ«ºœ·®(Š¢(Šòÿ °‡ý¯+Iͳ&C#v$–%Zµ½½nª'ˆ 'žv™oè,[mµ61!{®'ƒu‚U‚vªÀÝÝÝÏ?ÿÜ=Ÿ‰MuàœhçÌþÙräöo½=æ«—H“ퟜ&Ãñy˜<“ÅŠ­Šé‚å8WT̉ ¦Ð©ê*ÿ‹¢(Š¢üÿˆÔZ€ÿÛ¡e/`˜0ÖÎç1"8ž“s,ÏÁ{”à‰pªLÐ3"'ÂiÊ7%E5¨§UÐ';ÿyÐÿgXK§7¢n盤Àb©ÃOqýÍoGlLØ|ÝBœé.g\2Ž·c)Ê+#>%lB<%ºkB­ Ãí©(œ%ÖC‰ßÄ$¬ùÀ6TÝψشòïÅõj)½dÃ'KùË EQEQ”ÿ¯@2>úHÜžæÃULÛDQ gBÁÓ™Û·oc!#~ ¥q°š$'xMêÀL&¯ÑI•£§è`kk+Í*N›ÿ«ÀgÏžQ Õ!k%®åí:DÕƒ ~üñÇ4D÷g{{ûÑ£G˜*©‹¨§áÄåÌ܈)*q€T_o æyÚüJ'»Î:N#öÜ›P<îê"ç) z’EEÊÉøEL0O ³k¢Ü{zøLŠDÑ9UþOF-»Z§»±Ûå œH œu ×kè «¥Ÿ$Ù_³».ßw)]”sLü_—©ÛtR\£®‹ØPèÌ”¹£(Š¢(Šòÿ€´^2)„Hié(Ÿ5½vŠÔÿ67“7⌊Bé J” އY;¼kcccooo;9™žªþŸ ª§*Á¸dবަ¦ùOA,Ñô•È0j £*‰Þ¹s'-|VèoÏFÿoÆ+bIÅTCÕŠ™ Rй‹­PÈe_ºQœS "ÆnÏfSN˜>ø@½¤øíØ×xó8è±÷Æ™èÿ-ëY ½CAë<÷з3š>™Ó@×ÓQú˜xQQÿCãuÖ;Azâ5¤ðÜà}ÁX¯-}¢ëÕuéº^EQEùÿ2ÒÅ‚ñþûïS}ssÓF/65çJ›$YµAÆÉñ~¥NZ·)è ³~zµdPÉO‰ÿSQMV5rç"c Azi\×;v=ÐðÃ\×ç-RÑ4QÄ4.ZÓæÿ*“¦AV=Än‹ÍW,ÑpKº$è^.ó]躑t,÷1>ù䞈.#v¤ æRÎææ&e>xðóyMëÉ™ b¢ÜØÆö?caî®ÞsBäSÕÿ§-–Ý‘y©û_ÿ3§«þ·ôªi”§éêoºF] ¦—c@¥·ˆç “Šð¼91Î&?uQEQ”ÿ_\ûûІY[&ûJ~gƒ·Œ…JÖ¢Äd±Ã%Ò‰8SJ×ó°ˆÎÐî§ÄÿU”§&³µ!Àfùs„¡Kòð)>¿Ûè¶13™J€“Üå„ bq>{þŸ©ÆŠÅmnnÂ[LTÖ 6½Æºæ¡2ߢ»n8Ô+ Øú€¸1ö]±YplÞ‹ˆ‘Ðòs-‚ ûì³ßüæ7)Þ¼y½7f0ÖQÿúüàºe «¢(Š¢(ŠòÿÕÈ$§c߆‡3ÿ\3ŒC\NpÜ]æ”nl­ ‘‡)óIÁêýçÏŸgDJó\ž¸nd[Õ^a4UEQEQþo @w2£[OE=©¤rí3{"€ÿ«ð—/_jôq5]ý'«üÿÇË?Ùm™ÿíó\€”ŠÃEFÚé¬(Š¢(Šòÿ£SJË©ø]`ëB=½p‚Zè7¡9UãÕt÷Äã 24 °,´×A,r¤M ­µÿ)Š¢(Š¢üÿ(dz:]V¥®¡ýÎ$ëdó¡¸H$~¢+Ö­¦ÐŽT{9Bé»ðêìX‡ÙÉGˆiÓ9/^¼8/ýÿXĽT`³”8‹¢(Š¢(ÊÿW@ìÎI]Áú½¦7®«zâqÎ'–»†û #"‘jŠž¬T¾ðjì ,kx#ÀYÎ éúí€Æ½/Š¢(Š¢üÿ€Ñ‘3u‚Êä&úæ~'ëªà†¯y$Ióä Ó°×¢cyŠ=‚Å®—Ÿ{Žñ?3 /¾É ZEQEùQEQEQåÿEQEQEQ”ÿEQEQEùùQEQEQ”ÿ—ÿEQEQEùùQEQEQ”ÿ—ÿEQEQEùùQEQEQ”ÿŸ,¾ûȚD §/^ü«(Þ¤Üzùò¥_œÌÌ»VÐü'—±&?¾âÝóБuZ“Šìù‚Žz+uà´€¿üòKGªxÇyÎìr:Èu˜íEQþx- Õ¯?~¼¹¹ùë¢xè¹{÷îÎÎÎíÛ·µO?ýTÿ¯á{½±±qýúuÕíÆTµÃW¼#®]»öÞ{ï}ûí·L3±£ï¿ÿíʹÁVÐô¾yóæ¯èHïø>úè#ýÿìٳŢüÿÂÙÿüðÃ(¬hæò´âÂAËAn*ýøã{{{k¨üßÚÚòÞ„HjÛ¢xhFÝ¿ÿåË—ÏŸ?·Žå¡wP5áÛîÙÎ&]Q¼#ôÙäÛ® /.a²TåÿkÎÿµ4èµå˜5âúõëÿ(Šw@n-ë)WªVz©µ„y [5ïï–‰¤ÙçnÿÆô¾ví~óÍ7|ü‹âذ]™fû/¿üâiVåÿëÏÿY›&[¾êÿ‹wŸW¶‚0„¸yóæ¾×ÉÓDÒj¿Zœ”\‰½½wÎ]/ O³R·ºŠw6âüžWl´gŠòÿõçÿ¶ CóñÖÖV5Å;êÿ‘%mcðÓO?­§\yíÚµeÎß,ÞbD’vùå£=_²ýâÅ >ïZ¹ÆboNT­#U¼ãwj¤y% ·Êÿ¢üÿbéÿ­¡û›wÏŸ?¯þ¿x÷÷…Õ!mŒwww×­ž"E7nÜÐ+ Åëûï¿§¶¶¢xܾ}A’µã ÍsøÿÚã*.Üwþ‡~Ðt‚3À%lN\åÿëïÿËr .dÿßF6+Þ1.“JÇh>±=XÃWÛµRUaþZÅ:‚Å;Îæ•&?Óé|Eáoݺ…‹ýGªx°©¤Ù…´›†ÄEQþ¿þü?-ÿY¤ÐÅU˜WH»ca ×%¬¸|óÊ5yï½÷r÷(:¯Š¢ü¿ü¿(ÿ/ÿ/Êÿ‹¢óª(Êÿ‹¢ü¿(Êÿ‹¢óª(ÿ/ÿ/Šòÿ¢(ÿ/Êÿ;¯Šòÿòÿ¢(ÿ/ÊÿËÿ‹òÿ¢(ÿ/ÿ/ÊÿËÓŠòÿò´¢ü¿(ÊÿËÿ‹òÿò´¢ü¿<­(ÿ/Šòÿòÿ¢ü¿ü¿(ÿ/O+Êÿ‹¢ü¿ü¿(ÿ/ÿ/ÊÿËÓŠòÿ¢(ÿ/ÿ/ÊÿËÿ‹Î«ò´¢óª(ÊÿËÿ‹òÿòÿ¢ü¿<­è¼*Šòÿòÿ¢óªü¿(ÿ/ŠÎ«¢(ÿ/ÿ/Êÿ;|EùQt^EùQ”ÿEùQt^åÿåÿEQþ_åÿEùQ”ÿ—ÿ}eÊÿ‹òÿòÿ¢ü¿(ÊÿËÿ‹òÿò´¢ü¿<­(ÿ/Šòÿòÿ¢ü¿<­(ÿ/O+Êÿ‹¢ü¿<­(ÿ/ÿ/ÊÿËÓŠòÿ¢(ÿ/ÿ/ÊÿËÿ‹òÿò´¢óª(ÊÿËÿ‹òÿòÿ¢óª<­è¼*Šòÿòÿ¢ü¿ü¿(ÿ/O+:¯Š¢ü¿ü¿(ÿ/ÿ/Êÿ‹¢óª(Êÿ;âEùQ”ÿEçUÑy^þ_åÿEQþ_WEùùQ”ÿEùQþ_åÿåÿE_™òÿ¢ü¿ü¿(ÿ/Šòÿòÿ¢ü¿<­(ÿ/O+Êÿ‹¢ü¿ü¿(ÿ/ÿ/ÊÿËÓŠòÿ¢(ÿ/O+ÊÿËÿ‹òÿò´¢ü¿(ÊÿËÿ‹òÿòÿ¢óª<­è¼*Šòÿòÿ¢ü¿ü¿è¼*O+:¯Š¢ü¿ü¿(ÿ/ÿ/Êÿ‹¢óª(ÊÿËÿ‹òÿòÿ¢ü¿(:¯Š¢ü¿(Êÿ‹¢ü¿(:¯Šòÿòÿ¢(ÿ/Šòÿ¢ùΫ¢ü¿ü¿(Êÿ‹¢ü¿(ÿ/Šòÿòÿ¢ü¿ü¿(ÿ/O+Êÿ‹¢ü¿ü¿(ÿ/O+ÊÿËÓŠòÿ¢(ÿ/ÿ/ÊÿËÿ‹òÿò´¢ü¿(Êÿ/"Oûå—_|üÓO?éC¡òy 'Y…Ÿþ¹¼«üÍyšæs¶ë‡~ÐÁ?þØù\\PþÿâÅ O]Íd&¹§ñ«W¯øtw@‹òÿ¢ü¿üÿèPiZMXD¦ó/_¾deaÑ)Êÿ/OÓdV[Dïù“ÙÛù\\Pþ/|ûí·H²“fæéÓ§)|÷ÝwÖ¢ü¿(ÿ/ÿ+)€ƒçÏŸëÿÇóÑ`w*ÕÅ¥üÿBð4OTÍ[5ʲmçsqáø¿Ž½EûàÁd ¾FÒwŠ¢ü¿(ÿ/ÿ#’}óÍ7ú5©8æNcåÿëÏÓþö·¿}%?ÌaMòÎçâ"ò‘¦4RÇšÉlhbçÅi‹òÿ¢ü¿üÿèxõê•©‘VõÞµk×òÛK°;P”ÿ¯-OCÛÿý÷ß…ž_·ß¹s§ó¹¸ˆü’~µÍçôÈw¹(Êÿ‹òÿòÿ£ m¡YJ(œ>dgY°ZQþ¿æ<ÍÆlžÌšäÏÅEäÿvïE˜½yó&šÿÛ·oëÊ —´«9ÑfQ”ÿåÿåÿGÄ“'Ol¡®‹]fþÔBÃsE™ê8Yþ¿æ< q! ³ß~ûíööv®zÏÅÅâÿ†¾É|œÑÒH.Ðe·nÝÒk›k_‡µ(ÿ/ÊÿËÿ{GâM¦®³ú êëׯ«=ê+ÿ¿<ÍVÐ7oÞL›ÿÎçâÂñØ>q~TaªêØV pݲަ(Êÿ‹òÿòÿ7‚ eñÿÍÍMÿi‰€þÌ åÿkÎÓl,!ú¤vqcçsqáø¿bÒ"d+MrÓþ´|+Šòÿ¢ü¿üÿäšD±¨IŸ={6Þ’ Ø&¨¿dùÿšó4[A›äÓ´Îçâ"òê¦ïó7R¶e>Ó ®Çç½(Êÿ‹òÿòÿ#B,Hœ{{[¤ˆe=’­5Dj~Éòÿ ÄÓ˜´ºLΑÔù\\8þ£úÍ›7—#ÖþíoãCm'÷ŽiQþ_”ÿ—ÿ6.åOLIs5ÙØØÐ£«,-ÿ_žÆ5Übsˆ—/_v>‘ÿ»ª#tþü¼zõÊnGÿ‹òÿ¢ü¿üÿm0í#Ûøß"½uëÖX8£åÿëÌÓô+ ,Ĉ˜Ãùçsq±øÿ·ß~{ãÆ „Y¿f²ØêLƒTBM€Šòÿ¢ü¿üÿm—Bk™öš¿þúë¼ (ÿ_[žöêÕ«ëׯ«E:€Þ/¯zÏÅEáÿ/_¾ÜÛÛÃ\MÿOJ~ýé ¯hQþ_”ÿ—ÿ¿~þùçÝÝ]-%ß}÷]êÿõÑÐI6X_,´(ÿ_[ž–\ˆKÐÎçâÂñÏUŸ|üø±.ÖLæÂ[}òÉ'<è˜åÿEùùÿñâÅ‹­­­ “.R¤G`,Ávó“'OFULåÿ§¥¥4íb ó¹¸ˆüß¶ý|¢³†ŽÒàËR{SåÿEùÿºñ6s3o£^O}Æóõtl‡ñzˆÎ\Þ¤ŒÌµãûï¿We666â+YSlMªê9jºJ°Õ´Î«ÌãÅðRe[£”A–A…mõ:Âß-kN)S·p»nE|l¥Þøç>®ÈbJ=ÙNœ«df;#’veIÎ9¶6ž™à¹êZå+05 _³TÂ,qÑ)™ ýèóyúuõü¼šóùmù¿%_zìD¢ByÂOÞ%.ü@G]_ìÙÎõ+æ3O±ûÉÎg•㙦c‹Hç;Ÿ—ßå∟&óõdCEåÿçÂÿóc¨ãï÷á÷ÔßO7ç믿Öÿ>ôŠ OºÞå·}®_ùo¾ùFÇþ8ß»wÏùRù>ó§Ù—×—>øÀWªz:v!˱éŽÞªŒ¿í+IüÒ´›¤N¹¤Òú>×_u=ƒZ¡óA9X— Ó©4÷p›=)¤Hë‰ÍH¥l›dÆcGçSÉ7nL‚[Tg˜ßªd]Éu똗`>«±yËQÈü•šÏo uˇ~ÈÁÔ·Ç W5 \94í)Ù3A8¤¿ŽùÎó+3Ss8eÃæ³¤Ëe3!·â¤æ³nT™<Yò¼æórŽ3•S‘öˆz?‹‡) Eùÿó>Åz%ó› ñ'îË/¿Ìg~÷X_Ð\½ø`&%&Î'Ÿ=èÑ£G2Ñk µÒ—V×ß¾}[Ee@u¾-ºfÅsWt…냤¯ÓŠrP¨øÍgMQýqüäÀ­àxueÔ±.9Ié?/)’QxÐ% žÔû(ú‘*AˆÉ'êdFŸaô{LNÎãœB5¸“á)ª_™Ì“âcé‹>ŸéUìÀNë|~[h2\¿~Ý ¦ÓñœA’À[àÕLH¢¥k49-½½Ïø´¹Ûµb>ëW=…»>|¨çîìì0aNd>§¨È»†ê¼æ³î(^äÎäÕ0©ØØØðP®Þš,ŠòÿSâÿùÉÍ=VU›/Ûò«˜9o±×”cØiP,/¾ \.'™R.Ž~®5´,ãòÎüc#ö—WóÉé̯°hã®ûZVèé‚7~÷¸ÀVC—8KÔòRk“˜DZ#àT¢§˜'xŒtžczžq41XQ+MT&†677‘2à<šQ&BÌ® =ŸWL×ÎçãAŒÈ^´þüêd‹{cÉÎÇ_x~ebx/Òb²ÿÄGóYb/;b‡ÍçiáãM9Áù<»¨GÙ6:íùŒ›³P]‰PÓi|”AT_i <ëÚoEùÿ¹ð«G¬×»éì7ß|ãåƒõbú$꽼ׯ_Ûçò/:Ðú⯑?îcâHþV«>êXv.|Ù±w`]-jÞY½Ðx+Üš^zïæÍ›ú]® ±êûŽß˜ìiòW 8¼ZêÁ¥ŽaW¶zª{2›ºäPÒÛËÏËfe–Rõ"¨@lZx5þú׿zì°\J#|›vO®t>ëbÜè‡ñ&è+8Ÿß 0"&ž¿ï‹ò^ZN~MƒTVsÒ³Wä¹íÙ®õ+_™åùŒ4‡h`s8­ '5ŸyÖdœÿÅ_œ×|öœ‹S]P¬Ú<Âjá«(ÊÿÏ&þ>_|!!Þ|6yO·¶¶ôÓææ¦ø‰øÇúÐé»çÏÝ1ì¼±ýª QIŒÍÄr"}m2ÙØ¯¶s8lýv:ìõ¹Ú^%uJTÑ1tž¼NI)Ó¾wŧÏ+Kª–'Î\Ö}a¯î¥q¢þ¿ž«*\ÅŠŸ?~ü˜?ÙLJ-è=eÂO Cä\|ä]«Ô”2”š~:Hq˜YíÆL"+vqçóÿ×Þ™ÿÆu]˜2IQ”h9r-/ÕÍŠ¢KZï²ö-râ¤)‚EäçE€ÄŽ¢]²dËKâlhж@Ñþ I[¶$“â:ûÎ!‡CR‹eE²­’¸ —×CëøjÈ¡Dr(©ïÃÁÅã›…oæyï»÷Ý{_^EC>Â$ã1ï·|žFþ»æuN¯ŠtéÒ%=ºJÚH>ËÛ.]ºÔµV»n+VVVêî^¹r¥íz«>È>’5=ôí»;æ³kÅön3Ïg«hä^ç*ŸÇ»«]€I¯ÚíèKË?àÿsëÿz„´ú¸œw´ #­¬ÃCuuµ76Ìs®ËPž GÑ©b—ä+ªªª²+¶zP•GÝ¡UîómŒ›,È ucô¨âvašvÓ„ÌÇ_DvéîîÖjÙ`·åGO¾º‘Ú¨ëžÙmó.\¸0ùÆØÈM;ËL{T`écªc ²CM<Š‚ €))r§ßÔÝ-ûN§a”¬5ÉJ‚©!hwÕªUÖª× úÇðnõ Ÿƒì2];Áé4nrÎë|Îí¨“½OÞþy_åóT‘/Vòʾ@ùЦ-ÿnvÉ>²á–úµkiCÚ­ªë9Ú€YoìÎÔ’6a’|vÂ[]£¸ù¬ô£e³ÙÉŸ<«ù,ŸT?—üÄôKcðïÝ#é$yeƒ°¸øÿ\ù¿µ>é‚5V{·:B‹)Éq²¢¢B‡€©K¸ÇƲi!ok Þí#¼ôÍm^ » s݃­½TLDí´µj’:ÉñÜZÆôÜ'²¤MÁ";Tþ‘l³:•M"á9ÓwëIV·\΃ò*}C»Œ2ÉìúýËkåP)ÏÔ—È.([ ØEymœ·ý8U ·Jwø¼¥ŸuxÐÒÌÇE·ÓöÈâ1t³%óµÌó­iQ²waä³–ú=Lî«÷[>OÝ5òýè·­93=UÖIŸ,ìzV^C½Z%oõŠ•ìëñÇaIK}mÞ˜Bù¬Ï´®õÚñ¦(ù¬ÿÚ¶MRQs•Ïöã²³˜¦4Ü‘eË–¹ûšFÀÿçÊÿ­W€Ÿ­ç¿m¼þé¶-_¾Ü8¦//Á[òã`M¾î\Í+îøÓI|Ì®V»CÒôl¥—ï=gbüûá'3÷ÿ²ÞÚiW¬lP¤µLÊy\íB۽ϑõˆ¾÷÷iš<Ÿóf+ÊûJupbq§…|ÌjëÚ›Z»m˜}ÝWùËVI56¯ƒ÷ï¾Ëƒ<÷ÿü¿DÚÿõJ®ÔÊõO½¬©ƒôõLqùòe«X?g}²vØÖ¹¼Jñýä -:¤TúÞÑÀžiÝ’g£R3aŒ¼†/k7ûu+\øÿôp¿py[w¤5ºz·Æk³¿ª‘½6•J×ÓŠ•ÏçÎÓíÔ_®MÛ¥<ç_Ñ·g| ù/?þ¸‰Ûâw¿åóœøÿøíšá:&E»kz·Ï»®½¥ÔÎüÚKÿÞxÚø|Öîyv¯ ÝN»m„Õdåi³ÑiäîóÙ½z«§ŒÉ;×þø Îÿãž ]IІDzåÊ•¢zp¶¯~Fk>*) t;6ÖØš}Üc¸|¨"ÎOXh{ìîfîp·+©"|ãÒ¬ú¿Ž¶°ïyÕªUn‹¨wûM~%Iä¡ÊÊJµ1ê¼Ä¸÷þ_(ì§'Él3™»¯Ò–òá‡.â<Û…Æczc³²X]ïªÚý“ÏsâÿBgg§}ç:ÄUJàÝjÿº…¦Íµå^ž=O›äø<þhlykíQz&*â†M#ŸeYÏ ZÉ¢ €ÿÌ/ÿw´Ú$®'hÛ~ùh-$6ã™ œ,Aÿ/4ÿ¡ugµ˜7!¡ü©Gõâ~¨;ÎǨÿÔíIëÞ”Ç,ÿŸùû»“²êÿÒL¶së `szè7¯ ìsâÿ“ç³=ª-¥â'n Y#u÷æ}ÅR¦;ÎÇèJþý–Ïsâÿº—µiz©zõÓm²¶Nbö£Ð¾.³êi“ä³;Ú»}æ.Ki­­w Ù)åsÞ¿–´/ ð Ïç…ÿË1ÖµP=}XOi•Rk'·ÞÅvX;Òè¤@¥F¡û¹boÓ‘åÝM~Â;]ÎÆö¸M£rÑó‹ìyf^kÒøÖ]üÿî‘,ÕÛXkWWròþ»Þ¨Èj…v³Z÷ލsÒÿg’|Önx®ò™5Ye–6)ï~Lz@poô©sæóœø^2»ß³Uo=§¥ZûyΉ§M˜Ï6 µVÉÝ ØvÊaÁhhNòÙ›FÀn&>ÉL€ÿþ_Êíÿî9Èeùòåfn‡L;}豸÷i*b“;NÁ6^;öŒ?øÈý\r`_¼xñLæ©›Òö¨¡MxÖ•Ræ »Àÿgx–ׯfðÐŽpJ”ˆœCÿ/”?555–-y¦d/ÔáÌE´÷סߧ֛lÞxY9þþž÷U>ωÿë7ï9÷³6Ç^±b…å¹Nûï¶r¨iëM÷ ýòã³5ÎèÍÈòZ«t΄âŸj>O8˜Úžø?çóÂÿmzäîîn;ðºOpïÃkŸK~Âr¦Ð£_i¶ÿ{·¦Â³³ŒMjª,§H›ÃÙ»ý.z*ºŸŒß»/ª}·ÚSÝNŽjžyM¾øÿTqïé)µ?½¤åú•›ó:¸Mk}V? n‰z”)d»¾¤è)¤ÃEu3¬N튙 ؼóyNü?ï%;E﹜Wõ³KºvýQódžßOŸÏz{>ïöid¥n˜¦´TØu³‹Þ¥íîóÙž?ùmËÿü¿dý_›}ôîív^ÐGޡϺXã¿·giªœ¢øžë<*öîMíÍLìt£¨·ƒ)®ÔÚK•¼Ñú4›ÊÛÝTüzØ™Ýò6oGäU÷t{túÝ}6î½÷ÿBù#ë{ì1­›hò¸ž«5¹S¸ ÷FN&óöU¸Ik½­î·|žÿ××Ê~w*î¨UYcÚ¬©â&w«­{¶=m’ã¡Ý¡/ºý6I©WÔñ¿SÍgí¤Ú<¥ôgÃÿ¼yÛÿ§<íÞœjÝ›­¾cêã’ÿ—”§ ÷r•ú‰Îgk¤|ðAYoÓL‘f Ûÿç»§¹í3v#x{ÔnÉ­ÇíâŽÏüÿ_Øþ¯§9þhOî€TVVÊùùÇÿKßÓÔ…ªªªìr¶^ÛuÝksÜjÿŸžfIëŽ Ðöv=&¸Ó™þ€ÿãÿwÄÚEu›u°›üyþüy}‚—l6T®çâÿ¥ïÿæKÖÙC{: ׯ__±b…®§±ÿ/}OÓ¤µÉÖ×T«²16C²ÎÕCÚàÿø?þ÷þ/gëeêÝÞ.ª§ž¢÷ÿü6P·)Ò!í:eŠ5VWWËÜ5€ÿÏ Os¯[iöž;wî‘G‘CwÑ'ÿüÿ_ðþ¯Ø¤è²ñjPW®\ÑÛâ¸ýK9Ëàÿ¥ïiòuI>ÿ®zzz¤’ks2Øÿ/}O³N˜šÏ¹\NïÏ¢íÿÖh£— ÈüÿÇÿ§Á£>šw‹L»›ª{gLÀÿKÖÓì*[¥É¬·9“úìã?n&¥“š’fø‰{šf©þöÝJ«¬éïï—AÞäÿÀÿñÿ;"[«Ã~åSÈyD·\N+Ë–-“ÝTUUeséÜÎd2þ_Êž¦nïÖ^uA¾:)µƒ´{·>Ò ÿ/eOÓ¹IõÿÞ¼ySë:í;ÈeüÌü€ÿàÿxÚ±^ÓªI‚Ž Ð.@ÞíS=þ_²žf ¤]×ôPcUW·Á¿è7KüöÎr@®®®önÝ’Þw§÷–Ü€ÿàÿxàÿ÷§þ¿Àš^¿+ÁvZ˜_|úé§¶|ýúu]¨®®.MOs]H$ö(–ÿ+sÞ"Ú××§Õ[Ý*IxÙ$ª0ó¼Òܶڮwû5/ü¿”ýßôlx ý-ÌÍ(W0ºººjjjJíw}íÚµ'žxÂm˜Õ*0{fÂåË—¿üå/‹éè*oìºêܶÿËÆÈﱪªêÊ•+nû-ÀLŽóâÿ’ZÚgøÒ¥K¸"àÿóÈÿELØÔÙ{ì±r€P6ŽU«V•`ÿíÿ¿lÙ2ÝÈåË—ë{fžÿ===%’çZ—Z‰¤ú’%Któ$óÙSP”ã¼Ô+mð¯¤Æøéû¿ÛB+•wý _¼xq`xã:÷öööõõ•àOûÌ™3öÓ¶áðìA˜aþ«ü_»vͼ¨ú•}òÉ'n¯$öÌ0Ïõ*’Û%çé< øÿ|ñíªwýúuû€¥)i0¿°. W¯^Uÿ±nf%¸Ú…Õºj¸—æW6©‚ü9çIe­²²1¥ùc„y‡Û-ÏÕ"˜ðÿù5þðüÿÀÿñüÿÀÿñüÿÀÿÿüðÀÿÿÀÿñüÿÀÿñüÿÀÿñüðÀÿÿüÿÇÿðüÿÇÿðüÿÇÿðÀÿÿüfæÿÃwò~ÿ˜ÿ?;æÿ-ø?ÀüöÿÛ´ÿ‹hM|þÐ჻6®{: Å#Mø?ÀB÷ÿùÿÀÿñüÿ(1ÿÿ|ïøpÆÿîÿbü/þÿàÿø?þ³J__Ÿ. ‰ÿ———755‰ÿ'"ÁxÄß–ŠÆÂ¾t2 µ´&©xHþ<{ª£¥±VÖ¼ýÆ¡5Ï?%ë3é8þ0_8s挔ec¤Óéö½ºo÷‘Ãû÷îzåÍ×îÙùò¯Ø¿gÇ¡»w¼ü½¿yX~ñÓ·dýÖMkÛ[cáóÿÌ>ûì3]¸xñâÊ•+kjjÖ­[·iÓ†—¶o}që¦í[6~uó†¯mÛ¬Ë[6¬ýÖK/ʲijO~EÖ¬~æÉ¯)ˆâÿó…K—.y·Úÿe!‹ôö\‹}ÞÈàû¿û”u'¼ÁþöT\ʺãïËš®Lz¨ÿ¦”§²íñpÿ(}r¹œ. .Y²¤¦¦¦¶¶¶»»3ÓšêH'C¾&)¥" ž/e,äÕ?öTs}­Ô¤Ü¾eãG§:½÷ø?@é3<<<22244$Ë‹/.++ }}7½‘aodp4û?_Éõ Üìì»!Ë7®^úïÿü÷'ÿòÏ|'/~|ÿ˜/ x·úÿtwwçrý©X4 '"A·LFCçÏž 47Dƒ>Sýk÷mÛ´¾5‘õɘßóúÇü?<Þÿµ `%Ì!ƒƒƒ###åååñx|h('Â/’ßÙÞö7Kò5eZ²Rþ”õéä©lû=;7®]ÝÝÑ&ÆcAÏËÅ¢AÇÿ‡ok÷WÐ wAAASˆ‰)xÿ¯h(jéhK„Mñˆÿ£ÓY½@"Ȥ㲠+ܳyà m©¨,Çc!©Fäû^À­ àÿAAQ2þß\_{íòÅÆ“ÇÅí#Áf)CþF1©dÛ“RÆÂ¾_ýò-×øšêÚ[cÓòÿ)ÌœBþŸimù//+«ª({ø¡¥²°byµ”.­ú:±§Æ£?tº3óÎ[G^Ý¿kÂØ¿gÇáƒ{~ñÓ·ŽÞ¿o÷ׯyöTg[Kcm*ê êC¡F‘ÿEc’¯ …xï7òhüé…Žý­¼-þOAA³,ÿ_¬÷5Õ¶ÞGCûvíØ¶i}:íH'‡zëNͤã–zõÿªŠ2û¿qªþ__ûÁkŸ-©,«XT¶byu,ìk¨;&•üŸ ‚ ‚ î½ÿŸ;Ó)þ ùß|íÕkW{#ƒa³”ÙödG[B·¯©®ÐÖûÏvMÕÿµú`!5y©VàÿAAqïý¿¡î˜XzG:¹÷^ܺ©é䇧;3#¹>qx qû–ÆÚʾø©ú¿<*•ˆ¥U<²¢fqyY&—•A_þOAA÷Þÿ?>Û5Úȼ}äðºÕÏz#ƒþ¦z)ÛRQ©èÜ>‹Ê¤ PU1öÿXØ'ï4-_&ú_¦Ï{üŸ ‚ ‚ îµÿ7ž<.BžmKسsÛ¦õ¾Æ“í­#¹>õÓ]íMõ'2鸘ÿ#+jêk?hi¬ªÿ··ÆäNu¶E‚ÍâÿRºóÿAAÄœø¿Hþh/ýdìí#‡Gûÿ Dƒ>odP¼ýÄ¿»ðñiyT¼½¹áËçψêOÕÿåO)¥‘mOÊzyfWGëØóñ‚ ‚ ‚¸×þò7FC-éDôÕ}»7¬y¾+“ND‚ý¢èÎj[½Ôº³éÆ“ÇÕó'ôÿ@K½8¿ÊÐ× Ëm©h¡û„üõÝÙÔžß—ñÿX¸9jʶÇÙSAA1{þŸIÇÅÞƒ-o>¸mÓzohà“óõö\)äím ©H­¡3“:t`·ø$Ø ûÄö‡s7¥mOJeÁõ¾¦ºBï#Â/ñæëûÏéè½þYWGRü¿ñäì)‚ ‚ ‚˜=ÿKŸ?Û=|`ïW7oh¨= ´x#ƒ…¼]* ò½.ðã7oߺA^®õ‚Þë—î”<úá±wõËwÞyûu‰×í›0öïyå­#öîúA݉wÞûÚ«»åÏŸýDž¿‡ ‚ ‚ ˆÇ.'¾XÿÚ«{÷îzåÀž{wþðÛó’˜ÿ‡¼÷æk¯òö{tèÀî_þìíŸ¿óæŽ—¿·mó:©´4ÖÆÂ>ÏË5ž<. ßúÆöo|mëŸüñ}}ûæ-×L_ß¾qíê'%¾ûOßyê¯þtûÖu›7<¿aí3[6®&‚ ‚ bÆñœ_¬ß°ö¹þ‡ï¬yîéu«ŸÝ¶i}È×ôÝüûçŸþëBÞþÕ-ë7­_½î…gÖ¯yVþüæ×·µ&Â]­™t|d°÷Tg›,} R#ОBzñ‘m‡üõ­‰`8Ð ÑÑ‹†šbáæT<@AAÄŒÃçÄëE×ß÷×çÏžJFCÍõµéD4Û– û› y»ND§»ÚÅóëN•íçïy¹@K}[*ø»³éÎL*äoœ¤ÿ2æÿôÂÑ~‘ÿt2$k:3 zjAAÄìõÿ÷7ŸUúT\äÿ¹3™Ö„¯ñdG:YÈÛ3鸸½x~G[Bô>ŒH BÊÿëXË endstream endobj 140 0 obj 185942 endobj 142 0 obj << /Length 141 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 141 0 obj 706 endobj 56 0 obj [ /ICCBased 142 0 R ] endobj 144 0 obj << /Length 143 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 143 0 obj 706 endobj 64 0 obj [ /ICCBased 144 0 R ] endobj 146 0 obj << /Length 145 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 145 0 obj 706 endobj 126 0 obj [ /ICCBased 146 0 R ] endobj 148 0 obj << /Length 147 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 147 0 obj 706 endobj 133 0 obj [ /ICCBased 148 0 R ] endobj 150 0 obj << /Length 149 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 149 0 obj 706 endobj 87 0 obj [ /ICCBased 150 0 R ] endobj 152 0 obj << /Length 151 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 151 0 obj 706 endobj 71 0 obj [ /ICCBased 152 0 R ] endobj 154 0 obj << /Length 153 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 153 0 obj 706 endobj 118 0 obj [ /ICCBased 154 0 R ] endobj 156 0 obj << /Length 155 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 155 0 obj 706 endobj 79 0 obj [ /ICCBased 156 0 R ] endobj 158 0 obj << /Length 157 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 157 0 obj 706 endobj 111 0 obj [ /ICCBased 158 0 R ] endobj 160 0 obj << /Length 159 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 159 0 obj 706 endobj 95 0 obj [ /ICCBased 160 0 R ] endobj 162 0 obj << /Length 161 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xÚ}’OHQÇ¿³%B¬e&RðN¶Wí`ŒÝõoʶ¬k¦²Î¾ÙÞÌn%Bˆ.AÖ1ºXÑI:†‚b]"è(‚—í73»îˆÚƒ7ï3¿ÿ¿ß{@](mšz€yÃÉþ(»;>Áê7P‡A+­Xf$‘v™lqdí}…䜛áãõÿ] ‚U€Æ¬ÇמöxÀáû¶iO:¬äÒb“¸M¤’1âWÄg³>žöq†[ ñ2ñMÅ'"()Y'æ±ld4ƒä—‰»2–’'&ßÀSg^™öÐ}8õ¹&›°€åwÀ¥Öš,Ô \V:k²Ý¤;©iÝR;;\‘Œu?ÊåÝV þ°ÿ¼\þûº\ÞC9¾u¥(J•IÒÀëÃ]ýÜàBS˜s_ QP5ûFz¼Úë׋Gõ%«t{3qW°D÷0vz ¼ü \}\ø$€Ôu¡ºmþÀÍ+˜…–ÍÙ¬C–;XØ9:Y„^g±BÞ,Ú\°ACioci]g®©Å·¸(ñL;òz±Úï9ÚAnŒŽÐIó ¨Üê­°4“I÷ÐÝ x#Ã{zwA¼¨j}ƒÎ…Ðþ¤Š¾Q¥óš=˜ò8Ðmèñá Ã(Äo{1±cÚÑd5¾Ué­ÊgÒ·t¶üÆlaȱi"ßÐ\.5æ±”šËÅâ^Å8tph0èk€!‰~D† TÒhd¡‘”»6‚ØÂì±–:>f¤ß&Ÿm×çŠäíxÝA4Ž…¶ƒLþ&ÿ–·ä%ù­ük±¥ªiÄ”¦¬?ûCqÌÕ¸m¥&/¾By#¤Õ‘%iþ 'ËW©¯:ÕXl©Errð'ñ=_—Ü—)Œi7Ò¬›©äê,úF|ÙNšٮͯ6×rm^™Ü ®ÍšUáHWü «Ãÿ5;¿?ÿͰh endstream endobj 161 0 obj 706 endobj 103 0 obj [ /ICCBased 162 0 R ] endobj 163 0 obj << /Length 164 0 R /Length1 5760 /Filter /FlateDecode >> stream xÚÍW{xSU¶_kŸœœ4mÚ$-4 …“4MIÓ@”j‘Ó’PÂKyÚ`‘–R(”Ò˜J¹¢ ÒjaFt ŸƒÞ^$=t ƒƒ¼Š8ƒŸw¸ò uGtÆ‹O$ç®sRQïÇýãþwÏÊÞ¿½ö^{¯×>;û@l¤†–ú60Áê9MeLCÇ:ÇÓ?ûÕÓÔþ€Ï\Ö¶¼eóíÐØÉå«:—½òÍ¥>ÉsIMõK?<^y3@â»4g|u$í×=B ÌÄg7µ¬[Ÿò0´_¢j]ÕÚPiø 5%â -õëÛ ¥ìñS‰w¬®oiœµcÏ⛈wµµ®]§œƒˆˆø¼¶5m±Ïm'~ áUêCPýQ=Òƒ•ð.Ð ÷0ò  2©ˆTlܰÐj \TKl¡rogìuå=n-ä‹zJ`%<ãà-ŠÑiàá ¡ ƒÔRÑI#wÂb¬€ ÖPôìÐÿÀÛa†Ï ›¡$’öA1­— óá8a…ƒt@ôÀ!› =Ê[ÊÒ6Ž´µÂVØc¨}á<®RNU°úàÞ¢"9iš¬ó’7C¦ÁLZy!,†¥´âãð8ƒÊVåy(¾±PJv= Çȃ«XŒ\·FªˆÞ†?a2V)s•£Ê«¤'Êi­0VÄZÕì‘—~"uídÍcdÏIx˜„ p5vâ~ÅÂÜ1¥MÙOyqCiìƒçà%xÎÀ%’4b&Va žb‡¹Tn7·ŸïàŸV\ÊGdßd˜k)BÛáÉ¿ çá"|_“6´£ˆc±Kq:.$z0ŽmaO²Ãì2gà~ͽ¬KŠ]TþSù’¢’^Šq)­€ Ì ŸÕ®!ÚC±z^¤\½Jûü…èøu˜Š#IÓ(ÒãÄlÌÇj¢éäW ®ÁljÞÇKŒœbŒ p!n—t[ø¾SÉRJ”2¢'8Š|:E©&Â-Zæj)šMÐLšï‡-°âÚ(‹ð2Yðü>‡+p¾CyÈ3EÈ…y”•±8ž¨ % ‘%Óqåi>ÞN-ÄŸ7á.ü9'ú=¾„§ð¯x ?Ç«š•×Ñyu’î=ÝoçËø…ü/ù>}‚ð»kŸÄÇ2CéQö+g•ÁHoZ1Ì¢·` ùÐJ>¬£ódì&ÚCt€bù[ÚÉÇh½@9>Eô:ÑiøŠêû”½!¢¿Ó»L>~Mþ)ÆqR3j×2ZŽ·`€¼›KTƒËho´á]¸‘¨÷áŠüA¦<.Óuéöë~¯;Ã/òSù¾“߯?ÊáOógùKúlýaa‡°[¸DYY@¹)‡Ÿ>©´ÃzáYhbl€N„1t6­„#¸¾eòê.L¥\wRôüôÖ/Â{ÀÌÆ²_`åè7ütní‰_ÒYQFoìyz·B°‹Þœs0O²t*ަ“,U¹ 6åc~¿Ž’;FS±ÑÌÔásî2•cUtÒXì9åÏܲì>+忏³]YN‡8ftæ({†-}䈴T«Åœ’lJJ4&=¯ãBAÐ5¥ÎÉ©‹èr\S§úTÞUOõ?ꨋ8¨kÊOe"Ž:MÌñSI‰$—ýI).)]—D³£*|Ž Ëy#àrDqáìj?p…‘ËZ{¦ÖÞ©µMÔv:i‚#hk 8"XçF¦t4uë´Ü ú‡côP A‚DuáL®ßØd#P%‚»+Œd¸ÚçÖ/Ü6»&åt†}œÜàZWU$Å;<]ç Ñ95¤ÛW°Bµº“–º–vG%XR§¶êkk"\}8ÂêTo$݈¤oøÀöû}+øÐ#Ì=¥¾±k …¦{jœ­S¹ú‡ˆ›>×A˲-ášn ÇÐl{Ñè ª=u+‘W•«©keÅæÔÈvÉtÕ¸­FÎ24ÆW0h»çf'eÐWé«Tñf§íž8~x¼ÿí5¹“§Ï¹T5¹BdfÄÑ )q‘­Ôªqt5L 1zÂH^®ˆ$L®ë2ßD³"¼Ûìrt}”(×åO~ÚS?Ü£w›¿µ©¦óúŽ ñá¶ö_údúWOØJ)“׋´eu‚ȑ׉Çì zADÈ0$DYáQçòÛl^ï¬+3¯UÌ2Y1Ó|­&U\«P˸±Å§%—Š›¿têê|Ó·{Oqï}—C7 §r‘ßGwˆbÌN Sy»1+ÙeµZSGdسì®ôüŒÂO®¿Ü0>a‚}ŠaŠ}žaQÂBßòŒÎÂ3¶y,|dÔS†§ìǬÇR™ºœ –`4V[}¾oAÏè•™YmÍËϳgL=˜kÐk4z ÂÔ>âü…~¿`H0z 2ì£2ó’ Ñœšåæ‹ÆX\¬XïË÷p…‰’Ï?µ°º°Øhñ8ó²ó%¨ÊŸÚfÙd9ká,Õ–âìÒâÿß9i)ï˜è_dë(·¿f÷[Ë'ÚÏ[Ê­å¶GùÄóvLJ¯ ßµô kz¹À›;¼‹:Ì‚¹âûÆD¯Í\a0W˜Y…0ÑL O¡ÃöE8"G¤LO-N-ÉÉ-ÄÜRç=·`)uj=º8"T%ð#W>aoâG¢y´ß/(ŒMI»9]ñ8éöŽŒ½ä3ᛢؙœlw¤ˆKw%Lµâl¡yDf2_TĬö”\gln3Z ^»®¨HpßôÝiÖrm7‹-.5Å¯Ör¯‚,ð¨4o9¾{ËeùÆ0r¦£ŽéÕ„x¬ˆŒÍ!A ¾jAŸRm¬£E°X³¹Ò%%;Sì©B–“wê+ikYS·:gìÞWWìß°Ù‡hsͤ–Ýv¥bÈb-÷äI—;Þ±MºüqôC*åÛ ½Û6ž„x…p,*.ŽàJuŽÀñeãËŠ9ôàûüU^I2û2–ÿJ ©¤Ü;P•³àcè,ùî%>«8$Ïâ·^°þöüÐ┊/ ÿÂàÕÎëH»X{[¾—WQ1õ:±'b?¾¼>òýÃéËÁÍÓ-–{X#”Ð~«&ÅÑíIOw3=EØL” |„¯ÚÊÖáµôu˜S5kò´*ï¼-k}U­«–jwtõQÖC7Üèá¨,„E¿Û©ß)°QÖ-W‹iQÖEeÛ ¬Qö %ʶ˜£l+AJ”m!H޲LQv?AR”ÝGe› ŒQ¶‰€…{ Qve ôQv7eÿB ‹² \”u°([O€qˆ“FT‹ï‡ðÍ:<è(ÃaÜ™;*ý¬Ž¼7SmfKÈÓ¬x…-¥ú3­~K“x“5Rý<«§úˆVÇ%whu+[Fõ­Ô¾•-§UDMZdËe4H•‰¬OC;˜ð¤V÷iµ ¥µ›N·›ži7=ÙnÚÔnº¹Ý4¾ÝTiÄ3t—0a¿V7juŽ”Xf:Tfê(3¹ÊT‘éRlÂiZ©ÕéRZØ46½6›ê¦aSvØT9»èÓÁ„÷kõ}Z½A«›´zŽV{´Ú"YòLïæ™öç™Í3-É3MÈ3ÀºîšÐ(%˜.˜rLcL£LÏÐJÁd9ñ5¤Ñ1£V‹QüF®µ\‰Ãçríh‚ÏäZ7Á§rmŽX™ƒZÅ?€Z\@øWèÕ©üylf*þ›5þ=ð ›ð]Ùs‚¦Ÿ‹ÃŸãðŽìYHð–ìÉ#xCöd¼‡WdÏ‚—åƒàE9”Cð‚*$x^ù NÈ¡%Q94Dp<Geß*YömŸÅøX©ß$×fPï½rm&ÁF¹v<ÁÝrí±Ò‡wA¯fãºaÖ¿°Põ­ z´ñVèÑÆWc³Æ·ªã+±Y‹Å úUç-'ŸUl=ÓHͲ§€ ,‡ÆÔÈ¡9b¥ çCH[l„4 çBH›t›ìë#±[eßÙ?sØþ²ï ±2§ƒÕY!pkÒSe÷~’7œÿp6|ÃxÉróAÒ²’ M©›,Tå\ñÉ.n¦Mr­³Æ—)¶ù¢¸ï˜Øê+[üÔ”Åf7wL\éÞ-6¹£2·¡'ÊPJï [† Äù!•7Š‚Þ#rÌ£žSkãÛšøÖ?ØÚâ§Vkü »3~\Ý?ßDz;V‹Õ~Zî˜89”%N$M}²X¡+‹å!M}±/ªml¯´R±À—'Š!£8¿_¸]¸I(J„B!Gp £…L!Í`5˜ Ɇ$ƒÑ`0è :3€!-ª\²Õÿƒ4½Y½N­uL­Yü/ˆ¡Á´Jë{ÊV*P¹Ê&*÷P¹›Ê*ë©tPéR.Ug².v÷€9Þ¼›mîÜÀ¶·¶²õíõ¬CkE U„ýÓ ŠÊ–>lÙ1É6Éz‹¥|JàUÝpíýá±ýon$û£&ŽŽ<2}nMä_G‡#EjCžÉW¯õƒl<+ Y© ášA\ÃÆç¨ý¸&&±šô²RƒZHŒË‚^U z¹,Ml»*ÖßÓ ô÷öj"ü^èÑDzø½šH_|%) •$HLo&æÑU1Úš6ƒD‹I’&•‘‚ͪ6g¤h‹Ôô¹Ý$r«"ý^7 ô»½ÚpîÃ>§6ÜnŽëÀÆýñéÎø¸“ƽÿŸžÆªÿ댣ݶT?Ëê\ÁF*u‘îúòÜ´Äáèß~aø{-§nIC“Šõ‘ ®Æ@d»+àèï>xƒáƒêp·+ЃójúJ¹[êÖ¾æŽÎz|Æ®ŸèÚ~]׌Ço°Øãêb3T]³vÝ`x—:> endobj 166 0 obj [ 722 778 778 444 ] endobj 119 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 165 0 R /Widths 166 0 R /FirstChar 119 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 167 0 obj << /Length 168 0 R /Length1 5684 /Filter /FlateDecode >> stream xÚ­W tTEšþ«î½}»“t÷í¼ºIÒ}oçvÒm:!!!NÒM !b€B ¢‘™ð6 L”Ó3¾ÑqgÇõAäÒ²Lç Ê ;‚€ãct¯Ý‰ÎxÄÑúîo7¨{f÷윳·ºê«¿þ¿þúëÿ«ª«€@ žþî0öœÁìêÚ ½ùÞæ±þW³f`mÿ²ãbC!£¬½ióšw³ïØ`z€Íéëí^ýLJ똿Á>e}Ø`9žR`™Ž´§¯æ”[ évmÔ›Ö÷t“|Dº ic÷¦c€>‚tÒÒÍÝý½‡w>Ez7ÒyëoÝ >‡‘Vö öüîË<Òïð˱€6mFHE¼ØD ÅlÀ<²¸%ÆôC€ú.æs˜ÿ[®Æ¸R(Š=­þ“ƒò¿Häøç†§á>x 6Á6¬ßQðAÌC¯= -Ð “$ÓqŒŸÃ.”ûÐ7’pŒg ^E¹<Áƒ‰í«aûçCÊþ ¼åp-l†ƒp ÞFÝ…ÐKàW߀ð¼F~Í2j5CôÃNØ£î‡"¨FMÃp'‘É­ê¬ÀÔvýþ~§¾óâ!I·± %ãH‰‰¸H€Œ g,  =Ó¡GZŠ=#mT±W”Bê`>t Ý[ánØ‹–‡wÉJºWƒêQõ·Z,±>ZQMp5 ÂáAŒÌ|K–R‹êQW'Ô—Õ/tÏsàûTC3ê]kaêâŒßw1MÂ'$…Ì%u¤•Œ‡ÈËäMbŠ˜]L„8QýrÐ3^œMZ]sÑîëàzèÆ‘ï‚q´ñ<|MÄCJIrˆ!¯ 'i]A·ÑÝôyú:}“¾GÏÑÏè_ãdÜèãSl#»œÝÏY¸ë¹­Ü0wÀPvé«XylYlel(vVåU‹Z ©ÛÔGÕ(FõOº'`;È?Fu!,ÂÔŠ+m¬‚Xƒ;ow˸*öâ®x ç·ãôk\K¯àì^Ǩ¿ŸàÌþßÁ%ˆáÆeÑÏÓp=™8£FœQ;YB:Èud%¹ž¬!}ä²…lÅ9ŽaÚC~г|œ Éqrž|E¾Æðr4…Ú¨D 12t ¦n\ýt+ÝEFï§{écô úÏT¡‡èiôÆç4Æ$3&)Çb2‹˜næfóKæ ææ ó3Å\d.1—ØR¶‚½šÝÊÞǾľ‹éOœ+áæpK¸ÕÜÜÍÜ(w?7ÎE¸÷¹ï e…—ù6þ~7ÿ ?ÂoàaÜi?üŽBü_¿ŸÃ³ô, ÁGð)z`ƒ{gyZÙåpOŸúWúyWV3ô‰gåšÁ‰ÙÁ<ˆûÔ?`žÂ|>Vç òbGÕ·j_§¾Í c GqǧâŽ8 çXY„çÇõL)®ßÕx²à ˜9czIqQ¡¿à*Ÿ7?Ï#çº%ÑåÌÉΚæ°gf¤§¥Ú«Åœ’œd2òŽe(Â<¯KRò»6_ž?¿H£ånlèþAC—"aÓ¼Ë(R—.&ýX2€’kþ›d .¸"I© ªŠ ¥,)gƒ²%Ëw`ýž Ü))Sz½E¯³ù:aFÂíÆRÈÑ”Ò%…”yC}£¡® ꛨÿüÓ¤¢B˜°eV'kšhèÞÖç@Ð$BJ– )Óä ÎcòBÝ«•ÖÅ¡`¶ÛÝYT¨†y•r½bõ'ºëš¾A14 jém0&,<6zwT€U]þ”Õòêîë:¦»SÂæWìrP±o™t|O^®…îN0?F¦Bóæu÷ŽÎC׌͓]Õ}7RÍ×H¨“Žtv(dKš¹šéñIôÊ!­¥k¤˜äz¹ot]úûqKw¢Å'\­ªûÊ‚Aþåºâ÷+sŒO/† M«Ñf)Ùò€ )Ùè*hE?vwV– ßÝn-dcѬBB^ܧ%X•@‰¿S¡]çØeNÆ3|™s¥{—Œ«ñ~yÉPŒùW~V!3-ÔW©Ìÿ…Ý«ójûÝ ãGû׫˜X>œ!DI”Ò’ |ˆÀ4#eBÛiŠM›ÀᾪºTµË–KUP[%\B‹Óe›ÛæÅœf(‹~WÉÍùëÉ(sòâÐo^9ê9æž;%¤1ðzºÇ#xrJ…Ò.-§Ù¾Â¾%w‹ç®Ü»<ûœ{Ý{s÷zö;÷»÷çî÷qqÉ=ây5ó”ý”ã´ó´ûtîiÏ©¼· Þò\ð±ÿ[Y2É$'ÇYTä/v$°8[lX–XXb•=Žìi²ÃjíÔnË”íÆÒçãec³™X͟싊slBN‘=3¬6AhK-¬ÅÙèB1gÛÖn‡ÝPâƒ$±Ü›¬7͘nJðà;Sâ¯"¶T{ÔNÕú5¿ÔÚ컸b¿e›pb—±Ø¡WP¤¢€˜Za«¨ðk .Lù/’ LáØŠ8§v Æm'ŒØ[+ãåêŒéä¼ÒÍÂÿöÙ¥ùüìR^CfÙôÎvgX—š9kfyY¹ÝBäÜ|o1ñòL PfV{Å:§i“~÷Ÿ¿ð7’MÛcwe—;ó*1ÐSW¬°W»W\Ç5ÙL…©ÔÍ[9š•tqidÇ‘Âäæ²ÆŽß^ݘñ“›ê6ß½,»Wožzžy‹¹ Äx’óºj}޼ʊô²«ÖU?ì}Ê;á=åýÍÜß{߬x{®•­fk¼9eU³«k;“—VotíJ½7#9¹ÌTî ™ÕlÀ+ù}ÎÂdRíNM^Ÿ$'7[gÍt9Iª¡Âc«°ú^·o¯Þ5kæL1ÕåtÕÚR¯ô¤¢<ÓÊ0Bž†Âä sµs§“qz\A×*×Nëj¬wº—«>‰P?¿®dèŒç¡Šl+Á¥}Bà†N®8¹Âq%ŒS—cxâÄ. F1Ä¡’¬ê3Ž,-|ZÔõ’ BÖIá èìê,dOŸTš9× «–dÚ™²ò²Y3µ¿EÏXHF:† £eà ®Ù¥eå—{ðÞBø¼ñLÞ==Ån©+—ž3Б-máÁB©:ɸƒM²YÁgÛô¶æÜZŽÝžÄÛ̓ ¡ÙÕõtÝ"wšÓÍÐܤ$ÞËr±¶#×>ns/u”ºbn«ßduT¯ÎZ_tuÑ\[¾…|⛕ìw/Xö«ß'^E0¼ì'Ë®·V] ĨÓÇ&¾Û|Õ)õžx“Óey Óžkûel¿1Ë”ª÷üà®Â°P§˜{ ‡Å7›öÄ7žEïÏà+Áë0S|0_mçÈCH]sjbƒv_i«_ÔÐTïo¿¡¿÷Ö¢ºoº¡'ñŽSÿŒ¹zÿæM‰Á¼?O!)øøéý‘Ö 1Jï øÆ0O÷-_@ÇÇÇè¾Á}ct\¯¤ûÄ}•t\o¥û¤}­4JÃÏU–ŠQ:iÓ£t!-JïBHÒݶ(Ý… DéÖ(A°DéNs”î@H‰Ò;’£ôv„¤(F0Eé? £t;¥Û Qz¥[Ø(Ý‚ÀDéf4fžÙ J‡VDB˜ˆv7êÒi5¹ðõNÖéåµzy^¦ë¥ —ì¡óús]ù-¾ïÌäe½ìÑË´€¥ÏüEŸy²ÏürŸùßúÌ/>|Üš‰S/¹@z‹ùl‹Yi1¶˜«ZÌ3[Ì-šª/ñh&“zéÖKWÀÞdþºÉüV“ùõ&óx“¹§É\ÚdÎk2GÉ¿l#æ÷GÌO˜óGÌòˆÙ9‚­Ï²6[Átï´Í¨àµHk¡ø<9ÎR$ÿ‘ŽˆuÓÈ1¨d5ú…N€¨ãah yˆ ]ÇgÀkÔÚ»"­³Å(Yi­F¸.Òºay¤u%Bg¤u± Zõ.íiR¬³‘6t•‹C´ÀÕp!â3ˆó#âZìŒ4¬ëL¤t±y)bŽfx™d$ÔØZ0k|ó!ñ¬8U%K#âyÔ“?n²$"~èÒgÉâÞIñLë½âéÖ(Åæ—Ú±9"¾èÅ.‡ÅgÅGÅ'½z˯¼º’}q±G¤¨á¸ôý>]å}¾(Ù{Xü™÷¬¸]µoC[|gÅ›ô±ûã°Ö‡½‘»Æ7)®oÛ¼zÿ«%»°]{AåY±Ñ§ëŸ‡&ÃbH:+Öûô¢Î¨Såqµeqj–¨k›1¦7–ÄgR„S,l×m÷£™y«èEwÃZq‰hMá#d^ZÂd{ ‚?Ƈ‡ùð­|øF>¼Ž/åÃóùð>\̇sù°‹O7¦£Å˜bL2#k¤¸/Ò£êGídI7X­dõº@µ’Æ4JŒšêtŒt7æ;1ïÄ|æaÌÛ1߆y æM˜‡0ª=§õž £ô¶CB¼zÝ’hÜBïLÔµMtH¯á&~N1Ò%êˆBîQ »ñ*©=Ù ^T÷t:23‡jµ©5¶ŠyÁ¿Qt%Jÿ÷ŸãïîàÿáGš[7¿ˆËôst½H^Ô˃‡yñU^ÜÏëÍ× @XëaM ü*N8œÊÍ×t(O;;•™ZEuv6+ÅÚ›c‚ÖÒêPp‚ÖhÐÙ1ÐÚP›Ö;Ql¹.†§v-ŠA¥(FžQCcžÖÅzâb­ÑÄZ5@1º$]L¢u±IMìà`e(x°²Ra .2ÈýÈØEÆt‘±„H¶.âõ¢HƒW9˜ëEƒÞ\íùžÝgÇÙÅ:»ü{¶/ÎnŒ³‘íÿüzëÿéÐ ×ÔgBm-ÞˆªH Ÿ¢ðeÊËÿ“Ž[Vþ ÷¯”¡ endstream endobj 168 0 obj 4048 endobj 169 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -12 768 682 ] /FontName /RBNCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 167 0 R >> endobj 170 0 obj [ 444 611 611 500 ] endobj 106 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Italic /FontDescriptor 169 0 R /Widths 170 0 R /FirstChar 107 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 171 0 obj << /Length 172 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 172 0 obj 1919 endobj 173 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 171 0 R >> endobj 174 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 75 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 173 0 R /Widths 174 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 175 0 obj << /Length 176 0 R /Length1 5096 /Filter /FlateDecode >> stream xÚÝ7kte–÷~UÕUyTÒ ytbBu§I“GwhˆÄ¤’tGHx„ ‘Ò €†Á,(ï0TtgÔqÁ*Màt…QœÏpÆÃè2ŠÌòУ“³3#à"¤koU"ÊÎÙý±¿ö»§¾ûüî½ßý¾ª¾ Ѱ8P[Ú(ÙHrã[ºVØ_(+‹%úŸº°sQû†¯Ÿïn°“‹^µpÚÌ Né×ÙÖXpå–ê&‡òQÔF‚è6¾ø6âGµµ¯X™´Œ¿ø´‡;Zl÷Sâ_'ÞÚXÙ)ÝË~I|ˆxûÒ@{댛Ïÿ±±¾³cù }Î'žâƒ§ó‘Öε¿wms,GI†`ìÇØ þÇ? •€àÿÁøáÆ…À„H§ÇÆ= #ô‹ô Ðóe¸‚ô¤ ¿©ÿ™IÆ}ÆÃÂe%à‚4XÏQIÖÀy(„dÈ‚‹XJ|œÏ` <'¡öãýÐÓ Úñ>…‚"ðÃKð­Xd[?­:¢¿M²"Ø!¸÷AyÙ?×OÂ^ø®é/ë_‚6‘ÅYýßÁM·rK*d’Ï%Љyl…þ”R¼çàœÇ$½a”€A´ÃRø éÞ„³ð¦ÑnòÀCqª`l…§àYÐàw¨àãø"¡·éK`6e°„Öí¤ÝœÏá‡Çñ”ž¦÷é:Åv¨0õ»áEx~aìN\‚œ‰s8'7N—õ±úM²¥ª©P?¢í°švò¼ ï|FQ³°ga'®Ç<Å*¸¼(LÓ7R–Õû>‚é”ÿrÊtâ>ãnð©ü þqþ·üiþ‰ÿ']° a–0Ûb³[º,¯XЉ¿ÏAjü8zǫޫØ.ö-¬e÷Ó{ö}ÅþÀ&ÑI¬Áƒø UêUº·ã>!P " 6R AíÊåÌpØ•‘éi÷¤¦Ø’“FÄÇYccäè¨ÈI´<ÇrýΪ&»æjÒx—sÒ¤<ƒwHø I³“¨êNÍÞdšÙï´TÉrá³T‡,ÕÛ–hµ—@I^®Ýï´køœö>0£èí>g£]0é©&½Ã¤e¢Z`÷ÛÚ|v ›ì~­ª«­Çßä#wý*,2/—.U"Êp¬Ae`M›aá×R>¿–âô™:.ÓX ÕÎhðûîq8ór5¬lq6kà¬Ðbs†—ëìdZ×@±órùÃÖèÎ[C*47TàG hÔX“#.GKvú´äÇ.Û¾g¿£üÛ~ ÔXfU µ§ŠJ³uÒÛdpmÄÕÌ´“[¶©±AÃMCI˜¹í¢Õé7$MKìZ„³ÂÙÖ³¤‰ju ÁT5Õï ø5¨m¦¨)&“—Ûo[;ÑAEéÏ+Ï+7ðD‡míþüÇCò?ˆ2íN^ \Sw».hDrN¦45{‹ÄI¹N0¦Ö ÐÓ2Ìh4"ír±QÙÔc½—ViB¦Õiï¹tPοÝ) K,™Ök`ÆqÞ¾¤¦éå _±géwŒ£ïCeÃÉ‚%„³Õ4àÅÉD üdŽc©q2BŠñ•£ªÎ–“3íjÉÔÁ’iÖë%S­ƒ%PV2Xb½JSÇçˆMCè ÝüV¨ùöPˆûË­L³]ø(ü ^§/ʨV]ïñÈ1‰cœEfœdÝ%F%&'§î± %gÄI9%!ñ¤cål3ÔÔÁÕئù[}W lê@±×‹qñÉÅ`ý}ä-âèR,çrŠ®ÂqEÞ±I‰x}gýˆ¦Éñ‘•cªî­([PûWVÑÚ11’8~\Ö”–Êåý }uÀz}ÊÊ(^å*u¤G»l™ .)3ÍeÍä]rrd!@"+D1(!–¨¨”˜BÀ4EÜc)D.ަæ4<6à²áÁQñqãF3ggILHNòÆ,‘92F»â¬ã‹¼lÍRGé¾}eŽ U»¸®µôÑð…w×uÏ}\ϤÏ|Á×?Øð—OÿóbwX˜øwOiáCã$dG³¥¾ˆËæAt¨)] ›˜+¡(E6K2¸ÍâgÂ9„Kƒ#šB¸V“£9ÆK‰‚$FÛ¨öŒ ¡çPt´œ’l;†+Á¯âƒ0|×è’ EIýÔk·ðZNNhcI‰q IɉŽBºqt2,ba¦—5c]çàéUÕ¶¬Ô™£°#Zh"nN™:†Oi)z€{É36ÝšF?L?Ïícó„jýD(WmôÝf(Pk€§xŽd¢Aù‰”Ÿ|ˆÞª9¶œiVºÅfJnºçKJJŠÍ[YàáЋÎÑbrÂz„ûoܸÁÇà¬ðþ?\ð]Ë,º\0?¶ä¢dò'úo®úëçßÐÙBlÄí¾4l6;á}á7Ä£w4߯…Sà`æ5„ô<ÁÄÓs‘í£Î‘þO¬†×pnĹZ„ùät%aV‚Ñ$úûI†fÄøá¢À7gFeuENýâöÖåyuí¥F cè­Ðz×FZ¤‡£®.ŽÞ÷øXøc=ÆÖcÙ™lÜSj¹Œ7)„Çœíæl5gÀ›j”!Ú!â þ½|:ãIüŒ£ù3þ¥h¨ƒFÔq&QŒD ŠÁf<µŽÒ[Ç ,Á“D?Iôz&–(³’t¤ƒ$$áa>qµa¾éq:qFÔé&ç!®Œ8ɹ)š›8·É)L ¢¤ÁË8ëÅ*o/‹QŽQC4šAÁ‚àæéÊ[øØAÆ'Íy£c—ÏÛåsvùI»¼Î.¿…[¡–›3ª1µòǵre­\V+ß[+ʼnԷÉÈ© Yò›Yr(KþU–¼:KîÊ’ó²hu/ý•ñWæü´j¯–¿©–ß«–Ÿ«–7UËUË «eGµÜœ&J“ïI£wpíáØ±;b!‚ȾòÎ$»v°À­”‡ðëC^%'·H á–`}.¡ë÷+剸²y¤­‡lfàÕà3ñ*ô˜x%zLý¿ÝÙ´ly°ô%BË‚¥—¨A¾©\ô^"é„`ý<¥<½Ã>Ç‚O2p^°ô)R æ~ ”ÇáhÈÇL¯©v‚×4ÏÆ–`½‹Ì…>JTÏ!•pwˆáa妻N¹žâIr-?$úkvˆí*Ÿº ©ÉÊ_Üó”+­VN’‡wê/)ÇÝ+GrÍÿê;fx‡×©Ë}^R^u?¥¼âÞ¢ü¢ÔTïõšþvÕ›è™lV¶›åùôÃTñ¢”‡Èã’Ü¥…ÄÏ«±J~îxe¦û¨2Ãýˆ2}(ÒdŸ‰&¹˜ÛùZ•ËÓ•rwºr_éÊDí$¨˃ʸ¡àcóÍí”NQrh{üaeL}’A!QÍSf-狳Äñb¡è]b¦8RL¤xÉ*ÅHÑR¤$I‰—èÞJ !ý‚šc¼æ «,¼1ó&meÆÌ†¾; %FW+„ú& ·'u•ÙÊâK㊫|w™š†çœ»tmWÍÌm_z£6Ö ôôÆ­ÐhÄúñs¼ì÷õã5ïÀÏýu¦Üákl´ÕhSjBxÅ¿8DŠÅÔçÊ+$ ~Ž j´Ù¦È&‘¯ê D~Xd~èÊ™f[†ÌÜä…Ì|2Ì.Û4s³K¦Ù†Yow¶ß×›mšùÐmšt ù† |(s-õõºÝ¦U¤†3oO¤f:J7y½dRê5LzÇzÉ ×;ÖT»¿Wç©ë†Ôu¦zî÷êü!õÞ!õ^RçüÖŠÿÝÁ¹/lØmtÆMN+=MÚÖ.jþ×7Ûí½^n™]MÍ-m´j/8[}Ú§ÏÞ;w÷]Ô» õ\§¯vûëzw«­¾à\u®ÙPܼ}™ÿŽX[nÇZ¶ý.ζΖ±6ûï¢öêÍF,¿ËoÄÚ¬n6c{ó/žY±ü.cÅ£Î[¾|üu×' endstream endobj 176 0 obj 3501 endobj 177 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -17 -143 699 674 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 175 0 R >> endobj 178 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 250 722 250 722 500 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 333 ] endobj 113 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 177 0 R /Widths 178 0 R /FirstChar 32 /LastChar 246 /Encoding /MacRomanEncoding >> endobj 179 0 obj << /Length 180 0 R /Length1 26916 /Filter /FlateDecode >> stream xÚŒ¼ |TÕÙ|ιsïìsïìûÜ™¹³d2™Ì$™ì!¹!$„%HE•ª ¢(j¡VqA_©u×–˜ ¬%îÚÚ’j[©öÚæµÖ¥-ÚE2ó=ç΀Ðö÷~_&g½çž{îy–óžsfFÐVÄ yé•KúÈJò:Ô¼CÃÒõ×—˜>C߇F³¢ïò+ÍK؇ÒîCˆ}ùW´}VÕŠé$B3W._²ì‹Ì\‹ÐEMpÍJ¨°N3@]åÈÊ+¯¹îÐÛú(”¡?tàŠµK—LÞ5wBófByÑ•K®ëÓ\jm†ò“P^µäÊåm׌½å· œî[{õ5ª ; å@ù[}ë–÷­Ù=ç(BCÿæ¨Ãˆ¾}#Ð>Ð%Åšoþ¼káO…X%åiÎk£=¯¤ƒ ‡>2"ļR+ 3²@jUJ6ôßÿìȉ\È<È‹|ÈP'ÂØB(Œ$AQCqT‚¨T¹'‰ÊØo#‘©s7܇ò¿ƒ´È’›ž?Í®ARnuþOÇ‘B(þEÑvèó´A=è§„Aí¸ÍG*LÇ@p=š‹uðL Í@Ý0Êéè±íGèSÜnÄQ4=㛣oEßAûðÔüŸÐè=¼ =w?‰eóLÜ™?Žæ îü ð „ѽèl‚·›‰uXÊ=\v Ãè×(¢ûØ}ÐK7º]•-B¿À ñ%yš†®B7 ûÐ÷ÐKh ߊGTl¾U£ËÐ:¬ÆV\ÂlË?‰êØcÚçó¯åGa¶‡Ñg$©êÈŽdô‰ çWe­¨ >W¡GÐAô[ìÂÕLÐ, ÏêAßBû™c'º Þí0ÞŒ÷3¦ü£ð6µh)Ú‚Nàëð ±ÇØ“ùM@Û8ÜwÚ‰E/£WÑŸ¡·<—¹2×’Ÿ\¥:µÃ“¶£[Ðaæ^Ïk˜Ç!< z~„Ç\Å| =?ÆÑW踯Â7²­œ¸1ÿÀ öâô4 O‡žãø[x7¾?Žâ7ñ(þþÿ“¸Èänò"y%£ŒŸ)e¦03ï¨BªT_«—LøsGr_äõùd¾*¿;ÿ`þÃü¸Bp| jîZzl;ÚîAÁœ@?C¿¾;®|ÆÐI ÁטnrÈÂXÂq\ow1ž7àø»øQüþç "†O)©!ÓÉ"²|FN3:FbZ™ë˜{™w™©6²•ðy†}ž=É©£šwNïø(‡r«r{r{óÕÀ‹pžd.‹&ÏM*/CýðY‡Ö£ 0G›`ÆÎÙÑ‹è-кGáó!ú­2^úùPâš@9L€ž,ÖÀ§0ö P¦ ¸¥/Ú>›ñ6|¾>{ñÿàïÁüþ¿‹ßÃÇñð—ðNˆ¤H+™ oÔM.!=ðYL–’Éíä|~N~M>$¿'ÿbÆÌˆLœig.gnev2Ìæ—̯T1U«ªSµFõ¦êðæì4v1»”½ýû}öö'ì›ç¾Ë= sŸ¨uêu·z®ú6õSêÕ¿Uç5qà§.}âíø]|‰*Mvã<†÷þ1¹†ù)¹?s®ew–¡Åd˜y‰<ô­ÝÌï™gÉ6PÞS”Ë“@‹½ƒ~„ÞaßSÙÙOЛă>}x7³„ü˜ÜO\¸†iTݬz´ÎFç÷Éq¢&û¡ÅŸ‹ÑEØþªš‡¾€ù?Êî„9í ágÈd:pò1ô(yÝö¡å¸F· =þ…¾ƒ1A|øn EŸ¡ߌV•ž˜LZ8YÏ5…á9ù7I"ÿgúßá›Ñ‡Ì¿€÷çáY8Gªÿ g±¨Ê©¼è ùh/píÑÈàOT /Ñ!&‹ªNÍÓo禰×07á¯H+Ó©hîÙTƒ¾tÕ£&´8´ˆ"ÑF?Ãa˜Å÷¸Ðh:ÌØQ”yŒl%yæ-UÝ…N03á©×ƒ~òá,ôt%ZïÌœ{zXêP¾ /DSàJ' 䯄‘?ºHÎ/ÊßÏ.`“èçx&¶£# ½\0‹{XmnZ9üuâÛÑPn¬ÆŸ‚þŒâJà¦qv=»›}š=Àþ˜ýW®©Ý Tü=:«F/…¹øýx}2HOÈO+Œ¢Ö°+Èæ%Ô†=¨t` èíÉ0 ’WC/ÛÐ OÁòst xú1:’ã9_ Ï×@?3ÐE@õ«Ñã oÂCP³ ÖãR˜§a®#×Àó¨žÝzvÆô[ô1h޼2®2܈§õ–¢¿SY†'Ô nüêÈN˜…¦0ï ÿEX]'ƒŒ> ÷õo˜`ůgÿ€ *ËÍÊבUÌKØ«¡ ¸j.¬ì“p?Œ‚‡÷˜@v<U禢zXc·¢nö1¹u®ÜÒ<©©±¡¾®¶:[UY‘I—§Ê’¥‰’x,‘¡ ðû¼·Ëé°Û¬³À›Œ½N«Qs¬Š!•µK½ÁXï€*&uv¦hYZKΩèBUÇùm‚½J³àù-eh¹âßZÊ…–òÙ–X6¡¦TY°] ülŠÆ ç̇üS¤Áq%ߥäw+y#äC!¸!ØîZ9%8€{ƒíëWîlïÝ=§×µImËu©2ôœNY=äœRßsØÙŒ• q¶7¸g¼ž.ÀµŒ·ŒWdPîÁvN ³`q:œö2 ˆÜµ²bJ,sñŒlÏ_rÏáYìšò)­ ïÜŸ{#w,7¼¼£ºrþ¬`2¦ÈÙ c[ Œí9\£ÚÁÞÊóª=ä~íãä)­ Fg…ÑÁ, ê`qTæÙtT6„±Á`ÌX/¸ FwJ˜2ÈsFg­®©…Y ñX¼ÚAGç^YÑ/ ÏÎ=—[QÞÞºðŽÜvÑTep9cîG¹—sŠAQ%^K6’f “G6ò°Ø­úÁ®ä,aLø¥»àY8T"'‘©xíÑÂ} óÄO’Ñ£ð4Ó3ÃØ*ëƒÚŒ–h݆µ·ÑûO÷t#:V\ «&'…cÕÙŒ:–\ÖÞ¾d Î*I{ûe´¿À*KÙ•€²nú2áàj¤Á /V¯UÜjTjÔøŸ`J;ðcˆÇ‡e¼9‘M¼±µ*EÀ!à Õdêæ×òûyFà1ïv™~LÒ7‹8ñq…ÏÆ€Ëzzšº„‰Êi-–ú/ÇOã/“¸' 6ÛŽª*{¨ºª²¦¦ÚœÅ¤°:%{]âDMäâéKE°jšÿ]ùõ3×·—E£%[É‘KÓ¡`d¬8·ðNÂ;ùÐ'räVòCò,ÃÄ ÷0D§×é1b½–}Žâð•N¯ñ ãÞƒ–´sÀIœÃ8<ˆ-šáüÈÞ˜Õ 3‘&`šOÉ^Ä ,aky÷á#>ìóxŒ`ŒÝþÃ`gíF õzú_ú»NMôŒ¡––ñ$(Ùª‘Æì4Aäæ!2Ö'áoL\?„œð@hᤆFJê”tÐgnQÚŽ™ëëÍ–z ¡Ç\o©‡¢ð6LZê …ª‘¥:«ÌVMMU¥¯æpf±¶Šé>ý{¼ö¡m—>pQ´æ·»/ºwúòܳ8zEki8âÀÏãòÝ«nÀ82ÜûÄ´›o;”{Þ’l§óÊÿÙ ó˜DGeQÍ;ù•ÉÉ›í7;öZïq{õŒÛ«ëŸ¸á—¹÷ëKZÊ[Mš‡¯]xÛaböƒìžf^Ùu¢ÊCÈ‘Ýk–›†Ô†i=ÏLÓ–±c»Ûuì(}«S=ÀDg´"Nž+ÍÖs%{ž"ÎK–L)J8óÊ’‚„/™X÷¬ b€ž!@ñù»aAoiY!¬6H;„[¤§/ê=Æ!#Á‰ °$…t&½_ç ¹üN½k‰Æ¯u˜í~ŽèPØqµÄ A …„ I$”2 6³Yˆ"%&Þf2ñd½ ›t›Ì8¸]åBfQa§Ä‡#%À_ ²À30Õ:@ô¼;ãmHÂå²Ô¹3±¾ØÖؾØhìD Q,“cÝP³;6Sïº&¨_è9åötM€nvµ(Šº¥ÉCõÊD“ÅI%ÅYßÒR¿ÃTžÔ\/¼©‹fz^KRaª¯w!a #…¸çÜ‚ZhjR75×£$©9»®F¡j*\……BUe-ð ,q†aææBõ¾rïêܤi—¶ãÿµâ?u¤ÂÍ}ÞÙAG|«2Š·mŸœ¬÷ šhT¿t¯ªáë'ÿ'!²Ñ¨CX¬ÚÉÃïåR {sò¿c/†õ+‚ý‡#¿uH«Ëú† )WLÊ cðh½5Ö.Ï-ŽÛ=»¼·ù4kÌk,Í-·™Ÿàž4>æ|ÓùS¯Žs X›£Õ·Õq³óïvß ªºtl¥¸[o\ï½Åz˜Wך̖ˆ-$~ "m“!zÊl1±«ýŒiµ]‹§ÍØìé‹á˜%zÕ!\©ˆ_Û|YËëDÑu¹Ý§ºþÔã*äÆÌz¾êéS˜¦û³S0µã§ÆU\3.Üø\¥¦m£qø8£!æŒj´j-á¼1£CEœ"½ËEZÅÉ$ü'K“ÉoÄ=ý¨§Ÿ“Ø,Ñ5‚£Ä±P‘­µs oK„Š1­b/Ž—¼oË/+Z½öàÖ_­_÷÷Ç~“ÛÿÂOñ‚Wv=¼ÈL«Ù5¹Òá×îZ¹_ÝßwÛµÖüw ¿‚4GÒUϺä§Ÿ iëåEž­0õ%it¹u¥ëòè‰áöró*(Ük¾Ïñ¨•[jRý(Öý¦°ä+çM$\íõ"%åãý¢Ÿø›55îVcõõe“ž/H? 1ºRÂô (&ÄH¬ Ù[ÆÆØj`Rašƺ26¬”ÆÀj*Œ·4Â+Lí¥tj§KIÁc±š­„+‰'â¥q†û¦D8‡ÝiwÙÝv‰&…X—ÒHò@·úh”„ºdÔŽ¢¤ÐT A²”þÝx# Z¬¢«umq¹–ªC0ë»ÍDÔœÄÀ‚Ni@ÁˆHÌ›jlᵎ¶úYü·»ŸqÑ]GvNºi¡`õV=1ÿº ZWtF£Aû*æ[+³ñèä9¹á£»þòÐbA•ÿú£¹1¿î@x샛ÊD‘r„T=ÊpHîR«´º2&¬Ÿ®g9–ÓÁd11ULÓÇ ³™Ýlý ÝzÝ-:Ó¦ÄîòçUÏëÞP½¡ûXõ±î+ö+ÎôÛÂ’?跇ñ9eeäD^÷Çx ÖÌ1~ªõk©çòSίý‘°¤Q«cÄ0ÛHfãØ‘(ŽzÊq9ÂFÞ$šˆ©ÙÏ#x¦9ð»S6{YI„”àƒÑ±™üõ´"ŠJ¢bפÊ„ (åIX Ò”ÌÐ4.Œ M§š`¡O7+¬€s–7`‰¦&E¬ ü±ð±Ò( Rõ¾ìù·”ò•–~l®R°€".Ò90«ö\ÊÑ«ñ˜Dªâ ×Í6H’õ©5q'k¢1Õñ˜ô”pªë¦«¯lzD•›x¯fë•¿¼9·„’+j7…]+ ¤Ëm¾m»—]˜?ÁEØ+P¾Bvè6ÂDM‰ëÄ[Åí‘íÑ;·–ꤢ63ü›v+¥Ú­ 2+Õ+õô"‡˜«†¹"/Ä^(ÕM‘:réŽÄ-¥ìý±{KŸà¾¯~Rÿzô§ õt“KäÔç·ü®Ea ¡dÔlqbó[~gXª:GÁ…ÑÂÌSÉ€ˆÑèt¹Âlu’1V‡µ€éÍÄÜŒžjz¿Ö d«-%îlõð…@««ð J«Y§ºÚæäµ" o*Ïi•—üª©«h0PâXêë1$œÑ~ì/¢‚ÚNµ2XÊñz˜þh<BªŽ$m™BÂdy+…’.nŒ">hœŒ4 E#‚8ÒeOÑ‹Š<ö+IÉ-Å" É­x†Â AUš9` uµ€BE¬SËÞmËzø¾ŸÌ]ô³;+.¯q´WHä»3í¶Üï}9ÿjm¥¸|NÙë_Æ*3üÚ;Ïä~þ½Wsì´Û°§;‹FY1bžû¸¡qÕ3kv>ƒ+ñã‚fF¢žâÉ(ÑÏé¾Ú)§Br­¯Eô“pØô[ÂaoÐÃ’>è7‡%‹™¬ñð^ÑK¼Íz%«Cj9¡Ã¬ëÓèT‹!":w0D/z½þì‰î „H&$‡‡¶† ÀMZº´§]’êÓuIE£R³ƒÎ• Pmÿ!vÀ…Ê,Q)!ŸŸËüäušçõ Ñó¾?½òŠ ƒµÂïE»äšËð¼Yê‹«vK»#G˜o^{f¸ðÂ@+Æ+EŠ Ñ¾èÖè¾(Ƈd!*!0XC4ÑwÑCx˜ì—ßLŒ;–‰Ëñ}qfÒ|úžŠßÓtêÔhX&šNõ4÷™õÊë*P†ù¿^”µ¢(XcÕ×3Ïyï÷•÷vIîÞþ+v¯Jãßæ"ÿåý÷­¬7ig>ºé­^ sPƒgËëmêXØ ™ºöšîº'Ð[ˆújð´Á·Á ÚáÛá¿ßÿ¤ÿSÿ¿ü†¾ºuD´ˆVÑ&D„(Ë[x+o£ÊÚî\Æ)oðÇÂÅyüѰ”ú«Ã Wn•ÛßÄ•ø¼6ŸÏ‹jjJù6¿?€pßLj؃jª &±¨ßg1kª­ó ìiÖÕ×½§N‘_ « ¨Žj%­Ý‘­ ˆ%érzÍL¯•Ÿ('#å£å¤Ü][7Œç…€ó†qÙÍTIô(ŒJ;¹.IÕ6ÈMÕ¶ 8‘þјZu€V5;Ê“,UH]J&éJ&‹¼ÚÓ³ŽÔŸÄø|&=W•c ¬h*Ò´ÎQs.™QÜGJÊš"n^ï˜R_6ÑTÈOüÃ5q’5^ܓ˘R³Jô.&I)þ9sÐ5äZ~zÛ9 ~üë¤êÓíËœ•-Ñ(³iý%ÌÂË«âQJs?àÖ{æ!Ü?h±€lþcÐXOyƒ¡^ðùxÁç÷óÆ¿F‘xg8Lüê°dú3‹Ö¬Ã!Áçļßߌ° ºõ{ÃÈÌ›0ö;CXxq:4¼SKȱñún K‚¹Ä‡¼¸Û‹‘w-ÈõaEü…Sý=ë(ºèª¹®àã¢:€êNªœéÔSËšZ ;T׿† ÒU°èÔïš®m‡ð¦Thcå䤵ñ_‹ÖûB[ƒ[CßA»ùÝÁÝ¡è@Ȩ ªB¥ª¸>l-õpÂpþ’Ak5$ËVKµ #Á†a7Þç|DWÐÜ ÚÍ^ÐØ¼-Ðô„¬µ¸ZÆdmAÃù“Åoká‡ó‚6~0hr¶(ˆ,‰’É›ÁQƒ<›ˆÝLÙ ÀÔ“m_sä!)ÓGæ5†Â§×¬iæÄ¾ùþääfvæéÈÔMÉf‰4»÷ë{U«N?rí@à…W0/EjÂ$ª`à,`®Ç€¾Ä£‡Pèk¨Rú.Ò×ÏŽá{]_9¿ þ3¬*Õø6¶aôsaÉH…Uò–[P¹ÏÇY-5B‡>êulu<ì`;Ó`Ux Τ”é6ôˆáúhì<„Dª©qAWZ &È %˜ F`©Ùkj@”l—Óí$œd ¥±è(l¤qÐH#¤ÀÙ"¥E–`ÂÎúžªCAÅ7À1æ¢;@" oû¢‰Ù—¶y½SzûErî^òÇyÓöí7‘¹[¯ªG£RÝULÍ>¸ýGa¹oâ ùÎ}÷ÞQðO­ÎŸP…À¶«Ç)¹Þ•¹8±!Äp&¬åÕI.ãâÉŸæt8˜Œ”Õ”Ö$/OÜ–¸­ô©ìpéᬵþ,z™&ÛÑB¾F¬!5OU€F[ô‹A‹Ãø:¹#°yñå5gý¸²J£Õ¨“e%ɲh²,ÑTõLÕ‹UŒªjRUWÕõUwV=\õƒª—ª~^õÿTWéûªpU£MÒ,×\«QM£f¦f“æ6ÍÚÇ5oi~£Ñê5^MŸ†±Y4ŒË“ÐcbEº±“TÞ‹zÒiâ’É,ï]‹]k]»ö»Ž¸ÔÇ]Ÿ¹N»—K6 YÕDÏ—‰eé²–2UÙ”D£$ú)Bim‹v‹öˆV„„ ­@|¿( róÖf"7÷6“æ'íØî¥oWÒ]Ò’÷boÕ µ¤¶’•¥hv-{’%Vf»Ù^Vź'Õ]ëvÅÍ <Ù5Þª?ùrÐÓ Ö_€T=_Qo±Ô'Óp–SÔ@›85&¸~…FæÂ²R/¼­šLMM ãñºÏ0¸ü.‚z(:ª²®Á'éFÅGý±PT«™æ2µÀà Lm >cëÂÕ©To)À¿ øßx#^×߃ à~ÿP-ú£Õº"3g=†Ôå EEÝUÖ:©Ã$7s…VU•dÚ3·v¯ÆÕN¹¤µÔã‹Mkl¹hÝ;Wݼ×iÒÙŒo r͔ñ;U¹óÞU³×<óíKW×&ü—]L–T´Ï¬ê¼©£ré½¹{äuMo›q®Ÿ:§¦¶\òÒu$™Syaq¢8ž#ó– r N‚]nsDtãÏe¯ÛΨ1½Þ´Žç½!!ŒÃ²ÚcIP¯øŒjšÈu“²Ý‰ÑÉ$äDw¢/±/1I¨&âÝ¢›¸KÍYÀAº…aT`wɬ~eë©_ñ½ ù‘!wˆ.º#C® ’:Eês_ЫL}Z—Tš& MŦ‰sš~U\‡„1ª“ŒIP×S ±'ª2²ÑHÌëñy§£QU8ŽýwM¢ò‹c1@!M ~ŸWÛ|YºžíÓö·Döhž`×¼ ÒlÓܬ%[T[t[Ä-Ñ=ì½²þžØ\Ü(tc¶ È®oYª5ñþõwô>Ý»é›f®¯ßVë’Ux;§›ÙX5­¢&>y;sbbSÿè­÷ÿë¦LÍrÕcs¬>/‰N<šëÝ"5NkxöÄûÝ …5mV~ŒY zLB‘¯ü’Ã-^ }<ð:y]:†?Å¿'j—‘RÛÅâ íåâzízݺÀ½Ög­ÏÚ†ÉaÛÁÀaéõÀѨa»1&ß(:\2ŠO`¢Â6@!«Ýåv4cóŸ]1½:Ô©Ò 4%1%E¥»+f Öœå1Þ‡àÏþè %xŸè#¾Ju±M–$³£j¬.Xö¦¬Ú©û¶²’%ŠuÑÅ €ÈQר:e9ïšqO}¿âU.n¼€Ä­ë*+Nmq/AY“âE¹Sü_5Œ,N~}í‹'Vl>ögÚë»´œÓ)fÂÙ¹ÓjgTÌÿ‹ë[±ç#ßÙ×Âú)³–µ¸ÝU]oÿKc²¼à{œ òÒò@)¼I–î3>i¿²me£Ö™¼cúš¨+šÎ¦œ%óg±3¿~çJ[ †®»ç5ïÛöÒ½_lʶbχßW:qË·mâƒß{îé˜uç>`z@Îì(ˆ«åùœe†­Ç¶Ö¶Ò¾ÜµÑ¦Žêž o·Í¿ ¿`ŽÙÿÆüèÛb­iµgç1+˜µá Ì–ðMÌ-¦OŸØµ¥š¼k´Ú$e„ †Ñô°AÂŽa\rÀ³ªÙa2èµJ_=Ð×!»ÃYÇ*D¥ˆ’D_Ù+5e‘â¤1W#O:Ü^þ"¬ 8_)¥OI–BËd¾1C Xp‡ŠR¨X]ðǨ&“”]’ÉÂFØ© jµêÃÂÛýoø£ﳈä±98`ö°ÓQä'oÄ=IJæ~*HdaÝ£$´ÕÙ3kgz&òÚ…íKš.« ÏÞ8ºfÞÄÓßþÅçRÔ.eCøËÃW\Øv±cïûn<ò)¶ÿé‘ï]'Zªì•=8!f2`ûNÊ‹ä4æ¬b„ðR‹œ V•&Æ ³`4, ø“oˆˆê×Ã8"r ·^ÑÛâeöD©Œm³ã”é¦2hë².MwŽù´˜>žfÒN§»èÄeÜÞ¬+ˆw'ÒOáÔ¯J§½Ô0Êcþ×£ 'm4Z†âî2Måt¢24Œ@ Cưհ۰ÏÀQ³«WÉŽNÔw0I“òôOB‡ñ2ÌQó«–âJåk]ÿX?@"%÷±ðUòÔË@¿öåS>†ÉnQü`lƒþ¤ÊTD÷ÔhZŒ©˜+>)*Vµ`y5“j³T]UÏ~£J©^-,WœÝi¯²ãã¶à¼‰ß´TÛn½¿w`ó†é“²“8•Apúãd'Ó>±áRW”‰D°73“ÜvY{z÷È¢ºÔäšÖgæí:>S½Ãeô„LW®ƒùd)ƒ&¡™øyNTÐó-eÑÚ[SßM<¯:¤L,?ùrŠNW¥­æê¹Æà,V¢›Ð&Ä:±S¼Cssé^í©'ÚôrgdrȘp ˆiPGlÍ cÚ  w°{³l©o–cñl3ؤÙ]ÙL3nVvÃ]ÙæaF%Ûm6*¤6í½ƒ?M9]‘e†Ÿl®¸7­nùùNEØ,-4•u0Ú`'îìt5 çGõklÀ •®uj‚׉jœ¦kÃɉ²É2Üß’žŒùÉâd2¹3$ÐJA©0/ˆ†V¶Å²èŠd1Ÿ³$+‡bÉ2ú<jËä’D¶Œg¾lmÙ®2¦»l´Œ”mèج *ܱ&Joa¼ä¸OôôŸWªé妉¤²Å1N±tÛd1”M.O*: Y¨=„šáµ£0}TûÅ,èb ®‹‡!ê‹Á\¯p á$õ)ö¡"ãÔdtTÕV: Ƨ€|ÞòYŽ?“ÛHÐ^ˆ¼d:FþDþedýZ>æ ‡ÃR­ï"ã2ãÕÆ æ­Æ;½ß1îá÷OyøcÂ'‚ðŒ õx,%¶è á@i–ȤqÀÏ«¢š”XŽô œÍŽŠGDGsâõ×_o™x½e¼xØ¥¾>=Ñ䕯FT.D„òŒÄ‚åì÷ûÆbQgÒ‹:‡Ï):1º€@¯vÁ&Úň(IRiD,—$†}™~»:&Ü(ðü¥~Ÿ úâ¿OàMk2"*G:-:àÄAÿ%À²+‘vÝñ̲%ƒ3WìStøí0îJè°nï4­c°Ðq@vøº G 6ba×¼´´T1îÛ4Xó£‰ UÂÎü3(„fá±¢8Y8HHOhŽMŒ:Õ3ñ±pj ý=ÊæŠ»K8uÊ51FA1Üè‹ézá5Ý`项d®wÑ•êìÑŸsó‚¦IÓ´C‰1uÙÐ奄µ–ÚÐÀ3ÊŽªÚZ< ¤¬ŒÚþïŒõòoÚBe2þ~Ó›Vüöf€Ð9Ð_z¨©¤9ç/Jìéí¿jmðz#šh”©Úº,÷ã×\aà6—ÉÙŒùÆ'9>Wh€ÌF€÷‚f¡ÛkÁ̳ˆC‚È œ pz€–ŠÜÆd¹È)P‹C‚;9V‡Î€E=•J}A*i2”ÊfõE餩,xèñ.=FzAOô›EË>Ë€…I[Z,»,#–ÖBÛWd³4=˜*Ïšá¤êõ<é<³[ЀýŠëýüúFg~½þ¬à1o]FOÁÚ3â®üÖAfÉâT‚-QÖj5¼5¡Ñ Š»ƒÃ5µîˆh&ï§"b dd[¸5"6Ia>"Z%IŽãpDŒ“c/Hr#®ˆ—K¥É±C’ÔáTMHU¦ÊªÀ N¥F\ScIÜfÕuÊ€‰0vQ œEû::G:UÀó&žy—zܰlºéù°ûˆû¨›‘Ý»ÜÄý§P¸´<—RÊ¥Ô‘ÔÑ#§v¥HêOˆ¯kIméäV@úÃÙÞÖ­d_ë@ëH+“†h´•iuOí&…袖œõÍö¶š&Τ=My ¨«¸ÛØBO’gµ†r¡p”§¸¶)†U$]áõë,—‰ùblysj¿ÞÀcš« `¯!P0¯„¦‚£Š:"Ñ´¹e‹Ôhƒš@œµ¡8 †4j¬œS@GV¤·óD'á CÖ wþZÏÎfgkfigëG:Ù:2››mø§¢vAÿº‚QÞIOÇú•‰ì-ÜpþC°Ð*),¿`Ïœ<›š…zH•2¯/”ùâu¡x¤´üœ¾}³äã‚•o/Xõÿß 2µWŠVõ°ðÛ]7ÍZ¸)ÔýÝî%W§â éõ^‹-éOÎO™­9_<ÅÛÒÞ’Pº®-À<±ynÛÜy »ܶ'wãYX§Ù¸w ¾ëú)¡––œn¹'Jå@ª¸ßµEŽØÅ9ÝÒNQ WAQ ÌX r‘$*Š?y^_¯åpJñ–ΨîNaðb”c~C~ÍüÊÃØ¹j@’̯ñq/±ð&ЯIÑ$„„ä~þ¯Á^Ÿ-"òüÌ(…u€'ü¤øÑ.ªLJR(äy“ν‚eTjï0^<4Š1Î?/ÏsUã%9‚(ív…”6à}Þ†ƒ¶£6b£ðÒÐÒF¡¥M®®¡Ê†‚LÅ—6Š/m_ 6l£ ’S)’NõØ¢L¥’B'©"²L‘dªˆ0SE„©Ì È2å+.<ñxì,´Œátl$6cbEh+BËXRF²1wÙ7RA”Â92I÷ ¾á-E‹ÇÞá†~€”Mãxù¸2XÀ•Á3¸’§¸2xWòŠ7€âJžâJþßq%˜A먧£gÝ 8ÃÍÿ…‘ÿ“g_íÜ>ó’ël°d¼Ú)X’žyÓãÕ¹x‘=7Κº|Fý#¹»¯P`eÔ½ﻺ)´9§_U§> a2§çǘ€(„çÊ®7=8nÀ–‹5¦˜#µ3¦Öjô~YuÆë¨’cÉ,¯Â*Tð:*ÉÔBÒ¢$Cõ“²4•#%Éìˆ4*$ÉR¯D³¬,=,‰·ˆb‘GõX_ô9))tMÓƒSVï¦gC¶ˆW×õSÍY ^Á?YÄÿ_Qßï8*¨i\Q‡SpHˆ’¨g³Ú­„ãb^ŸÇçö1o´Äá-ýìÐZÈ¥öDZÙ`Šãc `«Î@>ÖGE£x*©[”aE ®ÇÓð4a£íã¶¶}î­Ü.Ã.a«û-ò†¨Û¢î3öñ[\»Ô[[ù]. =ÁÞ¿€.žóWœÏg˜S6p…“ ”ž1œÛôî•Ë7½ÿÞØŸŽVMsšôå©@Üh‹E=Ì«7|²óÍ[Á%¯¾“S»þð“5=S§»Ã“ãÐÓ[üö‚ß9ž›®‚¦`V¦ñ5²Û’ÖPg2Sw–`æ¬i ð~„:™?—õE?VÑB½Rj»Sm¶€5ÀEc¢žS›„NÈ^¥¢@ኢ_¹BñfvWŒVL…\Ñ]ÑW¡ª°¡‰Ñ"pÆ º #†QkpgÎÛÁ1œ¶†¢ÓÖðo;8EdzҴ¢Ð´¢Ø´âÜœâQ‚ñ‚Õ@EòÉB>®ÄqÐ à„ºì¿oΕö±}ú¾h_r 3’á@u[b}¥›Ëo+¿ßÏ>Xþ$»¿|˜=Rþv¹ ÝlȘ1SdÆÌ¹› QÅSõÍCmÕСO1ŸqX›•=ÛrhRuÇÌs6¿]÷õ©‡Â‚göÄXs]J»¢3K'×Ç›#—\&{"]ÿÃïäwÔÔ^ùuû"gG£¾ò©ø%|ã÷VƬm—ç>yÿâÆÊ¾žsÐ=ã²NÓ×ëm¡ Na1ÖÓsH^1›,"~H·ŠÕJÑ(Tó‚’Êq›#+$ñýî$Ñ»æ,O'&!ú…€à°Ýát¢ð#b@1Tœoˆ~ÅP‘"b‚2–_ÒUòr  V;_m 9(Áü:¾éãÅH…¿°[=ª>A¿Ê‡Ëz”࢓8K¥p¹Â Èf•ÔTR`eGv$ŒûÂ……0 P:«àÅ,X* :À¢Æ ~„&z¶žªµ¢çu­åVq©=³X<¢gw6 '±Š;±o÷ÜÑZ×ÖZ^=K­3ú= {« 麜zRR£‹e˜'~ùÅí-mÓ§¨8G¸eɵï×Õ ^7€°~a»>U¾'2F~ 4ª$;äEúŒ]hQ Æ„Mð'TœÍa{#úFì7§Â?uBˆ–Ö 5¥;ô÷H÷DžÒ_Öô¬5jvÃTý 'ëe±TŠh/1¦˜SñÃÈávÙŠöZÒP‘Mÿ-éÝ{½¢ÇCUh²Ûƒ=Ãx,¹÷:þf±°±¤ÚˆYôE .[ìY|‰¥p¾OÙKÒóÙB)LÝbr9ˆµhÂ&ŸÅéìììâìÚì–ìþ,—µŽÉpC!ö$JÎl?Z8£JÜUt=§Z”ÀØxO’® Ïk‚€Uá„4²-Ô¢i²K9¢P„¡A]ý¿ZGÕGáÆP°àÊ;!k¡‡Ð¥p7ùt ¤Ð‡’B74<ÛSrÁ˜ÒƒìÆr‰ fÐg†HðBDëÉFG¡áÔ2Nø–Àpþ÷C[!…4¥§û”†J»Cˆ,m¶l²hÅÚÎ4¡gË{’gY)ß9äÓ²ÎÜ’–µ&´6æ\°Ù¬ÛtÃs“U¹§—N™“ö/uŒ,Þƒÿ)-xm#ÕÕ-ù1Uó 㻡Œîq°ô"£¢5x ¥†iU½áßS¾aŸê õç¦'úB4âYdYÁª:®Æy5¦n"I*xFt»@b9Vç^®Õëô(† àWZÄeŽnXro5Þ8j·qÔdã¨ÉÆQ Ž£v§ì p˜çp;ÊÄ á¨§‹P{0ö[¤h¿EŠv[¤h·Ñt°´pzŽÍ7šÊn€#,F"$鋈M´c{)OõÊtl*Zo¦¢õf*t¦¨+q'M8m1š“[šuöÀ‚²(;çî üÛ,ãg÷¨µ €zX‘:›• g€"g¼[\aë©€âŠTW¾š¯fÞ)™”»©í– go.7ãë­ oÄ_RGm®‰õý]ß=mɶGðÕÔ¸š¸qYCÀê™Oý÷YÁÖúèïÃÛe… ‚-È‚U™ÀçWwàÉÀÉ€:@×hcu€¾zÌ'f[³ó8FmÒˆj•;½ê tÁ¬È9»èÎß&¯æ‘/èõù:xÁÆóFèRÞ9“Ï„‘Š‚ "ª.éÑ"x¼WàM˜õÁ²§Vsœé½6fx™ïæ¾Çô)¦_‡V˜ Þ‡ e§£˜ÁÝtdCM³³Ê½R<|VPüþ'*!€à=ˆ3zd.Y Ç)úÍ— ÷©žS®qtölwÑ+— [tüî`Ë]J&ùß¾ûy&QÈ×CqÙ ƒ ÐÁÁìkÁ4î91h«W;Mþ1¨ç‹g±A!²˜ê8€ê…£wVë9ÎbŒÿœ{½>èLῤͮ²6W§êqeY]]î-ùÕM’GšèŠÜ÷pz['Ñ(W³}"LélÎu0ã@ç4^ú¼²›b jû‡V{3=&5M7vzxzç—¯ö¬ö®,¿Í;ì}Ëk*±–ØêP§u/ç.W_n¸/ý$zÒó¾Û½ÓFCÚÄÔ"gw;D»@K%Âêbm¥öxI$iJ§;òiÀnƒ5€åkZÒ_s°Ú†ñŒ³<hrBYN¢K¹0^8á(¸V÷ñÏ[è MŸS—ºÂ_ôm-Tá¬S€›1‚b: É Šñ =Lq(eÁ^Hy¥þÄ Ézî¸þ5Ú—ð¶ð6R|zÔ,Áëú ›™JÇ ÜðΠ|A´qAÝ|þýÂ`±ä‚P¨£çãCvLÑVÓvú]Bö,™›õIŒ5Gä‘§“>3WêZŠïéWÝUà7`7ÃÏÞ}FÿãÅ|Ó—wáGDG}½ñLJO¼«W²W@[íÙ_"…Tʵ£‹ôõm¹ „öÿøÒW}„ºžF@pC¨„òBB; TBAÝ~öM$@˜Á«ú*çêÑ…Œ%Øy(¦¾Ò7‘곪«ÑjÊÃ}‹ ŸdîD³ élèg2ÔwA¹ƒÔ£RH§@šäžF3i\›iÂ,h?úŸ÷Ä Ü׬ÌPOÝa5ðÙŽ~‰NbÞFbä猉Sý]Ïuªg©_Óthe]F÷®þÇúcƹ¦&ÓgüIaļÇò‰Íg¶åXï"îO‰·Ôóý#pKà´x:x2ô¹Sf(…þŠšÐ*Ä*¿ÔFÁ<î0 †þ¤´°ç‘C~„æÍïœraWrîª+—_=kù† Ö^¹äªî S“×^±¬k.R|½ú_·5Ei«üê+ýW¼z(¿ÔJ§µ žŸA¨ Þx2š‚ÚQšŠ:Ñ44Í@3Ñ,4u£9èt!š #‡.FóÑú;¤‡ÑÜüˆŠjo¯”‡!M–+é`I¢ò½0èñU¾¤bÈýð(*ð Ã«\Aƒ“'35u…ÌPiªòx«Hð¢;•î*)¯(…÷¡O™96ätU®}‘ù¶ò*»‡\^zÃ/µ˜ºÍZÀ›( ^b¶2Û”™¸Q™C#ž¹I¹9?d0WnêÏ…âZˆwA…ð0!NCX æÝC&¾’‘Y¨Üý€~D?ªg¸n”;ÁäØn®—ëã¶r»¹}G€­E-sª“­mäC˜Ô}@ h+Ä»•œ \xT)ïVʽ÷)eân%'Aœ¡9ôõ´Û ñn´-Kgh‚*ü7P×ñn„üFö…39B„H0BPŸŒàÑȉˆŒDÈHk9¦ŒòŒò˜2Êcpç1åÙÇ _ÈA`´ï+íÞ‡vï+íÞ‡v4÷ßêz!îSr2ÄÝJN‚8CsäýA©–ou’½Ðãbˆ†pƒÒ·@X«”DÚ‚ì…X& ÅË*·“c ! ’@!ñ)ÉÛS¹¸•'@—@—@'´$Bh¡¥ü¹p m{ÿà¤BÒPu¼µ–J:”ûÑ~ÍýÐÍ¥!nQrû•6üÙòÄ'”\ÄûÎÞ·XɉŸ¹—!Àç~ÈñdÔn’õ9€,fe˜\e‡ÉÁ’¡B2H“V+a`îÊ @#þ¡?¬Äw+ñÅJÌËzÉøOÉøºd|B2¶êÈtÀF|R‰ÿßb®/6Š"ŒÏìniY(…” G;×»².»¶šJ¥X»½^ïªæØm5wP›¶¤K RîÚ„BM%l¢H´I´ÑÝ©+EÓÄÄø'$}ñI­5BTôE ˜€Šß7{RHxòÅig~»óûÍ÷}3ÝéÍ4ÛùI”{£+*•+•O*•Ó•Ê[•Ê ýž„¨ˆ® +WÃÊ7aåBX9VÆÃJgXÙV¶†Ñ”FBD‘ʰ¤]¢\]Rþ )ß…”/Bʧ!åTHI‡”ÇB §¿Á‡¦B_å«¢¬½°Ia›Ø5]”à7ÝÅW’e3’DwÅWÈu“å|ËHÜÚ°ž[MAnµ¬ãÖA€ÕÜgMˤ•Ô… ƒÝŠ+#.çú(ÐEÈ\ïXÂõ-,Gÿæzà·Ënr»à·7\G¸D'¶fè¯ÜžóôÑÐ,ý¨ÒYÀ·A}ÁóN? &ÝÕœD1 ú.×!8:Éu à®W¼íÁi®3€SÜ®˜àö8Àܾp’kƒhï5¢ ;'`1Œ˜áVè!n¡…Üzà9nÕìãæe€n^Á¦{¨Káɦ6ÑE¤=ÜÖñòy–h‚î$µÂòÜÂ!iA#M Mä;§Í¸°£1ê +Q®? 2“ë*@ƒ7rsÛ¨ãŒ1Ý̵ ¹Gó6âÏç­„0ÐP„ëgAĸ½‘á ‹v ˆ-!¨Õy¯%ÄA­â:ªŠ¹bÑ"b ‹…D¥'ϳ¿Àî-3GŸáìf4'SÎþÐγ_¬^ö³•ƒe-»Søìyö-HçM¸Œ±¯õ+ì+;Ì>×A ²Ïôjö±zˆå´6e•3sì^ö¾-,¼§B3Î&µœD¡õ›öVvB7Ø«jcxÄ/ 04¦bÏ«£l…¬u”eô2v@ëb{5t´– èm¬:²ÚôÙ{X>κkEÄ]úeÖ^+ú´Ež2ñ¤ÝÆZ  ‘€êṬ¦Õµ38F¤Š6O]fOo¾$Á§0=ù`´Úÿ¡ÿ°¿×ßáÁçÍþ þ ¹\"Ë+äår¡,ËKåY’‰L¤5øç+÷7k–#,-À²@\KXzÛ‚g ÀöÃYíKJÉö˜³ÙHæü·Ûœ:#éø·ïJ¹”¾”¦Igv7Iö†œí‘-ܱÓY‰Q§$I’±ˆéÅ%©½-Æ‚x ñ4¡ôÁ±ãAÄ–±ãé4)i 4–˜«¶´ÄïStçËDü®×ņqÏ]™óJ²=åœ)K;5xq»,t6â¡ÇÓÒ ´7Ÿ–ö!¤SÓ´_L´a=í§AV/dÄ”öŒX “:‰‰2¨ï¼KF]¨Ž»¦é‰¶QE0i¶ ÑNOÔ|·ÈwŒ6 Q³ï˜MxuˆF@[{]8Ô— Ye®ª‚%[E‰[£‚ÀUk½c‘Ö<úœGŸC:Gé"_«zÑjDTIñ?¦¾ØhD§Fö§ð°êîH¢r·sl¤?àé …Üý#ùS¬ÕîÞÝýˆ=}ÎH¤/îìÄCnCê>t é†HÜ%©DGÊMEûâ¼!ÚˆôÄÓS­£uC÷ø:zÇWÝè}Œ¢±:ôÕ:tzéVô5„¾†ÐWk´UøJ¶Åhr{Ê•I ßU8%ÂléV¤c¥ÅL1uê+‡ƒ $EFÚY‰9 d¤ªšªš‚)Ô <> endobj 182 0 obj [ 250 778 778 778 778 778 778 778 333 333 778 778 778 333 250 778 778 500 500 500 778 778 778 778 778 778 333 778 778 778 778 778 778 722 778 722 722 778 611 778 778 389 778 778 667 944 722 778 611 778 778 556 778 778 778 778 778 778 778 778 778 778 778 500 778 500 556 444 556 444 333 500 556 278 778 556 278 833 556 500 556 556 444 389 333 556 500 778 778 500 444 ] endobj 7 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VXHDSM+TimesNewRomanPS-BoldMT /FontDescriptor 181 0 R /Widths 182 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 183 0 obj << /Length 184 0 R /Length1 5056 /Filter /FlateDecode >> stream xÚ­7}\W¶çޙɄ'!@>Œ (…D¤ µb¢¨E´ZžZEl«E¬OW[Û­¶ênÛíZW‡€þ‚Úê¶öÙnío}»ëÖµ_vÕÚ_]ö«jwkɼ3Úú~þñþxsrïù¼çœ{î;7@ º€©¹Í· âÁ‹’³ØÆ6w¬´ì.*ŠDú_l‚e Û6|óâg §>²zÓþðÇüÔ;[[|ó¯9‹®£C=ŽÉkEAx+Û¼„ü˜Ö¶•«âFÑ>äç#ŸøH{³©`g!ß…¼¡Í·j™~ý9òÛ‘·,õµµÔlßtyY¿¬}ÅJe7ìBþÈ;—=Ú²¬ó}ûÐGu>êŒt0q„¢„j2Ú‡:àVå*! ›™y¢”ËØ±},A=ê‚o*dT/ýj£Á¢°C"¬ƒÐ×:ø r!#\&…È÷Ã9ø¦ÁCp*à 2z`:äCyÆßAxàex G¬†v´-ƒŸ€GSÞFY¼¸!@=zy~ªœ†}ðÜTö+_ƒ 6¢ÅyåÏàÀÕzç”)ès1,#Yt¥ò4b¼à|Fb•BˆñPnX­ÐKá)Ô½ çá#’ˆ³É'Æ)ƒÙ°vÂó Ñ8‚p³:'ð ?_À ÜsßcB´:˜±N’O H!æYJÜd*©$3H®ÏlRO|d1YG:ÉSdÂKd?Σa€'sä#„+ä/ßRŽòÔLmÔN%Z‰0ÁG›i+]DÛèV„×èaÚO 0…LãC™SÌyæ#æsæßl»’}œý5{–½È^aÿÉÞâ œ“{›¥3ëòuºWt}üþWüEðcÁqøñÓ «é.útÒ)øž½‡§Õoh9®Ä:ÒG^ÁJ½Šûv<Â'BB(ÂXCRí)clÉV‹8:)qTB¼9.6Æe4DFáa¡!z^DZ %鱕y-²Ý+³v[yy–ÊÛ|(ðýHà•-(*»×F¶x53˽–Z.ø_–Ò°¥t×’,P•iñØ,ò‡n›%@ª©Gz«ÛÖ`‘5ºJ£·k´€´ÕŠ,s«Û"¯Å#—u´öx¼nt7 ΡY™¸1°aªcJ}ëZ͈T œ`s{äx›[Ó1)ß|¹º¦Þãeµ6deʤ´ÙÖ$ƒ­DŽÌ®Ž³ im=ÆÎÊ\¤æ[ÂçÛæo HÐäU)ßÃõ2ãk©WaÌãln9nÍUóìÊóÌ”2M)óµô”ai¶”³^•ó=ƒ\åL º¥êe²±a8 -÷áY´Ø<ªÄ»Ø"‡ØJl­=‹½Xs¨­÷'H ›ÏÝ Cu½?^Š×˜¬Ìsçd+e «8«XÅ“­æÎa|íÉaùïN…iv§/!®¬½[¢F²MÅ4eK³ùNT»–‰ÐÓ<Íði 8ËErH©·Ç0 GÉ\ŠÁfé¹ ¸P¶Á¿Ü+ñHt)†› ’êrÞݨ¡ñŒ²âWìyüŽ1x>”öS2•ÓÈ,)X~*¡;•ahBˆŽŸJ ^rÝZVkÎȘ~£ j¨`ºáVA•a¨Š † 7°ËqºŒVc*6+׸ýWùÝ‘óñ÷)ÚW·1¸“¶s­`”.°Œ fÙp1 ÑÑqq ì!}¹1>*:@Âú¬Oªº1ÝÓâþŠŠ¢òó‰1*¼ox?Ç7!NÇ댆¸¨8ÞžJçºEï÷¬Î®¹”ðø¶A¦‘ðû›¬]«Üüþ—Á ;­“’$²´|ò0Ÿ)˜ *$K%‘^‡?&,’ÔŒºèXÌÉTv(2>&VË©jÖpN7†îÍ). ZJ0()ñ©yòŒ†Tš:!6.ÊH§L¯œñÔìÉÑ/NéœT󇄗»ÿ›4out¶•'Y[s4ñ(!;­õþà_ƒ1·‚Ÿ[xúFcnö÷XÂP=C@½aƒ™íÕ]Fôi!ÞsÚºj$³¡µƒšG’«Ìw¹îd—ã$sYÌ«äŽ·Ûød{îø<׸ØrkG]´wjTh騲I%Eó«ÙÓò:ÇFèù ãÓ¦5×c.Ÿ(_‘“ø»Í 0º~,Þ±®úÏ‘Àwƒæ8Ù;ÎM:]Rêp”;Í**q8J±ö¢”A¦—óâ×w4ì’’ëáWMÌ»ðG¸ Lärù3M¯Û7š‹Ø+Ðî¨Õ÷YB»”ïµˆŽ³7 ·¡h°ã•®–&BR¸Ýœb²ëSí†Ö.Ä…æÄÐ\Â'!ÅE"‘ $»Qº\±ËÀGëFž dù\˜;&Ê8>•Ú’]Œ).Ö¥î<µ&§Ú† y.ºn©µðÀ"k²$_^ßRøXðÒ»ë»ç<®¤à'1盟ˆà×Ïþórw›üw†ÎÈÁ#}'I9¡Ç†Ô}‡wH&…k„Xh—â;L›LÔnÊ3Ñð¡&ý¥dæßMü%›é’ KýÑM¦é”ŒB8CY} §çÃÍX{ʈóHx¸g>AV•¼JæÂÈ{‰/äÈRáÒWÝüžÜÌÈÀ½‰‹1šbãb¬¹¸ Œ¸’u|nŠ‹6‘ÚeCgWW˜ÓfŽ!íá\r{ZÕX6q´.ï!æeç¸$Câq¹7ÃÁ_úb^dÁMBôjàöê»8*¸O”VdCîØ«XAí²<<È¿«¹óðÜ°ÒЈ-¯âO`{/âQØ.«ÿ Î’(¼u£fm4óÐé*Ä ©(úŠ  Œh£Fbè÷ìšÒŠ’ŒºEm-+²jÛÛ|KGîû ´@ Üïá±…á„H<¯¢Á$E†ü¶ŽDÖ‘¢sédo‘ŠrC8µÞ¢õ­r[ SEÛy²]Gþ^<ƒ²(þe°?EÕ2Q@Fê$ÕãÉ{©ÃHQØKÕ¦Rë1½õTÅz؆ô6¤»(‡X™µ£¤%í(iG ó«Æó43S£ÎÐ8'rEÈ95ÎÑÈ94N¤z?ÑKÇÈUREjDŠo/Oà…® š@$9þM3Ä·Èk`lÓú'¤‹ð™E¸h¶Y„õá-²ªQñˆÖ)¢Z¸P-”V EÕ¤já8™Œ÷N0’)Mx3M¤ ¿HÖ¦ iBVŽîÅ¿Bù…Ö?+Y*„o+„÷*„*„š aA…`­š…1‰Â¨D|/:FîˆÜ !HöovlGÙ;‡X ßq‰™yb€lö×e"zÒ_÷†XC6@:KpF]NU¼Ü^Mœ^Eœšþ?üŽt¶Â_ø2¢åþÂ+XŽ%­)û]WP:Ñ_×(‡׈ÏqàÖ«8Ë_¸Õcý™ŠÅF’ Ù$ÅcÀ¥©màÒÌ“G°Î_gGs®UÒ„øÅ`w€’£âmG­x+;À¢äfv@è‹ô}Ã/~ê@$ʼn;Å?Vˆ§ÑÃ;uWÄ“ŽGÄc™Ú€_ºO¨Þáu¼¥¿(…‰¯:vН86‹?+ÔÔû\š¿]uz.…GÅÍèfE6~øýâ£.5B˜¸=.ά›Qü¢)fgNg:Ž‹5ŽGÅѦº5Tî8¦MçI(N‹Iâ…Š“Ý8¿˜¯÷‹ã‡ƒËÖ¦—S8MÌÀé±Gűu9b2†$R–øàB~ÿ ?Ïå¼OáGóI¼I¥7è#ôáúP½^¯Ó³zÜ·zS@¹$e¨¯¹IgP‘ŽU{V£ FþÏãËH‰žâÖ e£L¶Æv™‹¢ ùeîûtÞ‘>ã~O’¼«rf½| ©A§JRC¥œ«^$È5rÕã _ª¨y+¹æ©ÕäVwCƒ¹RžV] _zP±ïéªòKà} *åYšHG‘{êT„~h¤«~pËæif›‡ÍèÍÜ*RÍ®€C3sÐ+šÙ‡ªYowºÇÝ›ž®™pÙЭ™tsÙª |8s'u÷:šU¨LœZÞÎPYs”¤9r¹Ð¤Ð¥šôŽs¡A¯kœ¦vü ÎV׫k5õœÔÙÃê}Ãê}¨ÎøzZJþov}svoØ£Þì½6O 6¯¼¥ÿ¼t5Y,½v\ùíÞ¦æVûZäݶ·¼Áæ¶ôÎÙsõU=Çæî…=žºúÞ=R‹Û?Gš£ý!èÛ´u¹çžX›ïÆZ¾õ>ζªÎ–«±6yî£ö¨êMj,Ë£ÆÚ$mÒb©só,šY²â>ÏÊÇk\±¢þŽN  endstream endobj 184 0 obj 3648 endobj 185 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 8 -179 699 676 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 183 0 R >> endobj 186 0 obj [ 333 333 722 722 250 722 250 722 500 500 ] endobj 72 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 185 0 R /Widths 186 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 187 0 obj << /Length 188 0 R /Length1 4368 /Filter /FlateDecode >> stream xÚÕ—{\UUÇ×>ûœs/ˆpx\@yÅ+!Þ! z1-Ë2ÍH|\øT†&”僔cì19ŽCÏ)¦¬)¢£#ަ8YPTcSNˆ9CŒ5@ŒÂ½óÛ šÏg^ÿÎç3÷Þý=k­ýZ{ïµÏÞ—ùÐ&’ä\QQZE‘´–¤øw­Z½°N‡<@¤¹ªÊ*JCª,"i‡­¡ìŽZWñ„Qˆr‘¾²|UéÊÞag<‘mÆ+Ëað9.>"²gA¿¬¼bmMBm9ôb¥ßQ¹¢Tÿé }ô ŠÒš*»%¶AzÔêÒŠUçRklЛ¡GVUV¯uï¥ÐOAϪºsUUÉ‹/yÁG»l‚ÔxÔˆL Ã3šìøj°JÒÉ ìDýt’fP½ö Í¢EtˆJDµˆÇh»H¡‘;ƒ^¡:Š”C)´L6¡ÌuÒ>êÔ–Ò h.J×&á¹€nB©FMÓ"h;éæ«Í/Ó“Z£ØHOÓŠÔPr€ŠåTA™Ú T¢ß¦mŰªµgi°¨šJ´ÙÚ/véC”c\5x‹š©IVhçl%4G £õrú”ÎP¶–CË©A[OÛD§hÝâ ­ˆÞ‡Åˆ8iÌ㯠£ ¡~ãµjá´†Z¡‡Ó,©çÏSóIIð_%—xÌ8!žÄø 1ú~J§Ýôì»Q®™Ò±º)žÓyºß$¹ –L£òa¬F‘ÑIKD#­3ïÅ\!O¶ŠÊ”»Œ:q”uDˆ³fåêÑZ‚YBõtÞhÖòµnZOuÚJ¾AŸ Zæ#ÀhÔêÄò±9¡Fm7(3çR¬H¤1@E‖B–l{¾›ãíœæc^M+>Ñ/†ÍT3N´ÃQ8dfS¾13E›™kú¢Fæ±íž­=´…Òœ6ÓÐ¥&(9ÊjÖâ®]Ùìü^qÔ±ÅÑ)Éÿ¢FY¶¨f*lžXµÏã),ÖÃÅÍÆäfgoÖãbÏü·Ì3)Éó ‹£ö ÛÜ9ãÍÎ]6Æ…Å•3ìs礨ÖÈåÞ©»Œç¹6 q"ÄMa74R;Nw¤“ÕÕÑÕ‘èíííÒi¤Z†œuï´ùs§™D¼F¢!‰Š)¶‰‰“%M|.&X†Ñó1k‚Œ°ð‡E‰R÷ŽÐã¬Gd\bœx¹ÕÕ׎ŸÕÞ‹Ÿ.¾¹¹é”š×;”מaõC‡57-.ãÊœL¸1Sdgi±1š#(8jæ1CdÇSvEG‘#ˆl½­ì[êhçSû/œ8~aï3£©æ5e#߸‡DÈÙb½{èë}×–¹w‰5‘—öw ÍíùèÀߢÜ;D¹ëºÚdüÞHvw rŸO®åñeã½sQ:‰®uÆxùØu Þ¦?A¡ûùl›àkLÒí(èiñf ôd ôtSþ«AaH}í}}Ê€_šˆ½BL1¦Ã?(8ÓùgÅOÙÑúᤴƚîÅÓ–Þ;ºú¾…Eë¼õRyvÇýÉ·Œ¬½ýƤ$9«FVÞ½p|îëdµXo4ÓŠrZ^äÝ.ûx{‘œ0}“écu…õ… oxƒ.gŠÌŒ`Gi“±'½S“"“¼½ÚbùÓ£¬Ä@÷"´'Zݺl0†É‹bº·Í#ô­1ê­K*3]Þh©íõ ô©ÕJ_áðõ·®” vÖl Ï =2p1Üööo‰[×òÍL ¤Tg¸¿ïo›.Ènøî  Þ:•ûšÒÒ]AÖ@ÞH^–ZµÞwyN2ý-Óæ˜"&‰XÌÏ’·Ÿªï¾x¼þiÑ¿,øÈÇZúh7–ÏÇß§ÛC£Zæ'Gy ³eƒ™KÍ,pÀ _òÃûÙà·6B’‡ü ø«C–2”p‘ÿ?£N…™#&>6&>á 化¿§É µ-{37#¹¾hÁkGüòµœÓwï4ÜÜ/a¬Ùh3ЉpÐIj.ÝP¶·§ Ì“–_of{ž­zö´À.#‘÷^­-H"CØÕD[ê<±ð>³cæ …DP8$oÒ…ÙI€g ž¡¨cBa(JN¤)Ö‡_}š7˜gÖƒ£ƒ”:úÁ¤¯¬OGGÓÓDtN´D 4c£0ØE!6 Wm¥ÌŒ=áÒö4½ú¡KçÓô—~éqé¾_l¡"´=mï`¯û pö^lÑN¬v·®vO{|,Klh¯<â>Ø‹ìwÆb”Ó£Á« oõËTCSŸƒû/Õ~÷ô´¸ñÁŠN᳕ë£8s¹÷\:mßüœï>^úIr™qäÒ;)[\Ä^­r€–Œ=E+Þà¸P =JŸ »H·‰&ѦepK^t7Ö>s¦fÚ‰5 Û—8“ŸÇãý™˜Gš=oñM…WM]X[±¼òõÞäûeuOø¯7x´M 7I†¢¤{AeÁ$EĦ¢›9Êa^b^d3¿e1™Ì¿2¿a~ͼÀü ³Ÿù³ùgÞbù<}I+?çYS²¤s,÷2Ï2{˜_0ÿÈ<ÃüŒùæiæï™Ÿ0?f~Äìf~H÷#n &l*G‚NØ”EÒ¯(|g¿,ðÐ븩e¢Üë¸_HP•ká^c_›éUôhà©l¯"lJS=½2Þ‚Ê‘ já%šy×y‘ùóÜfMŸgù9¶ÿœ{–-ÏŒ·÷ î¨JSí)‹¤§¸Þ“T>5‘Ôȵƽífù§Ì]*Žé'4 ÜÉ–Ç™?æãÜG™pŸsîD²¤q™Î}ˆ¹×ô‡\æAæ¤Þx.À·z¶lcn­4š’%n[[xʃMåHP͈²¨Ýªjn`Þƒw‡*uϘÆýÜÍ¥jÙRÃ\ϼ‹G½®`l_WÓ45«Ç4®©,÷ç*^ý5œSE•¼úU¼úUì[%­¦xØ*yõ+Ù7e‘t;×)g–1W1W0oe–0oa.eÞŒÿ j¯ßÌÚös1ËÅÌ01¿Ï¼‰¹WªˆåBæÌ̘×3ç3çy>‡§×pûW³eïè«XžÍ,`:y4³XžÉÌgæ1g0§3sQ["攜ÃÌbf23˜é°IJc9•y3…™LóÀ©,_ÎLb&Rú0ðTZGh<ËqÌËp›ð?ŒAÄKüÿSö(Ì‘ÄÿU~ ["XžÌ /‹ƒ0æ$î;”K…0ƒ™ŽqZ˜ ÜOâàGÛq͇È=ŒçðnT²D7SÕõãÝåË–‰Læ¦7Ó‹igÚHÝZL¼]%ñE|Fñ9$qÚE0UË‚ý_†Ñ/ƒuZéi¤f¤ƒH6Ü^®ßÚ ª§þO>4õÿîñw+;Ò• endstream endobj 188 0 obj 2671 endobj 189 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -250 718 778 ] /FontName /BHYTPC+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 187 0 R >> endobj 190 0 obj [ 744 603 768 247 494 494 494 494 ] endobj 105 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BHYTPC+Symbol /FontDescriptor 189 0 R /Widths 190 0 R /FirstChar 33 /LastChar 40 >> endobj 191 0 obj << /Length 192 0 R /Length1 4532 /Filter /FlateDecode >> stream xÚÕ—{X”UÀßs¾Ë\ øf`F.LÀ  :xI¼¡ë*)‰—+.…–d­B*c«UÉuÙ²6ݲ¶[,3WVH ÜZ¥ìbÛZ¨¹‹lÛBñ(Ìì{^pŸgoÿîóì7œßy/çúžs¾ï a3HàYUQZ QP‚–nLñ«î]g«\X'£<ÀC½Õe¥áÕ€¤G[cÙ]µÞÒƒ;Qß  èË×”®¾Ôä‰ÐïEÿ¤r4¾Ç>FL(¯X·!QÓMF}XèwU­*U~«+0ØP­(ÝP­×Ø6Ô'¢n«,­Xs)eƒõE¨ÇTWÕ¬ó‚ÇQ_‡úÄê{ÖT—¼è~uLú@´1ó3R!s;èñÇpvdP@‡v€~8S ?Ó`1´C ëƒV¶¶3<‚Þ)ð ´Â L™à‚Ò~,3 gà 8×Aj^Hãã0/€EXª™së¡5A;âÓØËð4of›`/CŒœ€%`‰ô:T@:Jä;x=N«†?ë™5P§ó‡Ýòw©Ü Ëà´À~©‚_Ò•ÀL6„­—Ãçp2x&¬„F¾Gz”amì,ûŠÁûì8f§”|úyq–áЯ´C·ÂÝІº¦Iò˜?_Äœ8~‘¼l‡ÒÅžÆùâìû! öÀ“h߃åZ W×%áÈá2ÌÅŸSÚ–t¥åã¸EÊ(fͰ^}c…>©µBº´[©c'HÇÝfvA‚lÙÎÔh€ËJ Ïågá>¨ãßaÉ×á ¥‘ïÇx˜•f^ÇVŽÆ ”"Ø®4B(FÆŽù2\‘eŠØaîMÚÏ\ò.¿ÄÕ›aµÒÇúÙš¢Æ±VeˆÔ±v5rÙ°šÎŽªÙjÖ¨Ã8ÝX¿É[!Õ£SYâ ’mZ ›³ºÅsëÛÉ¥vWò¿¨6Mgk–jmoøý…Kd«²´Eß"Åé[ä8Çùÿæ<ïJžW¸ÄöÓÍš9Öì¬3Ѹp ŠBC3ÚgÍt‰ÌÁëk’½Êó¸wuî1È 2½ÂeHé>×ZOwOwjˆÉnг›ì^†k$ëð_“.hèÛ{T§hC•ù(®b®v¬õLš¦Ù´TMÖ÷E›cÌ)æifÙ\ÆÂ&ìK ¶1Û»`Ÿd&«v›¢…˜eEi5è’ÉZÏIüë9éFž#¦AJÇrwï€@Ïr¤RãìîI™é8¸ôhÆÒIvÜÄ’X¬ªs[j;iv¶˜×¯™«s];èÒÍe3»ªfÈ.—<ûή;òå”ypéf¯ÙR6GuÉysÊ|ÛÙú²9<7c¾oî­YY·²¶ùgÊóçzYxàr«Ëp×L:ςĘØh‹Û¬d§º"ÂŒ,Ùš:y[†YqF?Œá ìŠ‹ÝæHMK´X‚¬‘êXu¼1Ëš–m´Ël‚<>r´žœ^÷ò^wOG¯†BÏÅ“9ÿ0ýî‹-Ïéwkî~·)\X)¥2ÓÄø„ »%ˆYLSY.›8)ÝnqĪQ,TV,¡aá:{†ð$ o|C‹ 7Œ·l䕵·i¬}":c\œÇíëó])ÜÀGvn,¢;/.<#æñ± ¼~ílÅéTf¯Ù°ó¶·ž’å´~yú3C×Ú¹’Ó)ͪì2|vúËG¤ÉòîÃm'w`¬ê¤vŸÒ‚ûÃæÑ `ìŽ LÞ¬j=‘}á89m 'Bò„ª:ÉqʘâŒq GʔܬD›–â[Œ±gm>YjT†ÀY6ê6 ß+#FY‚2ÕkÄ–ú°½Þ>S¶ cCQq˜´IRãᦆO”¡©W­Ê0Ó÷ÒÛ¼Ø'ó\5B Åc5u2½<¢øBŒ2”©’&{Cµœáœ^S¶mo¯9‡‹aÌ0¥›4Ug‰fã˜סøígº‡®¾×°—õ¯ëü„§œõù?4žõÃÈžþé šÃt©QÍ ¦æYpAŒß…¾,xÌPòC0*&:a2”a /˜þyn8”Ô8±¸–ØxGl|ÂMb0<÷À~5B·â­lwrCQÁkÁ¹|gòž&ÅGýÎ5Û ñà7K‰{em@4ÚÑûÈaâ¹ jÆ÷]ú ѳ¿‡Ó£$Òû! Öå9Aazñ’À¶ô¸©5|çê1r¤†3ˆ+JF<ÙÐaLZ͘‡`uT”Î0KÞÑÚGW>ÏÌÑÚ‡ƒ#ƒ2òa'¦+Úç#ƒ#i©Ìži—0…¨Fì¶pN,¡îΔ®mO•k»v9UéW~ß×¾‡Ø,‚Et¤¼è;Æ<¯¶ò®J_[¥/kר‹=ÐQÕé;vÝïíJ÷¯w•Üœ3(¦&žco^«½žû[}xâqÅðà}ÿ©ŽÒ<ÒŒ÷‚ž×Îé·üÃsý1ȧÀ«8ánupvÏÂk“ x4gmø•Y‰åb¡™¹Y1ÛÊŽ°!®ñ‡¨%Üko؉H{p @÷5ÞØØˆÍcý©G˜ž¿tQጤ…µ+«îïvz|/‹»Ìx ÿnÊóóÍLH¸1%xÉIfDĽ)è#އ‰×ˆW‰CÄï‰ß‰Ä¿¿%þ•ø ñ/Ä~âbñÏtþDòeøVãþ¹Lš%¸DòEâb/ñ+â—ÄóÄ/ˆ ž#~Fü”ø ñcâYâGðî[sj§Éve~Oòc–÷Iþ±›Ø'‘ï‘ü.ñ$ññ{'ÉÄãÄvâoˆG‰oß"†7á×áQÍÿö/,Þ áÛBÁ<Œ´Íè9„·3mÂ#!=h ~ näëx?‘òüpo“éXî Þ$¤(×J=¼FcmW±Gsa{÷⽨ ›ÐDO¯Œµ <R´ðÌCùÕy‘øñ—Ôæ~˜ŒÜGòódÿõþYžkïY¼G M´',I}>AÞÇq'Kðc*ÓHÞLjÛiM¥2ñ†|Øÿ Ž­,Ûˆõc{§¦¢&d o„[i>uT¢ŽÖm+Íg Æïz¶g CÏfØ„½*ä‘"›àGƒ6á‘""Â"N«¨ùq#¾;D©£õs?•ª%Ëâ}Ä{iÖëóFÏu ܳ°fͨF5…EÜôªiõï&O5TÑêWÓêWÓØª âÑVE«_Ec î¤:åÄ2ââ*âíÄârâ2âmø¿8ë·‘VLã\Jò≋‰? .".¤•*"¹x ±€¸€8Ÿ8˜ïÿ#Žt6µ3YfÒ‰žAòtbÑC³™FòTb.1‡8…8™˜µ%ÜsBÎ$N$¦ÝÄ4´IJr ñ&¢‹˜ ùÈ$’o$:‰‰€}(˜ -vh<ÉqÄ x›püVd,îx ÿGvÆHÂ˨(M–(’Ç­y£û ’8ŽúŽ RáÄ0¢eŒF'ï'q8ŽP²…à÷hj!Ô£yÌg¦Ó(d ëøˆ¢n0® ²Ü@ $DQOÔ¸µ¨øv•€¾Q@ß(ú‰ÿ¼£ˆ¢eFã_³_ÖÍØú˜öbjÁt “o/óëYMÒÿä¤ÿ»'êï¿8ò‚ endstream endobj 192 0 obj 2807 endobj 193 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -250 795 778 ] /FontName /BHYTPC+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 191 0 R >> endobj 194 0 obj [ 744 645 247 795 494 494 494 494 ] endobj 80 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BHYTPC+Symbol /FontDescriptor 193 0 R /Widths 194 0 R /FirstChar 33 /LastChar 40 >> endobj 195 0 obj << /Length 196 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 198 0 obj [ 744 549 ] endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 197 0 R /Widths 198 0 R /FirstChar 33 /LastChar 34 >> endobj 199 0 obj << /Length 200 0 R /Length1 3376 /Filter /FlateDecode >> stream xÚÕ–}x•eÇ¿÷}?Ïs:Æä²18æ X0&or†c!Ð\Ãè€4Œ±«;2@&ƒãD š©ÙBòÒÓ\‰&»°@iÀ%½Ì ‘ZË i—Ì­ßý=GÿèåŸþðº<Ïužßïû»ß_žû@H@ ‚++JÂÈÄzQ:%­Ü¸>°vQÄTÐÃË«+JRÂI€¹Aâõ«×T—óú.ñ_ÿ¾òU%¥oæ3g¡øŸ-!á%uRü{ÄS^±~ÓÕÙhŸmuMåÊ\‡2ñ[Å÷W”l û¯R÷ŠHüÀÚ’ŠU]#·‰ét F…+«Ö÷·âiñûÄ^·*\üÄd©Ë#ÅDS°ã±#òoëÀȸòÿü´¤œÀ l×;0‹ÑbÕµu* ;$:O¡G%ME–›fÉÓ‡S8€SzŽ‹W†l}­¼ p«äjÒZ§a:T:t¢ž­žÄ^ݤ¶à,Å('Sr^BÈ´¢9zНêZP¥Ã•„*ë9º`F£sSÝ|,Ã!DÑl*ô_1òT¯Ô^Ž×pSôT¬@½^!=mW§T›:£ÞÐExYQ}ê„;Ì?RÐãv M§â´‰ŸŠÙƉÇçÙ¹Ç8é¿Mej·{\í•ñÊè{=x@ô=’/ŠlÓˆ,#=ÇEÌ—gœi%Lj}»PäžÂRÕ„ ÞÝ2W3mª9¦Ñ¨£ô¥µduÞKÃ4']gzÅØŽ‹nTÏÒgp'"ú²älÅY·^7Ë|$»M:¢VÄænêÜz —™I—÷2Y‘Qî%©ƒ: I¦Yíÿ`nÜõàå£ÔíV=ª×›èe¨·W–<¢:¼)˜¥ú¼ÕîMó¥DDæ±}sí–lä Ïs£&’¢:ãæÒhð‹¡À±%éYþÍ $ùQFW †œTwIÔ5þ¨“1úÜÿ žËš° 08 |sóâÕÎ]ž'⢘ÖYô¹yY±}ZÖßà”¹Ë)ö!%8ȧü®v0±³«3I§;OwN64}hFúÐô2}U&µï|ƒ/±÷uÞ¸X!•â$ê(ëìít°S×ù¸ÊŸtzfçd©¨¯»«{’JŸÂÇIì›oÚlR)u‘:ð¤Iz­ðù÷n2ó]¥üƃøœ°ÊwÉﰆ݌~›|€mÞÏè.ÙÉßbžzFw’u\Óo2Ïò>Œµx[ú¶Ê½dm|ïÔâFñ¬mä »ã‰0G„ë¶ãÙ*ó×%‘­ŒlÅa‰Ô`‹´ê2b„v†·à˜)š¡«ØÓjK~Ü,ß ›ksÌc;w1W5•MääFŽzCnì\WaæJɪ˜Ç’V1rg†¹úw0F%W?ÌÕ³o•X‹ëE«äêW²oV1øË”“«ÉUäJòv²˜ü ¹Œ¼Mþ+س~½¥ìçÚ!òËäbòKä­ä"®TíBò²€ü¹\@Îø£ôôó¬?ŸJOôM´ç¹d£™MûFr9“œAN'§Ii#{ÎÚSÉÈr2™-šÁ$ÚÉÏYäÌާýir9Vþ½N—YK/“;ôzÚä Ž–ÛÂÈýÑ L§92òÇæI%ö257¶>E^˶?É\)ä5ä'âL’ÙŽ¡Ò¢+o« “;hxÃØbr<–ÌÓhm#eúI[vOW"•Ády5y9ˆô“>Lzòu5àÞQ¼‡ŒÜpi¤­Y±ÿËeôËE­‘Úï—ôˆ¤¨¤Ã’|Pjam½ªÿ‘ü0þc÷KûB½` endstream endobj 200 0 obj 1797 endobj 201 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /RBNCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 199 0 R >> endobj 202 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 28 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 201 0 R /Widths 202 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 203 0 obj << /Length 204 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 206 0 obj [ 744 549 ] endobj 60 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 205 0 R /Widths 206 0 R /FirstChar 33 /LastChar 34 >> endobj 207 0 obj << /Length 208 0 R /Length1 3476 /Filter /FlateDecode >> stream xÚÕ–TÕåÇßÏó|¿÷¢ ^Т†(wD„ʉ9 ™ÓF Cb$ˆÈÙDn¢&¹&ÊÈÜ•~YŒ9rÕ3ëÔ92לÛ´ÄÕÂå~°•537ÆZ3Ç™tÙçysëÚÎþÛ9ûÞó¼žÏçÇçù}¡Ä  y+ë*˜Šõbé•T²rãúäµKš@%zbM`u]eBÀ˜kÅߺzMcMÊ¢‹RÖÑûE¿ª¶ný¦ñª+WTøÖÔ¯¬Äýˆ.mbl]å¦@T´ºSôI¢'¯­¬[õÆäZôѧêÖ‡…‡D/}j`ݪ@Åc³ö‰~#6;;" m˜±|ôÓøïŸ‘4ˆ“˜‹ízr± =¨PèR»TØ!Þ¹x]8&i62°ÂtJ™aôá út9NˆVƒL}¥äEX*¥:´ÖIØ€Õ†«sÕØ£;Ô<Œ2LqҤ䔚¨C–Þ‡ ç+ºÅ 4èG±AùЀ =_Ñhw.b¶[ˆr<‡:M>ç­@’Ökñ{œA¶ž*´ê*‰ô°êSÝê´zS—à%uT «“îBþjd” t{Эq+ºEOD®q"þ…vî‘.ñÛT£v¹'Ô±Œ~™Øûľ[Ê…iÚ‘a$rœÇ"ù¥›v±d¹Í"Å=(qûP¦:°Ás‡Ì•øL·êB–iw›Õ1êíÒ[¼:ëIÂǯÓ<ØŽónHÏÓ§qšõE)y¯¹­ºSæ#ÞíÐͪjtNPä– è¶b¢ÌŒ_òrY‘)C:>Ó©ö07î úœŽñ¢ÚPƒjÈ3ÓªºÜ!ÙͪǓyjØ“¥{æxb¥F³ÌãáÍ-[F° 3ó¼×1Zaz²/¤S?WÊûBiòñåþŒéQ“}ÞäŠC㓎Œ—:‰îò;)dR£BNjÊ™ÿä<“1}qqiòAå]PivÁŠ1.)Ñjbû‚‚ŒÑ½\nsjܽ²c½HÈãÀ£¢\í`Foo&|§zOõΜçKõÇùk 7˜Äá³á6oìлë<éàÉ)“scŽ!©yÆ£°Ó£ƒŽŠ6ˆñFqc|ý9Ã9™˜1œ#ùLå¿Ì—çÏöÇeéFµ+\ ¯Quz0\¥öe“0¶R•àÄêc›”7γÓÁNŒràª(ß©œÞYàð@¿m0›?'vx‘é¶I%›ƒà –”ÿøÝ·ŒÏyO©(Ï#Ï^jü0/Ìääpâ%w;Þï»aYxÿ¥þ¨­» ç$jìUàT£LR©ˆŸ”_‘½•XÚÁí’e>äÉà}[μŠDiÓƒq@aÁÒÍŸ¶¤±®ª~͇wLø ÙùÿîsxÇÄÊ-…üݤ\„a”CÜ!Ô” KŒaò}r˜¼Dþ“"ÿA^$ß#/'ß%ÿF¾Cþ•$ÿBf”¢|o£Z®ïóÔ¬lpŽò[äYòä›ääò5òd?ù;ò·äoÈ_“§ÉWñ $Io¯"E´Wh{Ed¿¤ür„Öòå_½ä ¾Hùò8yŒü9cÿåçÉ£dùSò0ùò9òÇä!<‹›$®C£ÚÈËÒ¿µ¹õŸ‘õt%¿œZ“xž‘Õ#6ë1Â<±Y‹Á0Kx@î“?‚§åÈ’rO˽e„¶\{ø!c á)éÑ•ÜÚž’=¸Q4k³šíéÉH Öc„¶…DZXäý¬ó¹üÛìÄuÂïSÞKû÷Øû£´<iïyû¬fÛ³ƒï²Þä ’51è`íï°·Ý”¿M¶Û}Œoá3Â6Z$` »è½Ÿ¼}ÞKï=²“ îf™Vzw’A®é7Yfy®±yGbÛNËdKdï´àzѬlä߯ñ4³D3×mdzUæ¯_<[éÙŠ#âiÂéÕ¥Çí oÁב#6ë1B;#ÖbO«­ù5r³Ü¶ÔæQýÜÎR´l"o#7rÔòGÏuÖaÔlÕXÓZŒ¼Ë®þ­ôPÏÕpõŒ­kqµØê¹úõŒÍZ ¾Ê:µäjr¹’¼…¬ ¿L–“7Ë‹`ÏúÍÔÊçrÊ¥ä—ÈeäÉ¥ä®T åbò&²ˆü> endobj 210 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 91 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 209 0 R /Widths 210 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 211 0 obj << /Length 212 0 R /Length1 5648 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸyñ82¼fÎŒ‡œa‚(ˆV¢œAGD|1•‡(Š((ÅÇFM4ÔÚFc[%ÖäšZu8Rš¤1©Ö¤šÛ˜Ï¿ª‰¦!I­yZ9w3\£÷óþqÿ»g}{ýöÚ{í½^ûì9Ѱ8êšjša´ÓÈjéum­öC?~îõ¿ЧÌo^дþŸ»z ÑìĂūæW$¦4˜Î’¼³¡¾fÞ'ÇŠÆD5К‘ 4½[÷,É]ê~ M­+cXHò Õêâ¥u5pבLëÁÔT³²Ù”Ï“üÉö%5Mõå[v”ü-ÉbóÒå­Êð>-M!9«yY}sÿ ÛßIöD¼Ecj°)Ÿê[õ­TÜRH¥f£•ñ÷\µOû‹éF§¹þW•÷¹4òl “23œéâ‡]HKMœœd³ZâãbÍ1ƒøè¨È“Ñ ×q !Û'–TÛƒÕA]†8q¢G•Ũ¹k :h§¡’{u‚öjMÍ~¯¦Dšóÿ‡¦Ö”îh¢Ù^…žl»O´ßöŠöΚRIýg¼bÀìÓú“µþV­ÏSßá vŸ­ÁkbµÝ,ikh÷U{i»^‰ÂŽôdS¢A‚(uã Œ¯YÓ`#P5|ÁdÑë &‰^mŽsújæžRéóv8žì ޝkƒ cÜËÕuvR­¨$Ûžì…ªÿÐ=Oœ×’ ¶ZíÕTU¹š@U«6bÝA«è ZW_µý þwÏ÷ô]“Aæ,©©o/¡ÔtL ‹ÕªTó4I¥Sí´-Û¨ âÆ@Ø Í÷põ¢O©^dFˆÅbCû¢jÊ9TTÊÉR²O¬ñ‚ðp¥œ$%i‚'»×¶vŒƒ’Òë)ò©8Æa[ÆO¿wmáÌÉÍÅ Z:óà¹þ¾Y±¶àùÔÆmI/ùëéç¯Õ$ÞþX÷üí¾›»ÿÆÉþþ>)¯UwQòD W¿®:/ŜǥՉQ‰ve‰²²K„ÕaÈL²$Y-–Ì¡–¡ÖY–YÖ…–…Ö†Œ†Ìç,ÏY_²¼díµôZ-f“88“³d&‹ñÖ à -kLºNL3c ÒGŠŽd‘Zl$g²t¼ ì”?oÌÊ´$FNv™cC¬æ¨+bˆèÒqj‚\C)A…·¯Põ´ÚŽë›­¥Èª¥Èívƒ¹°ðÏZº´dµÀ삱˜¯åÄ;G ·$Æ&X¬‰Ž|m8SËaxÄ1*?»Ÿ×1³mWNA¿P5È6!¿%« ?>טS¢‹0×4üöñ²©›_èOð¹£ss£2Æã—%â¸Ú¸ÛŽÏˆÊíË4üZ´†Í)ü ѤÉÇ{o­ºƒå²vr"î|µ _ý<†þúbüúžïYõá £Á©["5‡ö­zË4-޾d ôd Ój&Ê0^Ã?‘ŒÚÎq{  ¢¸|ü¤b÷´…MõË=ÅKÏ#gÔ•Ð÷{8j>(ýíVÃV#K ±y‚bíñ!¶™ .Äž" ‚=I`±M1!¶‘`Pˆ=AÀ‡ØãÑ!¶ *ÄÖD†Ø:zA#0…ØZcˆ­!0„Ø£úû7]ˆ­& s°Š€…ØJ K@’”8AøÈïøÑîB{n àÖtÜR”ê)z3q3«¥H÷°:’6ø?«i¼ÃꉿÆjˆÖxXs‹Æ—²ùÄ¢þClí"hÚ[ £I*ŠbyxZ€Ç? q£”Пiá׿ØÂ¯káÇ´ð#[ø¢H|—~×yìÖx½Æ3¤¨~ßVÀ‹ªÊ'ôÊã$§hÜ*%ø+þõ¿'ÀWø>=ÀY°^S×ø¯ÖxƒÆ+4îÒx¬›ÅÅïÎâžÅ×fñ£²ø—1†>=yŒ”õð—{øÌ>­‡ïÌÿŽNP ’c ¢ÿ„4›6x‰Âïä*ÁÍ0Ü«R ¾«œŸËUBQ~ U&Ê^…*œAø7èÒ©òEld*~ˆš|\è$ü@v½LËχáý0üYvÍ"8+»²Þ–]CN‡áMÙ•FpRöÛ ^—ýÇeÿ¯Éþ‚—e-AHö_!8†#²g1,{Ö ¯`<ì™_'W%ÑècrU Á¹j$Á£rÕ(¡Èƒ+ Kó±u †å$ï"l!Tck†Nm~)tjóK°Q“›ÕùEبåb!ý7T×- ˜U¬“]“ÈÌÙ•Mý¹•²¿B(âq:øµÍ¦_óp*øµEËž¤öì¹BþOð¿Lö¼-E`)ä ºÊNM{¢ìÜMÚ¹Uɨ†g 7y®âP´ªd‚K3ê$U=1\‡!²k;CvM °Ë®¡©áØÂ™·È~5–x5»¯ <Úú()ì_%ßU¥ ßv]¾¡v³W=²ðW’UøÒuEøÜ5\èså Ÿ¹"…«Q8ßù²ê œ# {¢pÎ+¼çÞv^NÐyûCÕnḫVxÈa)¤C)F8èÊ~ãø /ùÕ±xá´f—»ðSZ÷Œk±Ðî o’…õtHVÐ>Ë<)B³'„»Ž K=ùBSue¡ÑIÎ9· Ήܭë 1”¢„GÈ—Yþlaº_•#£Á%pÌ¥ÞSËÃÛ²ð־ؚ÷ÖÒð6'|]Í ßosÃWÙœ#„ 9´ÝQa¼ˆð Y: …ª³²0Ú¯™á ©IÖ¥&-_Èöd ‚?R˜Þmœiü‘1ߘg|À˜atS)ÆSœÉldŠ6EšL&ƒIgb&0%„”KRºú{`0«`Щ\ÇTÎÂ?A M &ÙX;˜ØSÔ6Q{‚Új먭¥ö(µÕÔVRk£Ö®\:¢®îeíìÑs¸û([=0¸šmèmb+z+Y›Ö ª6 »'A•A|Æfig76vt‰÷>¬z€»xlÿÛ‚ûéÞÕÅÔà³¥S+ƒ¿N ‡«%5Pª~b÷²‘,Ïçíeù**{qé«PÇq™7@ješt±|Rƒ*H]ªtqC4µÍªZwg—ÏÛÝÕ¥©èwB§¦Ò©ß©©ïä"´“¤©"Á¥©¹ ‘ª MA¢Í$IÓJŠÁFU “b´Í,š=§“TüNU¥Ûí$…n§[›ÎüaÚãЦÃÓaøÃ|Nx¹#<ï y÷ÿ§§¾øÿºâHÇ¥ÍûÔ¿HÕ¢¯žZu°£þ®«µÛ»7_øï”Q][× bM}ð’Xï n½öîŽ}÷™Þ§NwˆÞnØç›VÙ½Oª÷ÊR‡öÏêHùÞ²m÷ØÚ|ÇVÙÞûl¶WݬLµU¾í>ÓÛÔérÕÖ6ÕÖ6ÕV¹T®Ùò-œZ¼ü®çÇ­­áÎýÓ°œÞõÿév¨• endstream endobj 212 0 obj 3892 endobj 213 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /RBNCJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 211 0 R >> endobj 214 0 obj [ 556 778 778 778 778 778 556 ] endobj 98 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 213 0 R /Widths 214 0 R /FirstChar 98 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 215 0 obj << /Length 216 0 R /Length1 5316 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸy^: pf< âÀ Ri<àŒ:âûÉÔQD@)Š×5j"$¨±©^Û*±&×^ƒGj†&iL«5©æÆÄÛšÏ[¿Š‰¦!i­yZ9wí3Ôèý¼ÜÿîYß^¿½ö^{¯×>{ÎÀØ(µeõ` 4ržš­¢©Ñ~ìÿzŒú=Æäªúeµ›ÿ¾¿ÀDCìô²•ÍU={gäXN`iueÙÒ» ÇDÚIaL5 8`xžä’Óªk×E¾ “Iæ6,+ë*Êà伕dSmÙºzK;Nò3$ÛW•ÕVî|~É/“,××­iÔÞ„V’/œ^¿º²¾ï–í/$ ñ6!ðxxD&jå|ÄX ÉÔ$j6á8$h—¨]ã­o¡v×X ޾sÚea$mà7zr`l…‘prsŒð"¨P„^? q蠙Ű À‹% Ò®ðW\UПC+‹„ZPHÛ £i¿d˜gÁ˵>ðA´@¡¹YЦ]Ю’µ‘d­¶ÃNL¥~tÃ\© Š`…Kø¨v„W…,M0d’ãÀS`í¼–ÀRÚñü ÞÃfm»v–"4“½K~½')‚;8›…"a?ͽ¿ÇX¤ÍÑNho“ ȧ½üð Ñ.؇áè…>ÌÆYØ¡Õh«µWÀI¶ªa3< {á§ðø3ÑÍF±:^5Š2›ˆï=Ÿ¼ù ùs.c$Àù¸ ›± ¿b~á¤V¯F{"‹Gáuø5¼ ïÁMÒŒÄd,ÂZ<Ë:„8apÀØd<¦ÉÚ òŏ5”¡pœô?€+p ¾‚¯)&¡„#0s±½„Ç™À¶±—Xë,ÂO…3†}×´?i_RVÒ!“rœK;zÀ S)fžÁÕD{)W¯Ã›T«·)c¿‡?]‡ÏЀq8ˆ, !;LÃá8‰¨˜â*ÁÕxˆèC¼É((ÆX—àvÀ°Í˜clÖ†j9ZÑP e~0e)¾ê•+¥lVC Y~¶ÁS”×68HUì‚3äÁçð7¸·áü4¢™<°R†dÌ ªŒÀ1Dy¨ <)Æ©T§y¸€Hˆ…Ñ0Þ‚rŠ¡Žbh¤{d'ì!ÚKtrùot’OÒ9:E5>KtŽè<üeõCª^Ñ_èŒõRŒ_S|‘”ã0ñŠ&éÍÇGÑCÑÍ!*Á*:õ¸'jÃýx2ÐÉê¢ï§wñ*ÑGxƒ¢¾w(îx–M4Uù1öÛD´ýˆNH;Cô• Œæ ÍÂ>áˆðsáœð Õ±ÊÐb8`ø•á=#%ãdc…±Ùø”ñÇÆãÆóƋƛ¦4S‡y§yù&Ue>Õ&|â脵ÃkPÍšXÝ©` wý86·ÌBQ­Å8ªu3e/›ÞúE¸¬lû!fQ~f,öÒ™xžîŠsßd9'–U¶L¤Ô´N‹.•=CRñ;m˶ùK‚¸ÍvB÷=E¥ìå#ö`„\$W·¬PÎav‰š¤$yå2?3KÔD%QÜYݶã””nw¡»ã8‡mc?~2<þþ©(]ïôUÂâÙ÷ò‚Ü’ì#7ƒö ݈L¾Žå¬r,´TŒ%5züHQ.FL´X¿G«‚F§U¶·|T(¹÷ÓGÊúGLNëÀ»¼œ÷NÍ÷÷õß0 ¤ßw~Ã*ÉF“DGÖ`–ˆ4$A`I&³„h‰±GN8–Í´efN¿]0ínÁtë—Ó¬w `|ÁÝÞFŽãˆFÍi¼yö΋Æêo÷.ÿ#ìÈÚ5ƒ‹ìˆ ÃVeò<˼ø 'ÿ6þ· o ¾ÿE|„#>Í–™Re©Š¯JX¿7Þb•Q’SåqrrŠ(E'GRœ sãÌ‚351ʤì¤û.Ä*”ç@Ñ•ªH(…X Ó™–}þö"òÆúå¢^r­w|ïøØü˜Øü|ä,‹`QÚàA£GÉÍI—‡šÙ˜¼1£GÅ&ă<4}˜YŽÉI–‹'bÓæ._0­¾hƈáÅ :.öýý­Ùó^Hydüδ‰:÷²„»^¸Û›mËì»u¦¯¯WÉi4\QÜ£ ÿ{ ÛõÜ’è‚/-ºxªûNó=¤¬èÙGˆ¸§ü+±æAß‹}Ï™¿¼7óχ™òÁiXC™äßZÇÂk(ÇKháj ¬DÃÌ7ðw$£®Û¿ bfú 'L)Êœ»¼¶r»¨nåR¾^´uü;ñ!Ÿ÷üb—i—™%„X«:Iб‚¸ÛAbOÄ„ØSÖÛNbÛ†ØV1Äž$b[¢Bl3Adˆm" ö%Ä6˜CìqSˆm 0†Ø¿Bl=bÍ,ÄÖ`X’”„IÒ‡>|ׇvÚóp—w¥áÎÂl è­Ä­¬œ"9È*HÖØRâŸëü‚®ñ.«$þ+#~\çaÍ:¯cUÄgP[F»Hº¶Ä–©hQ £Xž‡ñ´ÎêܬÄ7ˆçÄ_6ˆ/5ˆ›Äq ☱0ߣß%;u^©ót%*O<’'6å‰rWù˜>°Dœ¢ódVâýb_|Ó/ô‹¿8ß/¦ùÅÂAØBŸ¡">©ó-:_¯ójÏÖ¹Kç1JL†øA†x Cüq†Xž!ŽÍ_Åhút1RØ%^ë‡u‰©]b×ñ—t‚¢q  Ýø;¤ÙÔ!«¤~£–Ún‡á–ZšBð¹Zê$øL-M— ñ#(µP~ð:”â|Â?C»ËW°†qü#Öèòep¡“ðÕõ*-¿†?„á?U×B‚ ª+ƒàÕ5”à\ÞR]©gTŸàMÕ—NpJõ=Bð†êË&xUõ•„T_Á+a8¡ºW¨ª{³ôÁÍŽ’ùMji">¡–&<®–Ž!Ø –Ž• ݸÚuûcXCò~ÂB[=´éóuЦϯÂ]®%äó+°FÏÅrúoÃ×-£˜9V¨®)df±êÊ"𫾑%ªo¶T(â<ðé›ÍŸîáðé‹fªî£¤6Cu÷ÿÓúýŸªºß‘ #°²‘¯òSמ¬:öÈþªd÷WÃÝA&yÎq8(zU†K7ê$¹ž®ÃPÕµ‡À¡º&ØU×p‚”pláÌR}<–8žÝ×Ð n}}”Oö¿-•¤oJÓ¤¯Û{¤¯¨Ýîæ‡@•þæ ¡S,ýÕÕ#}æ%õºFJŸº"¥ënYºÔö*÷.’†=AºèŠ‘Þ÷ÅJï8{¤ÓtÞ~Sz@:å*—Þ r\ P‰–:\9Ò˾ÒQßJéç>>'ý„Öì÷í‘~Hëžu­”Zœáñ-J’´™ÉZÚgµ;Yªw‡pÿI©Î+ÕfSW•jœäÜIi…sTí YÈÝŠ¶C%JzŒ|YèË’æù¸)™M.I`.~O­ _l«ÃwXCøb«ßZuá;lqøºZ¾ß–„¯²Å'&I“²i»“ÒßPéûdé¨*pgU)ß§›íñ¤hçIË•²Ü’ä‹”æuš˜¿gÎ5ç˜1§›æs²9Þk±ZZX"-‹Éb°0 XâCÚU%ÿÄ›¬LÎ Œsþ)aha0¥ÐÆZÀž¦¶ÚVj[¨m¢¶‘Újë©­£ÖD­E»z‚¯îf-lC—5ÜÝÀÖ÷®gÛû{ÛÙºþÞ:Ö¤÷B„Ü&aç¡¶-ˆÏÚ5·}4&¢ç!,ÐÏ3¿{lÿÛ‚‡éÞ×Å”àŠç”ÿ=ÅÅ;ZŠ¿88œ"v³1,Çëéf¹ü%ݸšñÎæã¸Úã'µ©º´³\RƒR¤& …v®íÂP]mWëlk÷z:ÛÛuã>hÓUÚŒût•£á\d€vR8š)\ºšËÉÕèPèzX m¦(ºVb4Öp-¬IŒÖ7¤Ûs:IÅçä*™NRètfêÓþ›v;ôéšðtMØ~7Ÿ^îÏ;h>óÿÓSYô]q¢õêŽÃü? {+©‚­Mô/fS¹ÝÞ¹ãjÿ·z ¼¢šcYeðª\é î=öÎÖÙ>̧[eO'öÎ-é<¬TzÔV¥Uÿgpbú¡©»°µãž­©‡²Ù!¾ÙTnkúî‡LïæÓÓ¹­ÝÜÖnnkº2]·å]>§hÍ}Ïǧa ½ëÿ ùgà endstream endobj 216 0 obj 3609 endobj 217 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 17 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 215 0 R >> endobj 218 0 obj [ 556 ] endobj 18 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 217 0 R /Widths 218 0 R /FirstChar 98 /LastChar 98 /Encoding /MacRomanEncoding >> endobj 219 0 obj << /Length 220 0 R /Length1 6348 /Filter /FlateDecode >> stream xÚ­X TE¶¾UÝ==ÌÐ3üÌð3ô =à ð3ÀLH D‚$B $$ƒ$Kþ M04gvý‰‰F×·OŸ?Át0/;œÍž&&q£®¾]ï-ºž(êz×]ÃÌ»ÝC¢¾³ûÎî9¯{ª¾ºuoݺuoUuÕ€Ø x;{;ú ~5ç0uul´½õÞ–}$€«XÕ·º÷ÆSb M#¯^·eÕÆM?ÙeúöžîŽ®?î÷žv`û¢¬0œŠ©@:ˆ´£§wãæx  ýÒñëÖwv0ó9Ò_)VôvlîÓVÓG¾‚´íÖŽÞîñ]ûÇŒ©H;ûÖoØþ˜HûÎîëïîûí×›x¤Ñ~ÖPÆ£ŒH-ˆÍàš©ùGªæÌßá²ÜFôÄHæ–@Ó Éáw1}ŠéO¡eáW9¡gÂÿÅ(ÿb&E;<÷Ã˰¶cùNB&dÁ<ìë)h€V˜$^ô>…‡a7Ê}¨…[ÈGØÇ³Ð¯£œü°±¾ °}Ô ì¿Ã{P 7Á8gàÔ M°&èhøM˜Áò+– P“Š vÁÞð!ÈrÔ´î"Ùž‚6|{Ñ®ŸÁ¿ÀoÃoâ¸xˆRm,CÉÅØÓ¢#iÄK†Ð»О€ÑÄØ)ïN|÷Àcð$<3ì0¼ˆ=ŸÆ¾_‡7á}ìÿ3øm˜‚Kð-\i´"†ø&T|$½VQm$‹É$;ÈN²‹ìE’£ä8y =YK[hÝN÷Ðèô-úý”~NÿÌè+cGŸakÙeì!ÎÀÝÌmãvp‡5EÓ—BÅ¡C+B¡óa>lg…ÂÛÆƒÕ¯TOj!Ì aDÜÕ…°ßFœim°:aÜ‚±ÙŒÞ܇þ|Gø4Â8ý çÒk8º70êïÃ'8²?Ãw0 !\ü,ú9 çsÉÇÕ√ÉÒB–“äf²ŠôÛÈV² Ç8‚ï^ò3åãä09BN‘‹äùÃËÑj¤6š‘©¥KðíÀyÐK·ÑÝôçôz€>FŸ¤ÿFez”žEo|ACL4c`œL1¾~f!³ˆé`ncö2¿dždžeÎ1˜)æ 3ÍL³…l {=»½Ÿ}™}߯8#—ËÍá–p]Ü-Ü­Ü0÷7ÊqïsßiŠ42/ñMüü~? Â+°WÚŸðïlÃsô<õÃGðz`'ƒkgyÙe0»O*ý+}¼†3«:ÉaHĽŽrõ`ÅdaöẆð0MaºªÆ}y¡áw˜4Ô¾6ü·c8Œ+Þ„+â<|ÊêÈ"Ü?nf qþvá΂_oþ¬¼\ON¶;ëºLW†Ó!¥Ûmbš55%9ÉbNLˆ3…Xƒ>&:J§å5ËPÙ~i^»MÎh—Ù iþü…–:°¢ãí² «æýXF¶µ«b¶KzQrÕÿ’ôF$½×$‰`+ƒ²œl›_²Éç}’-H–-nÁò½>©Õ&O©åµÌf¨„ »[Øü–ŸM&í6¿Ù¼uÒò=yµä¿g†ù12eêœ×Ñ=<]32?B¶+TÇ=HÕß`Ct¨µE&C¨Ø¦˜«˜D·äWjÚ×ÚdT-õ ¯mGŸ'ËдÅ>–œìã‡Íonn‘ìreŠÔÚáK=ÃM[žOòÚ’~ÌÉÉ· ε£ËÆsªrªœk· Fð;#õožŒVå&>B¬oºæ5¢"-ÀQȶNÐ"áPæ(Y÷bø´tÂYWÓ>,”*>圂d¾ Fiêó×tÌÔhœÂePŠJ°¯Mä_-Ën·œ•…1Çøtc˜Ð´ µbvNö€œ"õ 69]èÇŽÖÒ\ô»Ý®„l$è…•HÈ;·Dh¬Lo®»U¦í çäUNÂ…³ã*çZóv gãQõ” k3®ýb…Ä8O©Lÿv·Êª¬w„gå«WíÕ±¼8Ÿ’ ÍòÆ1 Dix?$-eüÛª “u`q —ʦËaÞ0]•eÂ4’˜ÍÊ“Œv£ Sœ¦(ø])7篧ƒÌé+s@=½­Ç]…ǾRáQo Ÿ:ϼ4z©yî~óæWRµ^ýö[bFbhL®9]gŠÂ‚·Ð«}®Óq1z­NÇgŠ3qµ,E!Ùš¢3™l&.Îfb9ÖšÉ ,kJ³æžs e$×]æ.ðœ[p{•l¹$ \ȵ\jK.ŸN¶ÌÊ#mÅEø’t 3®â 7!^“ŸhN°o»ÉY‘D®ûü¡ni [³ÌÁ-ìMFqººuÓ²³/gKjòdnhŒ«]Ñv…³'»Ìeø%U}þ”9Œ{o.©õ¾ïpŽÔB¡0•‹K­7·™·¦ouÜ~·ã õ€ý@úÇ!ë!û¡ôCŽãÖãöãéǯ'ž1Ÿ±œµžµŸM?ë8ã|;ëm÷ÇY»ÿ"ÙtIMµæä¸=–ô¤‚ó\à æÆJKJ’d‰5‹fj6&JfméÉä%m½žÄê-™’CÌñ¤…Ô"9fÅ¡Éäb=)8D*ð¤Ö¬‹Y“› Qb±+Z­š•+äâæ}NŒ&s TNUº•¹Qi4—ìæÆÒl Rz†ËC\<“J¼”)h.YkÕmÖÐïþûîZ²©n0teOJ³'^'z;«²|%ær{Ûrö„ΨË6Q;ËÑä¨+KÇö:,1Lz:ÛòaèÔY)µ ?YWµÉsϾÐ}j|á‹ÌÛÌÝà%FïSœ+­2Óå,-‰/ºnmù~×Ó®q××+sïz«ä¹±l9[áJ-*›]^[Ù½´|SÚnÓ} ÑÑEºb I,g½.[fm¦5;š”ÛMÑ룤èúØ‚ü4+1iJÆ’ØL¯Ëž¹ ³:­ ?_4¥YÓ*&¯W4¡%ʼn±¼#ä¨ÉŽöY»¬»¬ŒÕ‘æK[™¶+M«­¶¦ iiÕQxߪž_•;p΢,ÀE³=—÷„À œn;Ýf¹Æ©«1œ˜ØmÀ(ÎqWÐ9K²>%êjÉe!ù´pTvy2²ófE"§†FÂ……Áª$‰fZA¾r4ÐðŒà+ÈÇháZÃpÍ.,*¾Ú‚×ðÂ;Gy{^ŒÙPUl{^C‡¶6ú³måQÚl”AHö5X›òšêÓ+9v0Š7[ëûkü³Ë«éÚEö8«¡éQQ¼‹åBMÇozÜh_j)L ÙcݺXKyWòúœësæ3 ä“Ì‚h‹´gqßOüHøÛp+žƒ{ñ„~ØÛ•HZ2ÖdlÎx(ƒs8ÝÙ®W³$wj’!†g:Öçðd‹©<Ë $i29N»H\q:WÒ~GÜV{‰˜!»Nº.¸—8/'[1ÚMP /N,É€s=¹ï}súÒÔ:*ñ)˜n³” —¦ð§:¹ÝïÞÍmŸP—™I]B‘’…x¦>áÎ(›˜ý›(â•NYèDtgA¾âi)Ý•‘K¿ÕîÅ›×’i¯Þ$z­™QQ~n²h÷HEíBT¼ÏnÅï ý.ovJ]ê3kÓí—oŽ-»LˆV¥OŽ·å*†§Â­øÂÓ(è®Ýæ•! „-„~:¤MÖ¥á{pÞåØ?„§Ø °ž¹RY'cÅ[ à 8Hž¢&OÕÅá­Sk1Q¼Ñ ÀJBš¨½˜fzÔ(çß…5‹kêªÝÍkz»7ä,ØØ±nMçÌá?aê†î¿yòæ0ãÝo6/ÐGH ^¨EúÀXc‰¤÷{݈M€§Œ. £ý£#ô`ÿÁ:*Ž–ÒƒâÁR:jm¤miž/-‚td¬VŒÒa„¸ ½Á¤{ŒAºAÒ»bƒtÁ¤»ôAº?Ÿw"Déø Ý  ÒŸ"hƒtÒíš ½ ÒmlnE`‚t ³Ï› H¼±ˆ„Ðår§õVÅÓrr+ôž¬Uó›Ôü5WsAÍÙ£}úõ}úª(òèAúU5ïTó8¯¡Gÿe~²Gÿjþ?zô/’h@†UÍ9o|ƒþ|ƒ^nÐ7èËôù ú¬EÕ×P‡üI5·«yš×\§ÿ¦Nÿvþ:ýh¾³N_X§wÖéƒä?½Æ!ýûCú§‡ôCziHoÂÚçŽÆÖÇ‚î8Þ“êQÁ…±Ælñr l8J‘üzÌv\¬J"'¡”UègpDA q"†fŸ—V©okœ-ÉŠ±Ær„åcË–5®@hk\‰]Üj“æ1Û¤Xe$M`SU.šé¢F¨‚ ŸEœ?&®ÆÖ¾±š•b•ŽTA*V=/ELU ¯Ò“„5Æ ˜¾þ¨x^œ* ’¥câEÔã?n²dLüФÏz£Å\“â¹ÆûijAŠÕ/7cõ˜ø’ ›ŸŸr©5O¸T%#bØ‚Z„#Òdª*ïÏ ’ÇÄŸ»Î‹ƒJ—¨};*Øšy^¼µFí»7«3±5rWeNŠ+Å;Ä&—Úþz›Ê]جö½ ô¼X›©êŸ‡&c¢ßv^¬ÎT;öŠ*£2BGÔE¨QÕ6kD­ÌŒ$‡˜Ý¬ÚîF3ÞXÑ!ö‹öšÕâQ'êÇÉN<È ·„<Ævð |à>°–,åóùÀ>àáé| ך´‚Ö ÑFiµZ–ÕR\ñÁðGÞ,ew‰× hX%gÕ²@•œF¶8J´êª,t´t¦»0íÂt'¦˜1ÝŽi+¦Í˜0 ‡?z^i=N‡éíG…Hñvºu¦r+½k¦tÝÇê7ÊðLî•5{ðz"“½)2^~ö¶Z*-•¦ cÉ<ßßÈÚgr÷÷åŸnàþáCê·¼„Óô t½H^Ró#Çxñu^<Ä«õ7 @@¨E ð:˜°Xåëoh‘Ÿ±¶ÊùJ!lm­—=Ê=vœVÒr¿oœV(ÐÚ2ÐJ“RøZQl™*†»v%ŠA©(FžQCcžQÅ:#b6Z¡ˆ5*€btØT1ݤŠM*bGúKý¾#¥¥ª{úU‘~öÄDF~,2¢ŠŒÌˆ¤¨".ŠÔ¸‘#é.8âJWÙŽïÙͶ'Âö¨ìâïÙ™vm„]‹l÷ÿãÓ]ýÏHû×ÜPˆÇ‹z;ãcdT-óÒßÓ±aæÁ"ÀÿMvJ endstream endobj 220 0 obj 4566 endobj 221 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -82 768 682 ] /FontName /LCQCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 219 0 R >> endobj 222 0 obj [ 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 611 389 ] endobj 96 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Italic /FontDescriptor 221 0 R /Widths 222 0 R /FirstChar 84 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 223 0 obj << /Length 224 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 226 0 obj [ 744 549 ] endobj 76 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 225 0 R /Widths 226 0 R /FirstChar 33 /LastChar 34 >> endobj 227 0 obj << /Length 228 0 R /Length1 6688 /Filter /FlateDecode >> stream xÚ­8 tו÷½™ÑH¶%>–dÙÒHÛ–¿`üòål°c0›ÄÄÆ à8Äü‚KމM8nC>%%m¶M7œ ›Ê¥4lÃ&P ͧIÛœæ³['Í’8mzHú –öÎÈÐv÷´çì<½{ß}÷¾ûî»÷¾7ó’`0êÞÜÕðöœÇÚÙ=°Õóú¯w<@r¸Êu}ë7¯|á]¡ÙÀÈë7íX÷½%R5@B´·§kío¿Y] `:ƒã‹{±ÃðBR€IÈèݼu»£žE:iǦ-Ý]š»Ù6¤+6lîÚÞ§­¥ßBú:¤=·tmîùá¾ï¾ˆ4Ι}[nÛ >¸ˆô!¤óúú{ú~þ‡m<Ò§qþUØG@Y²" ,CÜ™³=×>þ±‡Q!«BŽÛŠ œÜr°0›Á { ë‡X?®ŠE¹"È>ûO½ß™­ñÇ OÂ!ø l‡Ýؾ "à‡l¨GýC3´Ã ¡ç)< Ã(÷98 n&ïáOA/¼Œr™†Á†ýkaÇgA-ÊþüJàØÇà,¼‰ºs –Ãi:{ á!x…ü€ebc¨)Ša3샃±£ AÔ´î&¹-6 X6£]_‡ŸÇ^Ãuñ ÚX’Kq¦cDGÜ$D†Ð³ОhÁ™VàˆãDKbý8ÊE‚jXmh÷.8‡Ñ²à-²šneÆcu±“±Ÿ)¹€ã³ÐŠ2ŒÐ臭8Øy“ðg²‚b±Gc“±—b¿ScÅ D„&ÔÛëá êàŠ oa™‚HY@ªI "‘—Èë4Ìä2ÃÌ+pbìO†žñáj²ÑêX€vß7AÎ|/|ÆÑÆ‹ð9q RDêÈ£ÔEçÐut =MÇ2ì(;»¨ZB1Z^ ×aYŽ~Û#hÑ܇±{-{NÁ9ŒÌ»0 †Ë„#<Ñ?ÉGí‹Ð¾_’w¨Ú¨Dkè»L€©d¶°¯²S\8z0ú‡X[¬=vkì®þœKY¹â§`5Z¼×>€ÑÄØ)e/–ýðmø><ö üg>ƒs¿ ¯ÁÛ8ÿGð1Ú0 —àOpfЊ$"`I&iX2I.z­£ÚB–’2Hö½d9ˆ6!ÇÉ òSôdm£t7ÝOD_¥¯Ó_ÓéÇôŒŽq1^ôñY¶]Åå ÜMÜ.n÷Œ¦xæR´$º2º::½ãc†Xvl ¶;öH,‚Qý½êI-ÁF$€Q½ciÁLë€5Ð ëàfŒÍvôæƒèχq…OÀQŒÓ0—~Š«{£þ6|€+û#|3ÅÏ¢ŸS0Ÿ³É\\Q®hYNÚÈd5¹‰¬#½äV²“ìÂ5Žb9H¾Ž«|”¡Q&‘10™L –0s³˜ébne2ße¾Ï<Åœg^a¦™ËÌ 3ñeìv{ˆý û–ßs&.Ÿ+å–sk¹›¹[¸î~nœ›àÞæ¾Ðkd^â[ù»øýüƒü8</Â7q§}õ9 Éð>ÃÓô Ã{ðz`/-ŽSHž†vœÆÓ'þ…>@~Š™ÕÝä°áYG¹&pau0⾆Øo°Nc½­ÁsyÑ“±77jß{“Ûƒ1ÁoÆq>dud1ž71E˜¿kñd)Í-,ÈÏËÍ dÏñû²23¤t¯Gt»ÒR)»-Ùj1›£AŸ”˜ ÓòŽe(œ°Tß鑳:e6KZ¸0W¡¥.ìèúJG§ìÁ®úkedO§*æ¹V2„’ëþJ2— ]•$‚§*rs2ešYßÕ3R®]';ªëRM×{P'jo“É*ö(æ*¦ÇÑ#…•žÎY'ÕH½#;ÑçÎZwx'œÎÐd _laÏȲ6É+W¥Jí]uiǬ0ÒºãÙ”'åZNnΤcp]6™[[­à^Ç`ÿvo¼ÿµS‰ªÜé÷7µ^õQ ‘á*dO· h“p)¥ è)…‘îRç 6ȺÚΡ\ñ)—)Hž‘ÏÃ(M|mO×l&Sø ”¦ì« ƒü+m9³³1æŸ šV©vÌÏÍS¥>Á#§¢« ýØÕ^ž~÷z•FB° yÏÒ¶8í5©Ê´Ë´S᜺ÂI^®pö\á\Þ)a6W?~’emÖÕŸQ°Y½å2±ýì•TÙï ¿y”·^MHÇòaà4aJ"4;daHÐða)ZÊ„9¶]$›À.UÌT,FØ­Þ¾"q…}¿îý1û‹iÚþ1ïÍI£I4)B7OLl4'`#TÒ>æÕé¸$½V§³°À™-f®å(8]©Z‹Ùì1s™åX—ŸXÖ•àv埿êŽWx. òò j¦¢J;£­P•X”<óeIèeL4)žvüoBK\f.é£Á–·´'ðí`³ Îú•mþb†=L£R{¾¾ °þabhé.¨Käì¬FwyïW .±TØ£^k¦Ñd ¤Þàè-X>7_o7ÐF­I—b0ü¢oÉËìI½Y0±JLÒb2Ïàw@>i½jÍÈ2ÒŠ„¢4Î’Ödï°ïLß™qOú=G\‡½‡ÓguõM?šqÂuÂ{"ýDÆË¶³ö³Žs®sÞséç2Îf¾‘ýFàýì÷–<:‰¤¥¹rsyŽYœ—*&„ù†Yœo”2©)’ÃhíÔn²Ivméõó’¶IOŒz‡_ÊsóÒLBZ.‘2 &Ah5ç Æ¼T<ÒD3*ÈK5 ¬]»&ß b‰/Qí*,0 ùø!¢›(!»æŠ*<®DzX‹6ÌFº ÊQaÆs"j<-⎟q$œ´»Okq´í•&fÁ­˜ófÃ9?žvæ+‡ gžÍÁTðåϤ‘eæ-+ÛèÒm×Ð/þë;²­q0zyäöÚæˆ¡îêìº2{ÐÛq#{RgÒ嘩—7rÔ™pyÅÄÁ G“žÎ¶½}áÎìÔ†äÛ7UoË;°².zßÕ=÷s„ˆ)ô8çsWù}™åeÖâ9ƒßô=á›ôõ½¸àW¾×ËÞ\`dƒl¥/­¸b~°¡ª=qEp›{Ø|_rbb±®ÄAlA6äóøü®œDôš·$H‰MÆysÝ.bÖ”e˜ÊŒþÏë_ä¯qÏ›;W4»]î*“9ÍhGY‰Íȇ0Bµ9‰u®µ®}.Æ•á®s¯qïs³î†—[p»kˆ5 «óÎ;”] ¸Mwçã«æ´À œé8Óá¸Æé«»õ¯¶«3ˆR Ÿu5‚ä3ÁyF8³»Ù…ñH©ûP݆¬*b³Çw®ýš­û·;GðêÎÍ·ñÞ‚$»¡ºÄó¬†ílëÏñ´{Ùƒà¬kvµ´6¥Wqì`ow5õ׆çkèÆÅ^‹ËËÐô„ÞÇrÑÖ75ùÅŽ+86{ ßæøeº«ÿŠ(ÿæ@Zˆ~7zTëÔ¥±{¿rwа¿‰M3÷Æ>eoƒ-x2d2÷Bš‚•ÿx`ï´Qú óf\*ƺ+Ë\þCòÒD•0ÏάQî+ZZkkË6lî¹-wÑÖ®Mºgÿ‰}еzþîmFƒ5ïñMxg\ ð#ú-’ Òû'ZÊÄ= ÓŒñôÈ¢ñEt¼|”é?2JÇÅñrzDГ*¼A…׫ЪBA…ìñ>ý–>}uùô"ý’ »Uh zõ¿ëÕOõê_êÕÿG¯þǤš‘áR!²6ë/4ëåfýH³¾¢Y?·YŸÝ¬¨ú4"J…^ºCöFýçú7õ¯6êÇõÝú¢F}f£>B~2 éßÒ?1¤ÏÒKCz×ö>}ÜØdÝ ¼6¡‚W&ZrÄ‘Àƒ«É¿OxNˆÕ)䔳 ýãY< ¢ŠŸƒZ’‰øX¦â§À§Uú;'Z拲z¢%ˆèƉ–UˆVM´¬FÔ>Ѳ§X -êež)±ÚDZÁ£ª\<;E3ŒR_‡ø)Ä 'Äõ8ºn¢vX­#ÕP«ŠUâÌ+§)†WëIò¬Ó¬…¬ _\¼ N—GÈŠ ñ"êÉœß_aÉ„ø®/BŸ %Šïø¦Äó-÷‰çZ"»² »'Äç}8ä9ñiññqŸÚó˜OUr$.ö-OD‹è¸ôý~Uå!„~Nü†ï‚8¨L‰Úw£‚þ â-µêÜ›ãh½G#wJ\#Þ)¶úÔñK<*÷ºeêÜ‹Ê/ˆ ~U=š@žÞ b_8$ªŒª8UW[§æ‰ª¶ÂQµ3?¾’\\bÎ2Õöš™2Šb¿è­]/.u¢nìÙ‹Œ12*ãǾÍíáÇnãÇnæÇ6òc+ø±…üX)?–Ç¥ócnÞª5k¼$i´Z­FËj)î k$ö^([9a¬AAõ#†UÛU Q”h)4V;èhé~¬wc݇õ.¬{°b½ëN¬Û±`‰½÷¬2z’ŽÐ;Ž ñætçlçNz÷lënº}¶µ¨-ÜÄÏ*s"žhˆØLî•5ûñÚ'“ƒ©2^*¶;l¶*G•¹ÒTV_÷w@ç, |ù8þé¯>¤©eÇ󘦟 ëEò¼ =Ç‹/óâQ^•hºÆT1U`L{™›p¸äš®o“ŸtµËs•FÌÕÞ$ç)ÿLÒ* ×MÒJµ·MÂ;´*ܪôÃ;uí(¶JÃS» Å \A(FžQCcžTźãbZ©ˆµ(Åè6ð¨bºM›RÄŽõ—‡ëŽ•—«"ìIèWEúÙ“_½VdTIUE|>©õ)"ÇÒ}(pÌ—®²3¾d/‹³óâì<•]ò%Ûg7ÄÙ Èü?>=5ÿŒtxÃõ56¨ªr¨w>IÖH52/ýo:n›}° ð?-žX endstream endobj 228 0 obj 4796 endobj 229 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /VPRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 227 0 R >> endobj 230 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 500 611 611 444 611 611 500 ] endobj 73 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Italic /FontDescriptor 229 0 R /Widths 230 0 R /FirstChar 74 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 231 0 obj << /Length 232 0 R /Length1 5056 /Filter /FlateDecode >> stream xÚ­7}\W¶çޙɄ'!@>Œ (…D¤ µb¢¨E´ZžZEl«E¬OW[Û­¶ênÛíZW‡€þ‚Úê¶öÙnío}»ëÖµ_vÕÚ_]ö«jwkɼ3Úú~þñþxsrïù¼çœ{î;7@ º€©¹Í· âÁ‹’³ØÆ6w¬´ì.*ŠDú_l‚e Û6|óâg §>²zÓþðÇüÔ;[[|ó¯9‹®£C=ŽÉkEAx+Û¼„ü˜Ö¶•«âFÑ>äç#ŸøH{³©`g!ß…¼¡Í·j™~ý9òÛ‘·,õµµÔlßtyY¿¬}ÅJe7ìBþÈ;—=Ú²¬ó}ûÐGu>êŒt0q„¢„j2Ú‡:àVå*! ›™y¢”ËØ±},A=ê‚o*dT/ýj£Á¢°C"¬ƒÐ×:ø r!#\&…È÷Ã9ø¦ÁCp*à 2z`:äCyÆßAxàex G¬†v´-ƒŸ€GSÞFY¼¸!@=zy~ªœ†}ðÜTö+_ƒ 6¢ÅyåÏàÀÕzç”)ès1,#Yt¥ò4b¼à|Fb•BˆñPnX­ÐKá)Ô½ çá#’ˆ³É'Æ)ƒÙ°vÂó Ñ8‚p³:'ð ?_À ÜsßcB´:˜±N’O H!æYJÜd*©$3H®ÏlRO|d1YG:ÉSdÂKd?Σa€'sä#„+ä/ßRŽòÔLmÔN%Z‰0ÁG›i+]DÛèV„×èaÚO 0…LãC™SÌyæ#æsæßl»’}œý5{–½È^aÿÉÞâ œ“{›¥3ëòuºWt}üþWüEðcÁqøñÓ «é.útÒ)øž½‡§Õoh9®Ä:ÒG^ÁJ½Šûv<Â'BB(ÂXCRí)clÉV‹8:)qTB¼9.6Æe4DFáa¡!z^DZ %鱕y-²Ý+³v[yy–ÊÛ|(ðýHà•-(*»×F¶x53˽–Z.ø_–Ò°¥t×’,P•iñØ,ò‡n›%@ª©Gz«ÛÖ`‘5ºJ£·k´€´ÕŠ,s«Û"¯Å#—u´öx¼nt7 ΡY™¸1°aªcJ}ëZ͈T œ`s{äx›[Ó1)ß|¹º¦Þãeµ6deʤ´ÙÖ$ƒ­DŽÌ®Ž³ im=ÆÎÊ\¤æ[ÂçÛæo HÐäU)ßÃõ2ãk©WaÌãln9nÍUóìÊóÌ”2M)óµô”ai¶”³^•ó=ƒ\åL º¥êe²±a8 -÷áY´Ø<ªÄ»Ø"‡ØJl­=‹½Xs¨­÷'H ›ÏÝ Cu½?^Š×˜¬Ìsçd+e «8«XÅ“­æÎa|íÉaùïN…iv§/!®¬½[¢F²MÅ4eK³ùNT»–‰ÐÓ<Íði 8ËErH©·Ç0 GÉ\ŠÁfé¹ ¸P¶Á¿Ü+ñHt)†› ’êrÞݨ¡ñŒ²âWìyüŽ1x>”öS2•ÓÈ,)X~*¡;•ahBˆŽŸJ ^rÝZVkÎȘ~£ j¨`ºáVA•a¨Š † 7°ËqºŒVc*6+׸ýWùÝ‘óñ÷)ÚW·1¸“¶s­`”.°Œ fÙp1 ÑÑqq ì!}¹1>*:@Âú¬Oªº1ÝÓâþŠŠ¢òó‰1*¼ox?Ç7!NÇ댆¸¨8ÞžJçºEï÷¬Î®¹”ðø¶A¦‘ðû›¬]«Üüþ—Á ;­“’$²´|ò0Ÿ)˜ *$K%‘^‡?&,’ÔŒºèXÌÉTv(2>&VË©jÖpN7†îÍ). ZJ0()ñ©yòŒ†Tš:!6.ÊH§L¯œñÔìÉÑ/NéœT󇄗»ÿ›4out¶•'Y[s4ñ(!;­õþà_ƒ1·‚Ÿ[xúFcnö÷XÂP=C@½aƒ™íÕ]Fôi!ÞsÚºj$³¡µƒšG’«Ìw¹îd—ã$sYÌ«äŽ·Ûød{îø<׸ØrkG]´wjTh騲I%Eó«ÙÓò:ÇFèù ãÓ¦5×c.Ÿ(_‘“ø»Í 0º~,Þ±®úÏ‘Àwƒæ8Ù;ÎM:]Rêp”;Í**q8J±ö¢”A¦—óâ×w4ì’’ëáWMÌ»ðG¸ Lärù3M¯Û7š‹Ø+Ðî¨Õ÷YB»”ïµˆŽ³7 ·¡h°ã•®–&BR¸Ýœb²ëSí†Ö.Ä…æÄÐ\Â'!ÅE"‘ $»Qº\±ËÀGëFž dù\˜;&Ê8>•Ú’]Œ).Ö¥î<µ&§Ú† y.ºn©µðÀ"k²$_^ßRøXðÒ»ë»ç<®¤à'1盟ˆà×Ïþórw›üw†ÎÈÁ#}'I9¡Ç†Ô}‡wH&…k„Xh—â;L›LÔnÊ3Ñð¡&ý¥dæßMü%›é’ KýÑM¦é”ŒB8CY} §çÃÍX{ʈóHx¸g>AV•¼JæÂÈ{‰/äÈRáÒWÝüžÜÌÈÀ½‰‹1šbãb¬¹¸ Œ¸’u|nŠ‹6‘ÚeCgWW˜ÓfŽ!íá\r{ZÕX6q´.ï!æeç¸$Câq¹7ÃÁ_úb^dÁMBôjàöê»8*¸O”VdCîØ«XAí²<<È¿«¹óðÜ°ÒЈ-¯âO`{/âQØ.«ÿ Î’(¼u£fm4óÐé*Ä ©(úŠ  Œh£Fbè÷ìšÒŠ’ŒºEm-+²jÛÛ|KGîû ´@ Üïá±…á„H<¯¢Á$E†ü¶ŽDÖ‘¢sédo‘ŠrC8µÞ¢õ­r[ SEÛy²]Gþ^<ƒ²(þe°?EÕ2Q@Fê$ÕãÉ{©ÃHQØKÕ¦Rë1½õTÅz؆ô6¤»(‡X™µ£¤%í(iG ó«Æó43S£ÎÐ8'rEÈ95ÎÑÈ94N¤z?ÑKÇÈUREjDŠo/Oà…® š@$9þM3Ä·Èk`lÓú'¤‹ð™E¸h¶Y„õá-²ªQñˆÖ)¢Z¸P-”V EÕ¤já8™Œ÷N0’)Mx3M¤ ¿HÖ¦ iBVŽîÅ¿Bù…Ö?+Y*„o+„÷*„*„š aA…`­š…1‰Â¨D|/:FîˆÜ !HöovlGÙ;‡X ßq‰™yb€lö×e"zÒ_÷†XC6@:KpF]NU¼Ü^Mœ^Eœšþ?üŽt¶Â_ø2¢åþÂ+XŽ%­)û]WP:Ñ_×(‡׈ÏqàÖ«8Ë_¸Õcý™ŠÅF’ Ù$ÅcÀ¥©màÒÌ“G°Î_gGs®UÒ„øÅ`w€’£âmG­x+;À¢äfv@è‹ô}Ã/~ê@$ʼn;Å?Vˆ§ÑÃ;uWÄ“ŽGÄc™Ú€_ºO¨Þáu¼¥¿(…‰¯:vН86‹?+ÔÔû\š¿]uz.…GÅÍèfE6~øýâ£.5B˜¸=.ά›Qü¢)fgNg:Ž‹5ŽGÅѦº5Tî8¦MçI(N‹Iâ…Š“Ý8¿˜¯÷‹ã‡ƒËÖ¦—S8MÌÀé±Gűu9b2†$R–øàB~ÿ ?Ïå¼OáGóI¼I¥7è#ôáúP½^¯Ó³zÜ·zS@¹$e¨¯¹IgP‘ŽU{V£ FþÏãËH‰žâÖ e£L¶Æv™‹¢ ùeîûtÞ‘>ã~O’¼«rf½| ©A§JRC¥œ«^$È5rÕã _ª¨y+¹æ©ÕäVwCƒ¹RžV] _zP±ïéªòKà} *åYšHG‘{êT„~h¤«~pËæif›‡ÍèÍÜ*RÍ®€C3sÐ+šÙ‡ªYowºÇÝ›ž®™pÙЭ™tsÙª |8s'u÷:šU¨LœZÞÎPYs”¤9r¹Ð¤Ð¥šôŽs¡A¯kœ¦vü ÎV׫k5õœÔÙÃê}Ãê}¨ÎøzZJþov}svoØ£Þì½6O 6¯¼¥ÿ¼t5Y,½v\ùíÞ¦æVûZäݶ·¼Áæ¶ôÎÙsõU=Çæî…=žºúÞ=R‹Û?Gš£ý!èÛ´u¹çžX›ïÆZ¾õ>ζªÎ–«±6yî£ö¨êMj,Ë£ÆÚ$mÒb©só,šY²â>ÏÊÇk\±¢þŽN  endstream endobj 232 0 obj 3648 endobj 233 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 8 -179 699 676 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 231 0 R >> endobj 234 0 obj [ 333 333 722 722 250 722 250 722 500 500 ] endobj 59 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 233 0 R /Widths 234 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 235 0 obj << /Length 236 0 R /Length1 40856 /Filter /FlateDecode >> stream xÚŒ¼ |TÕÙ|ιÛìsgßgîÍd–d’™I22! aH”°L ‹€‚’DDA)q+TR뮬.ïkX h5ú¢­ •¶Öª­5õE«Õ´´Ek ™ùžsg@}ûý¾ß—›{ιçnç<Ëÿyžs΄BÔ‡¤¬¸|Y7óo¶jÞ¤ûФT½=Bø^„„WWu¯¾ü/߃¶ !îÎÕë6­º*~õR„L§úþÈšK–­üË?gßÐmoÃýõk ÂVa€òí8._sù†kþú3£ŽÓp|jÝú˾xùÄJ„vJp¼ùòe×tóûÄÇáøA8–®Xvù%Æÿt8~Ž+»×_¹{†ßÇŸÂñýݽ—tŸl¸ó„nBÈlƒ:Œhhx4LŸ–”j¾ù#ÐWúÇ"®‚Ž! Ò"ÒÃ]FdBf$"Ëwî°ÂnCvä@N䂲[­õ /ò!? ¨GABúÏ?ö2Få(‚¢(†â¨U¢ªBÕ(‰R(jP-ªC”Eõhj@9ÔˆÆs·…g£ì~æNx*üö“°šŸU8Ë­Eáüe…†öú¿J;‚wÜvûNáô2P`z MBmèN4½…žÞmÂo@ÏÃh Ú‹"8Ô˜†\˜C÷¡÷ÐŨ}ŒF ­èØ Ï™Šº¡Ï¹Âg¶¢[ Gà*jAÿŽâux´¿Í U8oÞYêÄ Ç ïÂÑÑǸ¼°Í€Ò'@ÏÚŠ~”¼ ½^8K¥-Gãëðg@¡.´ƒÍ°ý…µh<:„~ƒ[¡4mâÞÕBëஇ± >,ü ½Àbt <ét ´x?&I¦…Û”¢ è´ Î^‹ÞÃ6\Ã(…Xará>¨}ý$È«ŒíH ™h)º =ÔxD_b=Îâã§`û%þ ÷.´­]…6ƒNü¨÷8zÁ5¸†¸ˆ ¨åþ͇s;Ñ£ðþènÅx¿Ä<Ê¥óÍ{ÁQøS¡<^-Ü^‚wœÆi¸ÞÀ”1Ø »«»z¸=ˆN _B;þtÿ}+aû#ù>ÙZXXØ[øÚ¢¹j@¢Åh=Úˆ®F?®¾ŒŽ¡¿á3D W¾Å¾ÂmæNîÚFÑdhû\¸z<{pi?‚íè¥KЋ|¾¯Æ;ñÝx¿‡ß#<‘Iù33ȼÁüž­ç¸B#<É©Ês-Dk€ßjßýÝ‹^A¯aŽâjèÑ;pÿWd<™ÛÃä-òæff'{–ûA~$ÿyþL¡4k ÈÝ" æ“@…¿b'´¡_†¯Äÿ - #2a&ËLbÚ™ææNæçÌ/Ø^ö)ö}n&·Œ{JX–¿"ÿËBká&U»yhW t'š²­iZ í놭]‡®Gýèv—;ÐôôûEôú ú}@X†6_ o¿¤îf|;l÷á§ñKøüþ#þŠn¤ ¶8©'ͤ…L#«ÉͰÝINwȧŒŸYÁleú`ÛÅfÞc˲®¶Üîqþ !.Ì–kÞ<;:V9Ö1ö‡<Ê{óKòwç_Êÿ©° ° ÚQµþ:´ ZyÈࣰ= ’x½ ˜û[µ­Çs ñni¨®5ãéx&lsð…°Í‡m!^ Û2¼¯m+îÃ7àñMø6|—ºÝ }{?Ãö,> Ûoð‡øügüwBL扑ÉAO[Èt2—\Ûj²¶nÒK6‡'Èòcc"L5³Œéaîcþ›y™y›ùKØ*6Å6± ØÕìì[ì/ÙwÙ3\ˆ›Ê­ávq/ó>>ÃÏç/ãïåŸá?åÏ ¼Ð&,®Þ š ÕϠ߇¾ƒ”)þ-|%gg¯!‚^¸™nnžãI;³Ž¹ù· Ÿb$ü>îg.eÖf¦‘¯™õxy—1!®‘Y…nEüù#9MþÄ:p;ù ÇÙâgÉz¦…P¬GܯY{#öƒü5’-x˜¼ÂÜÈÜXø)jävá¹]ä—HbGˆ }Z½€µC¿ —’h›áΠKîOp×½'’[p%ó6» }Ì„É?ð)|7 Æq<‹-'ß#9ü î¢Q܃ºñ]HÁÏáðÂx/ó8žM À­AbÄãÀ@gdü6£C´8J¸œ"ó™çùLc@‰_¡Í˜ÁisythÀ$˜6Ðä׸,Ó=€÷§óÏSÄæÞåv€œ=ÄT¡‹ÀÎt’7À²ÜHó1èäÀ꼥ɽèºB^ ¸?ð“ !|Ja= ¥ Ú¶ì…“”‚¥G_þ¿¨ßŠÿ‚®ÆhÖ0гôÌ­ìT@¦.Àß°­Dpô ºƒ?ÄýÍÅ`7Y)¿ ¤ü÷è{`sþÞïEMоÅè!¶ Z-2÷Àæg ¶ 70A[ ÍAÏÛØ€¼w.ƒ^ 6j6ØÄ×Ð¥…{P ðî¢Â…hiá¡ÂÅh5šWØ ø»±°,ê6®ƒ,àl0ö5| ìÑïðÀíè}À£v£?ÃößÐþ‰Üs¨Ÿý-`gsáÖÂoÀÚÇÁrß83 Ðërô Û fÕå/ û Ó˜n°P¢ BX‡ÖÖò>8Àž>äÙEÊäùíJóÄ Mãs ãê³™ºÚšt*Y]•¨¬ˆÇ¢‘òp™,…‚¿Ïëq»œv›Õ"šMFƒ^§Õ<Ç2£ª©ái]Ò`´k†g̨¦ÇáeP±ì[]ƒTMûî5ƒR—z™ôÝ+¸rÕÿ¹R)^©œ¿‹Rjª®’¦†¥ÁãSÂÒ^|á"(ß6%Ü! Žªå9jy@-¡,Ëpƒ4Õ½fŠ4ˆ»¤©ƒÓ6®éŸÚ5·O¯k ·\¢«®Bûtz(ê¡4è wïî‰X-×ÔÆ}iŒÐ¨AoxÊÔAOx mÁ ™ºlå`Û…‹¦NñÉrGuÕ nY^>ˆÂ“Í õÔ¢¾foÔ×H—ÒÞ Ò¾ªáþ[‡D´¼+aX^¹ìâEƒÌ²úKÞ;eеù¤û›Cx¸µeѶoŸõ1ýSÝ—Jô°¿›4¸çÂEß>+Ó´£ž1H"Óºú§Á‹o¶Î“à]äæŽEƒøfx¡DûAûTìÝ%á©´¦ë2iPž^ÓY0ÆÛ?ˆ.Ú$ï÷z•#…ä*õ·/ ˃;pDz)þ}vÔѦEò|÷LuÕ>ÑR$ë>“¹T0¿]¸äü9µ¤^NK­§+¦- Ïq”VHÐ’EaèSM.i@ý+à2øëÀp×àJàÇ¥ƒÚ–®~±êEzÿ ÃRÿ—øýâ»5ËJ5|DüÑ"•’ó‚çÏ•‰ÁÊJ* B pÚ8Q=ÎVWm"ƒánQ‚ ȇڀ¶Ë:S@|Y¦ìÝ1¤ åp0Øwá¢â±„–ûö#%•è$]ôÌð¹3ŽùôLß¹3çoï ƒT#Ç &zþß,:mS×4bçÿÇéKŠç[ç…[/\¼HšÚßU¢mkûwŽŠçΟ+•pñ|¥f†Aô.Z¼ˆVÀ?™žzi× P5hã ­eã#Åñ1ê£@~/>ÿdz°È@ŸÅFxUþW `µKÓŮŴC'Ëÿ?o*œ¢w©Ù7·•ú4ؘøîñøï§y†~ÌFIkûâþ~ÝwÎM°ê¦õwõ/*ô-Kb¸ÿ³ˆYÔß=µëû‡ Gwø§ÝÚXƒA´ šL•±¥}ѷɬÊnG5"”sl hÎ>‚Ÿ#/€o)÷#Ž"/dN …Cy4<÷"œ‡¸W -^‹¿‡Ü ñ«¦±¦ ÄÓMsÆšP3”ųԤe‹l‰@‚Ájž•˜á³ ‡Î€G1¬ú¯íùYä:ˆíl¨Q ßmyÜB~`Øn!º{µt/D-é´{Mem<æûìíߣ¯ékjá£Í£5`Åq'vDcQ’Ñ8χÝ$äº{.x×~uí® dï¬-ùõ‘Ù«~ˆû߯õ¸pEå”/òw¿òÎ3ýßmHB¨mÈ)ål¥fÇÀË-Ð8'Z4@âÓ¼Â3|ŸcÑ#ÿÙÜiË:]N«CDB¶¾ÞšÍÄ’$yï%;Ì¿õÏkwÏ‘=­×q++[WÝ‘¿ú7ù×óøŠÈÔÏñÚW~3ØÿØý*®È?…ïE?‡hjžë ®cNFëêòœð0ZŒ–5k¬è°U1èÙF³#äès0Ž!\©èCæ¥fbö¸„fõ;çŒuŽB«NZsØbuåhÛp mІË>\Ífêëj;Åê­ è#V{MckýäÕ;óOU•íl³µvmc]Í´+—®Þ§:`hî#‹ ÞcP³"®/°²~+~Aƒ ƒˆˆÛ·ð|óHe¡>¶}1¥ÔX'¥SjRÚ˜„MvÈó7v†¸î)>û‡…“x=øFz”PüHáõŒ¢U³Z¥9»T‹wkŸÑí͆Ë6Ó§õô&´5éˆÚƒbo0J)“’ÉI“^VÓdJ¡£³ Ÿ2Ïrk±õÑýË4`°ùýç ™ÑèÂfŪõ¢¨%J´+º':e£ZmZ ÁåVi÷€Nx"GqºZ¢ïèbgÏWsFK¬oÙ¤ÌÆåáò²rˆÁ!%¼ñû¾ ámQsDu{\Âˬe9 ñÞåØn‚’Ó¥r,-Ç> $Vѱyt$àÓ¤RÝ++¯·e¬ã€_.§ÅN ¿±è8Ñ嬫­Wo–™Jfݺaq׃×=p˯—¿|ýåǦæzê7“éò\Eã”ìŒ Ùõ)ž{ѤݯäŸù"ø®_úgþÓ}w-ë}ç>}àÊ´ñL÷lwí”·‡—×cððFÆC8œ[‡]°±Æ!h†V«Ø Í}Z¬bêƒÈywzðnÏ3â9ÊÔán;€‰!8„oSŒˆÿh®m©m½m«µ aA±)Ð)/’©Obº¤=‘<Ïá®±¢Ø—B»•ì$/’·È‡ä¯DC<¡£쟗è“ME™îœsºsTÁnëìijëÙÇS‹ñìN-~Qû–– ÎžŽÄI +*g¬¹‹—Üâ¹Íç;LMÛDnË1Ó1ÐõžÞNàˆ1J`FÎ"”Í«x!\_„‰ ×Ö×cžZzvœi×+wG#ž·xôƒô¬Çþ5/_·pšsù3<ßûÄõ]ÕsäÕ·V¯þÉ¡ü©±¦šbèùàg-ž}é #û 9íPaXi2ä&i§ê¦é[ËØ·´¸¢¢¡BÉteÞÊŒdþ©POÒn oN>Y~¤ühòµä‡á#¿Kþ¹ì³ˆa¦¦bßz Ñ9yàD§‡˜Ì!†Ø9„w (‰T&0„[ˆÆŠøsx ²#-ù_Eß< *€“ Ø0„ ¾º¯š Tï©&ÕPh©°ú>D>VtJïÉ gH¢Ì‰Ï*¶mÄæ©£óéy©Üíì9M““`c|£½Í££Ö\ªˆBõÉT0ª3³|™–ËåˆÌò\Äê^Rlõr4CIÖÇ–c6ɧ—ã1@ñFl*N¢òzøSu¬õ$¶zu€ON•YrÉp¸@ù(þdUô‰†ÃT)g…5ûnzxáä£[úºïȾ}EJöx-׸"•«î {C‰»/æîžq}×kØYÛïºlîâ;wÕ¾vðú½Sb* ×Ìëw­›ÛÚˆO ê¾wÓÜÕ[+ŽNK ¯G€¿:dD¿UâN#6£©FÅÌ(f\iÀ@3ZŽÇ¬AoD¬ÁÈò#è•_± » h4 +ð ±ñ9ü x6z¼[1r˜×jx^ñûž £Á«½Vkfðnæ†0CøŸŠ7« fÆ]€X#fÆÌ+<¦oiQO“Ê£&P!(~"R¨9—ÁꉣâXo“%gQUf[2ÁnÑ¢ÙlL릧;–°EÎâ:È0säð£c/“«®x4_ŽOßž¿¯êcn8{+yhliÑf.™ßÄÍF2*-°ØÚ¼4¸•ÛÊo ÜÊÞ²$+ÏgæK åµþÜ&ÿ6Òïí÷?ÌìÕî „Í(ŒÍ¢Åjs8]»‘0 %–E’íÃJ²×çg7ËAíî’$ÛŽš¸›TÅ!ò‘,ƒ3wOD><ýPŸ°‡Ê2þd9Œ•pW˜„AIþuX${d,Ó‡(ZI÷ˆDô”ÅwáÏTšì¨;)}Tñ> Àe°ªªPòS¤Ù¦I&8 ¢E°QŒ½¸—ôJ7àÈ ¨CÁ°\tE¿–]o]ìæº\g8?‚,°TŠyþ[¾OI€A~c˜ÙtA~MÖ>pó›.¼rÓæõɰ7–jsÕ¾];.³Üì'ÇvÝ2´öp_lܼZB”3û¶^û›Æj˜©|.^ìùt£8:«T^¥Ý¨»Útƒö½Ègžgðf3»Ùy³‹mÒÄyŽ {âž‘–j°ðã°ÅѨ\¦Û¸G]”f#â*”GŠUïE•J%Q*»*÷TŽT²•ž"ÝᲉ6É–¶)¶Û›`óT|㨜GðdÉSQá@¨Ú9Ú dÄßÐò ž÷ñD%!`H•?¢µüA?á-c4¢ Jˆ¾åH6A©\]ŽýVi9*3@‚Îy*8TØÀ#œÃvê©X2Öòú:Ì;ìç)€¹û¦Ç^[>ðÃo®¾îÍË^¸›¿^;ö¦uú´º™ ·ß²%º[1ÎýÉ϶¯|òÖ'/>€‡ñŒü¢±)Ûæuýqrê‘{Ÿú·¤êÁìÂIæQÐ=zéb #l¾‰ÜPaDI@Á£ÁS©Œc—qñuüy¿KFŒ@T¬ÇȨ±ìþ‘âeˆaË9ez–ûóñѨeßwxë=î(ù1äOб"«°mì–cŸ'Ÿ C‰ò428©‚öijGâh¢¹i—Ll3m9V_ínwÏ–Dìd/PoŸï†H_´¿î ÷£ÞÇ# ½ÏFŸ‹½¢{Eÿ[£S@:̉Ws]Þˆ1bjÅ·â7›ž@¦ñ¨·¢V<3¾/‰]\wº _JVG/‹­©»_ÛXu]ÝNv'×'ôin°Ü`Ýißé¼—½[s§ånëÎÇ¢ÿû¯º!ö°æ3ýŸ Ÿ™>‹}V[!µ±F”à µÜ 2xc¬šˆ.Õ+ç¹jšÙŒIZ@w-H?ÝÓP‘E”U²DÉve÷dG²l6ü<œ`@*Ati—âp1.Oæ(þK \¨£~Z–Ñ“§‹¾:zL#"ôÚD*Xfq²GDæÂà˜ å¸Ê^¹%­`ËX0•Aê˜'œÕËQÊR]÷’¼S;I§‡ò-úM8%8]Ř$Fë"õ%y§ÒoãiV²šxûCo>ñÈÏ×=5˜›ýþ¾—Ö-Ø„k®Q6®ZÕ—­©Ÿ×vÛåënˆN'OÝ´gÁM/îï½kí-¬êÙùƦeW.Þ÷κ-s/½zãÜÌšTþOÓíºþÍ gä.ºta/È„ ŰA©»6ö÷Û²÷bìv·E³Y{µáã&ÛÕÒÍ6V³³‚Œ×p1·ssL0Â";ŠW 7VÆÚÀ¾:)ÚTd}§†>Ãb÷9® šEI úýeÑné¶`:Qa"¯)´ E¨H¸!|H1hD3ãp:5­Æ?„ÿ­hÍpyÔ¤X†HúÀÜ ‘/“¤˜ÚL§LŒéqim¿*ïXç¨ÛK%Q§ÒÓà:5m3ý£m¦¤;± b¯„‰£XþÏt›¸åX“ÐÿªÃ”8÷‡{ÁS’¨ ¬®W?×ábŒ­é óÄØ?..¿ðñ.ñ7"·QÜhß&Þk»ÏñšïµÀÛ¢Æm±ÚAFpàmÞ[‚$®áC>^IÈg”Ã.ÙŠ›LFâ‰;HãoškÅE¶*VÎ:TøÃaJEëÌ0ÕÒ‰ÍYˆ ¤0îÓ¸ƒ Ë.Þf#ó]³™¦ôR8<Q$óyµ’÷ÒJ~WÙ²‰¦9cj Ö¢7ñ•Ê–¢Å€Ý’ËÑ¡!à‚ß4;Ĉ=4û`¯’€%´ûlžç@Õ÷žº,%°:|¬,±V‡!n èŽ,"‚`6\· ÜéÍ©#qœÆ^zú¥üU¿ÛºàS\›ÿÅ©ÅWFÆÉW2ë¶JU‘þü ¿ÎüÂÛËýxvaž(Æh•±æu¸^iV²«ýWûH?á~:ý\z$«Yàéæ»…­š­Ú>¾Oة٩Ֆ‡|¹,ò%ä°F¡$ÑÈ&SHëÓ”˜2­dBB¼Oð‹>‚À¯:ôh"‰ªE:´@~­ÈUU ªG¾Oýþ€Fû´FÃ?ÝLÇ sžõ‰Ò¦>kcòéªD¨:·®ó>-bèc|óÚ²Ýàh1Y$ªÌU¾ˆ*³Ä²H¹Ê¬rµ²\eVù®ÌȼM5^”Q*·@o:GOwž†uŽ6©ãJâ€XåUè+Ò4ÖD¼8ú¿LàR^ëëÄ™j„Äê@ƒLÇýêÔ‘ÏquŒ¬rðR}‚~WnˆeøHÄd²^4?ÿŽoøäÊ5鉓âWù®ß \Ö:m%dƒaG£Æ'B>—\Æ[iMçãM!ŸSC¾¨NTÅuË`60ÀUÂQã$Ny‰Å¢BøX"þ4ªÀ¨" X7ø]<ð\¿¨:r‡”$2©¼4©l3©¼4•*/je@åe`Wò?ï4è]Ø¡ÕSþý¥ó<ûTWMõÔ%þˉ=tp#-”iÀÆ$ ‡-àk¼Õ9äoTðá<~øŸóç#›:åŸFT•®;šnººˆó7cØ;õ’Ë€mŸ·®ÏgçΊä¬–=Vw$R#mfÖËùw–vÄ)¿f€ÍylNw*í:vZ’xbÞ8Ý¢‡HõJ}Wý5šnw·çšÊ÷€gÐ=èÑW§6ê·éw}ÒÛVß]+û_ìH=k`~ ®gfh€/î”Y)×ÂÕ P­>qY«ÒRs•Ëí.ããUŒ)^¦Å‰PÐ@)T‰ä)‘!ö°´Y¬Älk%?·Z VÖÊRnXDOTAtˆ|­èuMmQlކ¢$:T8¥ˆô1Q‘žÎÌ®ì/ñ @4-•PY¥rí¤êBR.‰çìU )3RB5‘x¬"VcxC´ ]ûž ¯:þ_}9?|W4‚oYÕ,G£™ÈåùeÏþôŸùŸKº+á:UW!%×Ð5£è%e½¬â©¬PºÉJ<ë‘—YVÖkB>"—¹C>«\æ ù°Ö†|9lµ€ÂiÜB9çÑP’{Xz«§LÛ­éÓŒh˜‚§5mš. ³T3¬9¡a4,½L£j‘f¨ðõAz/òJ@…òeR·Ü'ÈLZn“»dfX>!“e¿þÏTuæ÷Š:§*ZB…BšFþS]J”-ª¹fì¹’–T¥Ódjͼ¨´'‘Ž|G/hùìj¹ˆg€gÏ$4¨øD¶%$a¥l!YM®&ýÒ}ÒÒɀˆðíJieý|rq¹Ì9Îg™P¦ ùD9,…$”F bПü‘øÃ„Ñ §ñ:2DŽ))çÿ›Ñ×ju*øèÔZJ6Ý.yYç7àS”ãÓ§Õ) €“ÔØEpoäÎÅÈßµâŽ(_$ˆj%êÙ»å g>©[q¨f|Õº…’h¨½qŃß_ƒ¯ò‘i³–šð®T6}z^ÈaO^¥Ò¥ !þï@—4~MùÔìÆ&¤q™<Ƹ¹Â\ɦë=ÝÍ8Ó1w4Íðn.ír1 TGãQ£+çÎz²éæÚ¹µkÐf´Ñ½É³!ݶ»oN߇îI?K𤋮}Óõš{¸ö÷®÷Ü'jG]vÿÙ3Rûú·ëŸéÈ <Ó5-µw¸¤.s]ãyÕýJú÷;éݧMæO+—I!ŸW.K†|q¹Œ„|9,ªÖEùbàÍP!lGn·›Æ.Ó){ÚíJ§ÜàŸCÛ]^ÇE´ Bét,®I/­ò¤’e’$ï‘e*Å#2/ïRjq-&ôFÑ,™-d¾yW*ÞÀMº(`õh¡É’Kå¥j £†2°Ñhÿü`/änµà.zÍ4ÝèéƒBy})ÑnhÆÅD̹ݖœ[´æÆs Nrå\i{®8õ¤î¸uÊ˜ÊÆw-…(Œ¿¥Kß:™ic§}‘¶t>ž_ÐnjÁÜø$îK-ß0Ò–N/ ;Ǿd¯:»qK¨2ÉH½ÌÆÅñ@,ræw¬zx¶ÿü‰þ3;@¶ þ 6i6Šá—”Ö~+¶îÄÍÍî$Ø 8Fªm ¶kl÷’I¶²2+ðL'—Ï|rCù¶S¾†­V &¤ÌZf·ZË@G¢˜cOcV‹‰Ï«±j•ë<‹EÓ¢"2âPaä ˜…ÓU¿ ªË.^¦.{–*0Á!6;}„C–Óex¸ —©:[¦¡2jŽtôÖ2O|ÙOÎémgÕÜóÞ:T@ùuB¤ÈëÑÑm¥1}pr*‹º8uö¶,RâZ«ÇZ›QÎ:Ͳ.E‹­ëÑeÖÍÖðø9|Èúþ7¶þ•`j{:x= G)ì=´6:dà46ƒýô0•âÏÑâþRæS³Ãž ;-¾«˜­9«Óš#¢vOÎuûõ9x̉böõ!{Ž(–:,—r*U¨“¡Ê|ÃÿWÊT·Ô‡»™ Tbð»T–ÊÏÞà‹ÎÁ¢‚4~ÂøÀxnöY1•3ÛÙ)gz^pž™ZeÓªqõg®Æ€|hŸRsu¯ð„î ‘½o¶á[¶EcŒ#Æçµî¦“bbDFbÒŒÂpÌÌå°·9+” XšD­¤%fmHK´3ý¥°—†WsÄžÄWÅ8ëÜ*‡Z죫¼Q[Ôd°T#vWc»%'%Qg¬Æ‰Uã¨F.ÖQ¾M®Äõ Â`] ¸’i:®žÆ}u)ƒÕ"‚;Š5øÆüæüçùOó7þþžbûí—xñ_ۯÿ>ÿvþü|;nÂ-omoþùüÁ·àJ< _üÔ-”6€ÙlBµ÷Uøš#( ]ýQc6•¼Ê½Á·Á]¼;y—_Øä~¶ühüw¾ßùß/ç=11æ"¹Øøx:¹8vi¬;Ù—Ô¿Š°×_áoõÿÖó;·7Ž_/Ïõ~ù{±w㟗ó~%ˆkLLËpÈ'Èa€Z‡F©ª2oÏ ƒ›+8*!Bv ±"¯èM{o·—óÎL–âb”ÄJr0Iv'‡“'’L² «F«æ«F—™Mª¾•¼vÕFšvU'‡ðÕdê¦'.øÏø¸sN ¨C”©þ̧f£E§Žª¦è„qÎZ´¢4f.¯pùÝ‘x´Â­Ãå~HbžÊ:ñõMÌ<³}“"€ÂãÙ² 4XBXõQ¢8Þ n`'­üOŒ¥ÊQë, \Æœ¥‰ :aŒñGçdÆžm÷Æ;ü«ßý¼¦wRö¢Àš{fÜÔ^×F®Í_ÕÝÚÀ¬£¥Öý›;aš®Ó=Ô·èžÖâWN}…?²èEY¨x¬wUa36=ƒÌlUp‰¹x.ÑZ‡ð4åD}C½—ñ±KÝK=K½K}ä hMÆs¿½„Â`² ¦„¡ÒÄFµjƇñx7ñ&§£bX –e0Eqt‡1eyÑB>´`ÉòŒåC c"Ûž =Lˆtu \ÚÄ/&ÿš,€Ð*Ó³Jò-8`PRJ¦A”ÙäóxÊáiØ]æïLôôž¦‹JzÇzs©DUT‰,MFÒQLµ÷è|¬¢–:±Øåâ‡ò´`‹GõUÚ:Ta¦âjƒDHá®ÚP‡ô†ªDLá5›**#V`MŠ¯Ã¨´¨É¹ùpz;ÁØhWèWW‹+lgG'íA=ÅidƒÞmαis®v dX _‹s® )Íó´Xê‚äÜ„ryôÜ2 â0OE¬O_¼æ–ÄÄÏ^ØÑú×çÇgBÿãõ„HÄ»èк-?×Ë?ò£Ù#ÿµnSƒË+ëëÛö|oë…ëZ·¬ºüÎ ïÿPË5Sø—wü°ë¦Åµ«ª‚ÿ³áÖö;~õ„RE~"àÞ Š{SãÅdq`qp-^KÖÖ5)¹Yž+ßËÝãÛË=æÔg//Þ,‡w…ˆhÖÈCdX±A¼Š—©Ùj†Çµ¡gèô'‰+^VE'­ DZ´e.g(¤pf¢w  \ÜdƒGI9 _(zŠ]NµœðôÒÊÎâÑéN QÁÂð~}–>`¿Þœ'NŠM¥Ê¤è³°Ÿ;õ‰ ccMtœá5:òJ}ºbÜ-+| v¨-ÆØØ‡ÌQ½-´ºýE°·©±—¨ñ}xi<3KˆŠÜìüËíåãΜ>ghYƒÉ¶îb<±HW}a„ÛtMâ 4¸•©LZ™(Ws¥ÝéÏÄùF~6¿ÉÌF‘Xm¸665<5öhL¨ˆåb¤-½A­ùþØ‹±¯£|“©m†B>\V©F›¶Ï-‡Áõ†p“DâFm%ø`;Hé…OTM-PVPOLÔj5Š!§QÀˆkÒæiÅb·C€©3hx5ؤN]1U[:¥9+¦qwzOz0=’fÓ!Ie§¤²SRÙ)•Y­[mx½ ÛT›c3Ñs¶ =gó¤Nãßuž‹ÌèúÕÃKt~®©k JÃ`dZ/Ü´oœÔ7*Çuº6‰ðæH,Rn’ª‘h‰*ª±^'‹‘j×G¨Ï€Ue-.+À ¨‡ª-þ&âåUCãò@XÕÁ’Éa~‰GêÚŽ GßüÃ'ii*ij2íåžÀìknþÕ¹X$Òê{ÿÍ?>tÿ _ë– "‘lyïØ¾¹oöÎÚpè]Øüõ¿æ§±ÖüýÜJàf21ÅˆÌ ªç^ÍNŸýeSqIˆ¤œ•Yë™Øp~Z;õIfF™íÌ3¨M`f–æÞ¤fu¢Y¡,pø„dD£×“ù• d¨£~µÞj%óëœô8þƒ*u”×Ê–:õÚºœ æBµêTHZ¸%Y‡‚lEU:cP´ðPƒÐÔ§ C…·• ½È``·º±[­u«W¸ÅHPhªbQ ù0|ÊÀã©1: ûvâ8NÁ ŸÃÃ$ÇÄ·Ó¡ Ÿ²^ïï¯#ÖyõØ*…r}Í{µ‡uŒ5aÝ‚¶ÔýíÐïÈò«³QlîkfµþÙÜl~ª4µlv£Ò¼= Ñ™ •ÍÄ­º™ú™ÙÖq-3',Ô¯Ö߬½Iw“ÞÜî¼ÑIBÍK›I—¦eš’Õ™ç°Ü_Caø°6gˆësÕ§mÌŠ†6Q é20’šm4°†&7uò+ô¹¹î¥îõn&åÞê&îï‡DL{œnRšt»›.Ï«Î݆˜iŠ…Õ'‡«quWÕ †L8Àϯ{¯¦_.Ó7šr(ŠôE"¬9!}éE‘çH p-”s áÕJЗÊÕŠ)' mBŸÀˆ>%`:ÉÞ2±åŠ¢™ìéíMÐ5 P#êÇ–dÂfÔ|zìd§8ÚÓ<Ú v4aÉÑk‰TqMÉ~ÆñPGqâ¼4g>=;Þælãê¯Õè4„—ˤ2Âgõ9ðÀ6?²ÚÌ!£—…Çs9?jÐd$œÍè­~ÑMe4òM~¤æSÓYÒËÊJºP÷bˆÆÁd‚½\´¿ÙŠéb«êãy°z 9²_T³Ã¦Ü8 úNã/ÍF½>ç–ô9ì~*í^}N¬§¹räZȵçã®stuDέåW_?®¸öw¸ìç×wÑ!1‡:[@ç*\Xàžâ 2ý¶òú K¯ V¼ñÅÂyÍ‘(IE#©ÁÝ›/ï·ê\fÑàhê^Uӈ署;eAÃì›.·xn¸¬¥fÊ5 Ê·¯*+«jLÖfª T„&'nοvãx»`lj¸{Êpg“§ª+7C]£G g '™#ÜíȉÊñ¯Šº¿/ÈQ©6svr«á³Û@!žªº ­R TÓ ôz#½Þ`p»K´¶!æ#@|E —ÙÈÑêå"¨>Uó‰¢S¥jê‰añUPÛš´¯´ô( `àp½‡Þä¸hѹO~¾›Pù¥Íùú =†Â_ž¥UC4bQ!T˜–Ž—Þw¼ø•OÙ$Fñ#üaþðçËE[ŒõRô*f#ûfûó”F˜.àF=fœd Ú§¸]ÄúœH”ñù–Ô„¸Žtq}Ü3Ã}np"ä.7Dc›±Û8`dû 42È(%cŠÃÆFÁúÿlSÖØy¹µ4oKGQÅ1ª:c½Eo³·ÙâÊ©+ÉUåˆ{$F/D%&(a¯ÎíG·Þà×ÀQˆ•%ìÑûü(Àû¤Òr’’=ƒP¨«£Þ½ø›•n ]Å€&©³Xœç—º <óý·ýê';žj{tYrû+MØV]wynɼ2›“¯Žüí—§ïêkld=8Ã+†»Çâc¿¯­ûù‹ƒ?õÙÁ™24 쇌¿Ü¯añ9 B¼ß™2U­ïŒ˜µB—Ü-ºBâ•'þ·ÚÀ;€Â뇩M Ô0òà‰Îæc£ª §«5öYÕÛ++«3(L¹ç2.äˆßÖÎÎãæñíÂ"ß"¿°šÛÈõ¡>ù ïé„4‚>æ´ãðt¼À=ß¿4Üåîòot÷úû­·Û,îÇð#ä™ðüþ™ð3Ïgš“þ?K§±›'³¬ ­;B;¤¾ð©°`‘ðó…$ÁÈ@D!8 rÑ%÷ÉÉ¢,©æÝòÀ·FOÉFyUàCó~æŒh…¶±çh¦4XsÐI½üfÈ€çvˆ!%ª£Ó]¨  A4ŒF–Vôä•Þ½¤Í‹w{±wë)#^ä‹üp|KYËòÃb(C×tööŒõtžìQÅ*‘híQÁû¤µ¤bºy+̘®—ÝhhhÀ êB$:U’HPˆD¢;çä;lËq¢˜ÃÔ )6ïs¥±L}’Í ºÚsKËJŸ|¨PèÆÌм{ミb|pÛ×TZôáðÄ•.|hûò ÆeðŇþó¾‹M;çDSQÇÆPpÖò‡9ӒܤŽ'M)œ„¸ùvpö«IkIº¢)u®¤‚w«b¥)Š˜*nH 8UÈrê%Õñ¤%©Ž§¤^ µ_+E¯ÒMïüG™P€k:ѲRðmŠÖ^¥E€uUUŒêuPìJÁŽK^Æàc «â ~Æ9»È w!IÏ0ôVw+® „ôð½SE1'K! Zh§¹ÄšÍzF’RÉ õµsü|žO%U\;ž(Â[bøx"AãƒÎÎãÍ£€mq GP ÿéÓ3)ª$“ÉLWê:ö:®ŸíK=“N Jª/EPÊYéHÌçækÚw  K©qºéºº{ÙÇ+÷¤„áÔ©‘$$ÉGAÞ!ÀP¦6Is¥ïI«të¤ÍÒn´[zR8"¼Z©jl1Ã$kÐ6ň9'ùƒ)!¸MÏV9Tª…ªpUUˆÑ‡^6HÔɰ:ºœ}ÎgœLÈ9à$ÎÏ+Úx¬Ä“š?;=Ë·$[¶–¼ø9£c½LÑ?:»Ò ]€U„Dâ7@é&XM,ÕTH(ÁB"®äª¤s«Z蚊*ãt÷ÒuE`¡‹ÆØ Æ8û 6M²‹ g-4˜.I1ùYK߬»G¾þŸMs#½ #¶T›e§¯ZŸ?•ä›V¤M]2¸nÉêiμò ž>牫Py惇¦û-áž×ð»Sºss×üüõߪ2M×Ïc‘˜-%™Žkœ`ó fBdR³Ò¸#­ L'¯B"ýÔ¿0¬â%-(:RŽÞ±tõ¡ë0Ò»aá:*¼£Þ…ן¥úÀÖèõ*8P?Z¥AS§*Ø`’SLJ¿1ÈGÚÄœ›?SQ|cqÕG9bQ„AAB—@—Û³ÂìOØý,C_%@ר.F©@Ûí¡ ô“¡· ø´·™œ´Êd ¿kÆÇOPKÞy¬³3Q[\ ‚Oí¹ÇºÔÝééB]öwÎ#ùÁYó眊?¢­ÒµÌÊhBÔL„T!‹gÔêy•ÉŒ÷hÙ¾ç\êZì^â0£å­ÆÀ9fòÛÉ­ü6C¿xsàaò”ûímòžù}ñ4ùc³v ]šnèÝvíKÂÏͧ°v‚ñ&Âh©¦ð )³êµÓÈtíÜP;i×.'½d»m»ç>Û#ÚGtCšCÚAÝÏȟȈá´Î®9!`$œHÍ)í€hƒ/laí(ítЦڬ9ëRÇVÇnLJÖáðýšÅ,ô·çXê¨Úhö®2Ú£4¾Ø‡)G„75θ/gvâõέÎNÆyÚnï£Á’ÖìÔ|¨aD¢žh5#^ó¤ÉÁ¢íT®˜*Åš6ѵ} 2‰&ÉÄœ2am‰hij ¶”¼æŒõP×¥‡~K2 Þ¾º´—ŠT¢×,{½<îýÌöt'˜õCOÔÐ@W\´,:È#LHO‡"¨“½ê‰oÓ‡s¥:g„]C­N<'3Šû}Å#_ñ\éHW<Ò´ê‘bÒæ¢'ç‘,9£¤NàÄw|õŽŽï*­m+Z1+µb9Z7{¯\¹mñÍÕ!Çë÷>úùßßÿêØ6¼—=+êçÝHÆ¿¹aÊkìÛÿˆñ{Ÿcá'•7(׃O4!f3w+JMI»#ժŪV¨á©V£k_‹&kLX£Ž¥[ÖV¬TAMVUõ‹ƒê<5PZ°J:My$èBÈ\a¾ýVž®t‡›Š£E³4L]êcâ«t;¦ÎÌ—ù2«÷ ¸U Tðåð$MVóT±ê[«ÍxWѫڨÖÃñûªm2UW3BÐ^üxqþŧLÜ!Ýç¸/ÊLa¦fxnfn6p÷³8U½Uà„ÝšÝÚ]â.Ë`µVä§–V.M¿Æt0¨¹£  CŒF …ƒ»ƒ/IÐRqáD„ÀéÊ «…×:|_t`'„½Cä«ý¸21„EůÀV³E¼ÃlÆåTXtueÔ¼±±˜77óò5Wœ~93`ÂTÄ—šºMæ&Þä©:ÊðŒP. åœQ:jBë&È>é<Ù«Žï55õ65A|›*ÍQX#1»3qD#θÅìå~\²;ÔØÐµ”à(}kø…³u––zSK¤:Mÿ9êø1dâ¼±*â“=û÷/:Ôs颯LÐU7+Š&ÿÌì±ÇúʪÊËãS–“Å3š¶¿pÕ”ê†`V¾Üf«YýÎäôû‹ ùiÌïÀ/f¢æå«³ížè}õ ª—•çTÉ'ù‹vHló¸¹KÖ»*Ú½„~3q£ë&÷ÎlÿħîlýÁÜ»\w¹ï›;ÄẺ_˼Ö:¼äÄ’‘%§–ø¼’£NÌÚëCK¸Ç5³ê›}ÈÉÔ˳|ÈÓòÍo¢hm6»VÓÁÖ%²‚ŠPvØ Í4WôV}óîÈ3‘#Ldï:´(Ñ\ªéµÖÝò3ò‹2#—îQs¸E†k÷À,<‹~—:KªYUTufµÙ±}kÛz Þª‚…=fùûZpËS£<³t)nóôyˆç§äWˆ嚃šà”Ž<â «ªÌs^`Ò`ï‚æÐ&­„Ä4^ŸÞ™ÞfÒnj_Óªél.ÉôµãvÚ7#h+^?(ÚÕÂÔ™öâ$4(R{$ÇqU]ÞÌÎ8žïŽÇOÄÙ¸‰^?7ã …¿(V ñ«¤%é%Ê’=@sn ½Õ¯7d–˜vÞ= OSÇr¦ÕHNlvv;ß°*ü]±¨cÚê8Õ6:‡ÈOÛ}͸¹&Í´1¤ÁtÊ•0””ž@FÍá© }=u”iáYÚGæÒÅKŽâk ¶ÓíÛîN”FR!²èS £‰Þ“b¢GBïIôRôOôˆ'ÕÅ^£âhÉ(Œ}BMD³H?œ +-{Ez=\ Vâà[ò‡2;Ñ{z”.÷¦5‘#PÓK¯ô%ïù¯yÏmn]Ø8µ<ë¸Ü˜‹Fjkêj25 ?):7šŒTFDÚýØ?>èG­Ù9šŒ›%4kö£¶ê9~tQ¢]ÂSÜÓüx~l¡/XhôÁå¾ñhvÍ, ·ÎÊÖ+¤E¢ól“_ºÐæU\(¡©®ñ+›s³5¥ä›9äDié™úN/ý÷¨¦MÑ%EѬh¥#N§öYKs6çæbÔ%g4VçÃáRÅ¿J£ÛùïÕŠëÓÆ©wáóŸ…¨Ÿìðß>‚ãlûâã{nìz9abxŽ1'®n8öè”éU!9íïþÅ„Îõ—=x楛[õ–¬°4“ÈaǬ•S2m³—O­ËJ7®üéÁ§ê2÷ÿ_Pñ£Ž[Ž)¯uyu?£»ï°=š³[$e8­±û¢žw,¬­w»#“µ+B5¡ð÷ȶ›w-œÜ»y÷âÉg¯¯[I—OÜ:#ãt²`ô‘ÀéÏÕ“%ÛhP¨âŠ:‹N5„:w9=v«Ó2n:ÒCuÂMGåÔÏm¢BêŽRk¢Q9“Uc™5È|Y}†\í¦Ï¨*üû ­…ÂWê°Uõ9ƒÂŠY5Êêóª1Äa“t`j­°G`ÃC0¼æ¬:–•­G1K Š¥#Y©Áê~ñe)"TVñØ«µâ±D±æ8„ˆÇ¾.ÊX©JfÕÞËÀCé#-1j~uªÉÕ©fYWíR«Jã_î†qXV«eµZV«eèÍ)m ð÷ƒôÎ>KÏUW7Œ+YmÕh—Êǩӽ(ŽQ½Ât¬<Õ Tfu ]à7›#æh_Ã@;Ø0Üp¢I𸭡«¡›V) XÒ¸+‚–!ƬXʪ+‚±YeºŠ 8+,W£CŒII†³±ä¤L0;K±z¤öÜ*‹EÔyÜåÚÔa³®[·[÷–ŽÕQŠT#¹<ªn«îªî®fûªªÉ`5¦KLJ«OT³Õ]ãÛª~pBÐÆT”æç>9mn²är¥_c(g»×Ïiøˆ/êç<~,h¼B€šçÒh™: IË«KK“"¶„بÎåÄÕQ·ý9ð¢( Òg­W=†úq(ê1ŠóeÌG‡µ£*àÌGût¼ú)‰’#1–þfb¬d«_ä ¥_[ÚéSŽ˜s¡±ò"†ÿiïÒ è ˜ï·<`½?´;w@§ËyrÞ¥âRËÒÐ:q½e}è¢ý<8"}ÚëM¯2¯š?#Ÿ™G-µjš-ÍîæPƒÔœ›fîÕ]eÖ¤H¥(E¤h*×€DÁ!Îljíâ…æOÄ/En¦eFèeí˺ÿÕq.­S B¡©d²™×[Ì6£×0M!~3ŸÇuˆí–vï1ÁÐ<– ?UïV¥‹Œ.–]gÀ†kA;t¼'f0À«KŽ:0('éÜ#=¦Ž³ŠåPø·ŠåÉd®áßFum¨OsŒÐù‰?09Ê|ÑŒ‰Åj³‰ž7èI‚»+ÓmPG½•X¸>–š” ÖOA)¤ä)—Bv )þa;Æ„~v²a6FÌ:QtëÆ!äÂ_(³Ý†7õz²ïñ¸uú´¡Ï@Nð Èt†é܎˵ÛÝÞPçÀ½ùZûð6Žëà™Ý°X»¸,n€ H¢P"u‘ië"eÓ¤.ߎ¨Ë§d2MlYMb±±_©©¤õDÙ2eÅ1“ª9š(Vÿ:®ã/±ÝVMìÆŠ×q[¤úf ¨Öýþþß÷ƒ|ófgfgöxóæ½7ofQ$›E)S¡n•š¾ ËŒg˜Ìð‚â¾íhð‰ÏÑνc'ñb sµ´“x¥+ÚàŽö‹«kÉF$ínrËD1‘ÚÉZ[™º©Qÿt³º+IQ®Žt‰­î'y'u:²»ÃÎ;ÈÔÏNFQ˜ÌŸÏþãÁ¬YˆD°ÃæÊãkgO,q$b1¸‚—³‹'–y-a•×\ƒ–¼Æÿ¬&e¹@È R–ݨźª•Žr L¹6a»:+þoTÏ0Ö)#·è¤øÔ…·^ óäš—=ðdý:²‹0ØæfÈuDüHåæŒxªdr’Øñæéq••ìtÒˆL#¤«ÚïTËHÈE©¢Qe_4¢Š>F£Ëy‰ø_¢sG„«¼8îšvs±.j2[ÚLp¹­¸°»&M[[ú\¸ìês »F\ã®CPPgLúu+C8é×ÆÃµ)s¸$V@8b2V«Q]_ ›Ç¸Ïˆ‡#Æqã!ã9£Æ8éœ'¼¨B|©ý¢¸Š3µ¢QiåR ¥Fwº›—Í–J9 {lÑÜ÷iÇú>*°åG—©24G´ìa´ý‡ê8â :çµÄº,ôÕZÖõ4Ö8~#y¡äõ‘”²HÞqcŠ–J5µ.­•ZZ+ERÊARjiDzZ®ƒJ%”Ž;i­§v^Om„é©U‘OÊnR¶G Õô¤èé)zzª•ú[‘„Vº¬®•øIQßÅÖ:Rq+U…IÑV†æÓUa­Z‡…Öa!Î-jJcuô{jJ=#ºðfÙ@Š*L5ÿ<Ð(™7uº³¹®åD¨R–­]W&e²ëpïºíëF×±ëÖk—5ÉÑ´Aמ֨>Y2¦ ‚p53M~µ!mNêº$Z%ubU9)¥(þ>ÕæL×åv¨j7è4ºµëÖëä¦eJñ…N¤*)ª §hZªµƒuУŽ¸{QZío%Æ’ܪZhäCšÛÚÚßCFy’ØSëAùÍíéè¯vË\(Á•S€[@ôžO•J„-õVLÝkû_AK/¼‹º²Þ}Á#»ePáÕ߀·\׬;=ð“ :wÊ„Ç@µV’~yŠ9ÿ|¨5éo‚HÙêIú—­ Y’~h×χSIãkz>Ü‘ô/…HyQx]|UÇZÿºN>Ùºª\L&x¤‹.[¿¼˜hÚ(tZN£[¶´©Qv  J–H°QÁ#J…l‡ e±5™IE4¶â‘ÖJ+ÓJÒœ«6tDzz«úV1c«ÆW1h•´ŠYýú˜ÝÙ¼j¸`ŠÙ£Ö¨<…·ÞMÅÒ9ï–ˆv~FEí«‰|JUÁ¯DÿWÑ!¬¶ šÓÛkš{(bMÑp,b Öa³2Gçkî ¸§05­ÃˆA÷ÏPß«£ µ­ët®‹|d.Y7O¯¿DŠÍã¾­Ö†ëòë÷:®½¯{ÅŽ Ó$´\6Ûn[t œ7¾¾pcÃ8Ú–Î6õ š`º·¥°¦ÁÝÔ=»°”óPY7.b{Šy««ß:t[w÷º¶½³·¬Wœ æ»¤°¥ÿéH¦\XnHÍvSÝÆ¥+ ­©ìK·Î:6¶x#ïÂuøêÓeb#Bì/Ë3s¼¬@yY#•‰›Ôå¼è ¦!Ga_$ÉS¦T]J9ï¤f¶ª÷3õpÖ”³æÐé$–è)îD>z²Vä£Uø’ÔÊ–¤Âs²&$'U1F>®úwÈITÇD +Ñ7Qý¬)g"ÛºH!ÕîVÖGÄHNçI«cÙ,5²IÔo¬x©x<ƒH„…Hª±í"ã¸:ë¤Vzjo¢qzMjýb„§ã'OyOù癩NšääI’ÓYhF>ZÒG|4ÓGo”újÔF’°R"™,4ÿon Ÿ¶Êõ¾@8@c¡¯0\)Œ4 .ÓøU ÚJát©ð0$LXïLúEÕ—Lú#+C|Òo^ö%ýaÕׯïhô7uÖ¡p.Oï8‹¢Yp9#ºqWx,ò#üÿ*ÏñÄçMæ}‘ú@²/9LVé%Ç“•$‹’R’¡KïôÐå“Ãͪ.õ¿7ÂYe7«å¢nÖU‡5ZYã©udê@M}¨ñNjƒû-pÐ'ç'^ò¸û_í¾Iqš M‹gÚÊyëXuë-3éŠö¥Mb ÖÏ~¯{}ûÞÙÛ7ÜÔö&öâ[÷íø“Yß Ó}mÙV¼öñåÒÓ`ÛgØãÐÏDäcŒÕžV‚ êèH:U¯“ˆk´ÑѾC2I¤l#‰-ƹ¢¼AŠ"ulTÝÙTÛÃE' =É'å<äd/¡)g§g7JT†“¨ÇQI€D9Îo4ªÎt0"Ä£ªMÇvYÇøIç1çßâéOú~®×Z-àåú.çÇÝøËúâϽº@9WਓÄDßñ#Sà|íj¬yé)Ðz9|š„}Ü07ÂsN˽O6Š*• æÌù/ab MuWkº+}—oâÂ:ÄÄõSu÷Ô‡Ûˆs/UgÈÖ1U¿^‰%Ö5g‰eÍ‘€Ôm™²‰6ÇŒ±ÆhA—SpÖA^ߢà&CFù/Û2ÑùD A6šwÌm}Ké0^aòÎys•a’åFUQ‡ÁžØ²ƒ½zÕŽ{Gž^ْȹŠÝ³Š»5nsHa¿ÅÍzóÍk¶.ºüªrc6Âw¾~û¦›¾øÚÙGGbÃì{WçýÑ(vš¶²›eóèìÓÛÃmý«¯9þv¬–­Ô_sv%‡€–}(…_«Ò²'FYeÌá$ÈÊ´¿ªM›‰VB}4«kG©b&¦`*ÇÕÍÔ Fó’ª<—%O+ú­á¨¬MX :³J7@2¥ùêó4¥X•h¦½õ„…zë zë zD½Äâ*t+r¼¯)7Œ5üUâP×èi –ê¤z¥²§ì­_žêû<þ¾àÆú¡Ôvi³gsp{ý^i‡gÔ¿#8šºÛó•Ô×ůy¾îÿZð¡úÇRO9ŸðW×»™€À^ÚJàj^“õ”Kj.KœŠ§q9€«êü|í7P“l5™4@øõ•På<@…ØÕziA,±²ÓMLº2Šá™{ãÛã£q6žÐÉFØÕ)¢åž÷¿É¥d¾Kºtâ7Lª‹Á¹Ûõ£zFÈZ¸RÊ*-T‹%×ø e•b K"Ôó*¨OγsJ'©çÕàœé-oNÌ19±Ì”Å?átåzí †NGKÍK¼¦y¹æ¦T/1ûõ캽uys$¼Áau44ÚL‹ͦ–†Ü‚Æöâv°‡úÓ%éxK—=yõ슞8ˆo'Õ©¶º¬Ž*Km½p†ùÐK×\¥—xžÒK¾Lä3ÓYSLgM±èõðq#IÅÉPš#ùb“Ž‹AΚÒàÛ5ø& ÖD³ãzûV?ÞâÇþ¨âÁÞã±Péäà HAYÀ€‰›6!üN½vJzMKç¨#ãwÒ›~Xÿ°ð¨røþˆÁš2%Ò+Ó½ù¡ümÉÛÒ÷˜Ÿ οËþªÎ˜ä›üèeÆ8K7¬LM¢—3SØS¶ÔË~÷Ë^¿'àÁ’G'G2Ý/;IfÈj„MNŒS¤ñã L¶¾ !òP=w¹Ý2YÎawfɃe~bÅØJœ’> >g¬½l!»ªˆã"+Ná–²;îqg<æÓq<‰ÅY%Þgâ/aå°r¤»Ö9ÈšrªÍØ A<8PÌ‚d9yC”~å#º­,QœÎÌ[lr©šZÄd°›L†ÚÒóuíùàÎKVŸC´ºQvFÑ›šQJÝ(».‘ (’E« X‚uX›äëÙ éš:\cíDû"ë˜?Õ},}lù4Á àtyÙ='˜ vÂðˆiÜ1î÷Ž×=z0<Ñ`9E¼šˆ·VÙ g#_J?y4­ b³%¡¸‹ú„»ˆËB‘𪮹:£/3”¦ /%¿µdVHB䤷H‘»QœÃ*2’ QlÅ´lS벪u‰Vh MX‹iÅJÎ9WE(&YÉí˜HçÊV´c‚2²…Â]²wé«køÈ‚ú¹Íw]s'“-ùÚªH|þbzf<»õª¥ë•ÀÐWüòžµ7.S0X÷Øæ® ›fßjhxôΖUy‹d5²‡gxÿ +$’™e[¾¹ïa¿àÁ˾|ßåÅ®«ÇÛŠv<äÍ2ð0û…ß1íÜw‘ÏÔ|‰}e+ð0J7© Æè°aFmt ³Õü¦lµùuyêÂiŸvŽ8#¬…‘læô©ìÙ“Õ1ì—µ5yù“Û¥zÒÐ1/î%sŸT ªEÜD¢£S#l½Øq½¯°cÚ\HÚ6x±†ªjNÑÐQPcS HZz¥tü³Õæùl6_Ý‹ª»­þº_¨ökªNŸµ!9ÝÑ8†V×'ÒOaâÊý‚ 8M%`^ï¾X1½w@Nˆ‹²`+ò *U/¬®4"»€QÂf£æºõ¨t ÆdñGÜ‚×Å“ŽŸ½îâ ¡fœj¶‡ëfO$g;KŽ} S³ZÆ´ÀgÖ‹†h”³ø—žÿ-«iÉJz^Õ/œÑ<ý%Ížªö—XÐo13ibê3#}Læ¹D4 µ„ÐK¥lÖU”fNÃoz^¯9Žb0‚vR_É:ªVÐP¦Æ^ 嘞C ZùíiœF{¢8jØ“À ƒZ{:Ý fªÖiÒVi°DCicªc}®Þ#Vº5H]©àŒƒ’i‰Æ•ÌPæzýHæ½è{‰?Dÿ0’“¶-÷Co 9˜É$·¶øÜî€7,e8!æ‹¥cÅØ:ד®'å'c¼!Úi÷¢¼J·‚_Y_•X•¼W7&Y¾½7qor,óˆô)=!O¼’ùaô‡‰ŸGž8 §Ó:8—>ª‹ëÚdÁµDZbéÓ\¡[/_‘<`8(Ý+pß½76–qí×ßãÚcMú|«t«…ƒ^ï3°ú…ä²ø%%ô+(™ö#Q0ûÅ€ÛïÕþž£Ä‰pê¾rYŽF^Çëu‘džL&€¢ñF^oçy=H(nGDˆÚ!ŽDe·]–ÝÉXØ ;ô@Þà ü>t#?~ÿh‹r$!3È'0J(ñ bH"Fi(ÝT>o@QÄã'Êb¢ ‰$ Êyq›zÕ‘ç§Ñ¶d˜¬¡q”½Ù>7>äÆ/»_u¿ |ï«‘,tpżôêÚ‘è ,¡r@7–…ìP —ccd?`üþóú}ñ,ÿttD*AA <–8Gö‡†ÑNMÒQ³j_‘¢¥¤’,'+Ééäé¤.9Ü0'9%3ËnÏÙ™3 øì¨önHò@dËg< N¨}‚À£úH1«¶Q‰?«êZä«7”¯)¾Æøù)©ÿù[óCÄ·óíê& tÓ§Ô×–,¤!F6%Ê Y¾d#œÂGöCv‚ÎMºŠQ‚ô舣ˆç¯R$>S”u•q•qÔXIõ‡Y•“˜ð Ä'ÿ¶YŽ;ÛñóËývþôwíñ"nHÎþ4ù¯³¿Î¾é[Ð…ó×Ò3¿ÃÏíow™Ùh”uIa»cæCüi‹b#ß%4]þ7ÌŠ™YfEÞ¤Ê^„Ø_YÀ~X•1AnŽq *˧y¾Á&1 ˆ»#jð[TV“Í>3Mun §û­]>h:h>hÙÛßüºáu×›ñ7óz1¢†ˆq§°Ç𫜮®-#nlá2%MI*YÄJ‰bscÛ C¯ÔkYê_ëIt7—ÛÖ»×GûÚöèF £Ò¨eÔ9êúsÝ„4ayR>ó›5¢$ZÄt@ Xé¤teÛ©m~cK_[Í/1×}û¼€ÜÈ-YœÍÄšeCrþŒÏWÌdÚŠ5––Í–Jôã"„§M«!¹§oÆ wºœÎxssA0yAt:w¬¹Ðœ/D­Y ¶@4u}ûÜ}~ìÏF·‡GÃLø`‡ÝÑL¦˜oø0™Œçûàiï+à‚F£‹ºuºH!j/¢Fg<Þ˜7Úóy#¼{YotåãQ·aA6& ¬±YWëp]ÞD6C^ â ™3\nhðû}‚Ä̶;±3Âæ£Š» g5J…²»â~Ç}ÎÍ‘2"»O0-(tøÚÉB&á(Êãü 滨ˆÚ˜UGƒ§è²°Aò¥‰™Ô`jÇÙj¬¸d ¿DeÎA"LQõ¦º¡ùäíj$‚ekq_V~_:3Hžñú ­ÅÁì ¤HôPÚû>Ät¼Ônnßo–Ú÷\ôãt…=\m<.úÄf—Ëã&ƒ÷ €ßΑiÓáö•ô½ú!=«ßÇ“…¾Ôë"Yà0¡0ÊÁ¡4ΦKi&íÎ7‹¸÷±Á«Î î83óÑ Ù7`¦ê6¶jæLJe(s;ròóFïê+åÿûwæúŸr*‘kç-n úl+ŽÑ׈Ÿq44ß>eÑñ¡®&d½{öK-‡/_ØÓÚ,&ÿ²HÇì‹bÐ-¹ò@Åq_¼k6‡?I&¬zƒ Dv9h.ÿÜÝ÷v¦ëóNqÑÀs4 %cm¯{ö& _þV9kå9™›à&LæoqSœnÂ…M®=¦¦–>Ô/ö9X/ç2ÛÄ«¹+Ä·¹Ó¢®J— ̺œ¬È˜5Æn ¾Sƒû4ÃFÓhÔvŠx·ˆ‡Äí"#62*Í£¤ÁÅ/dAÅEKR‡ÃO \‘rN£y^ð8³(FXÎβk`8Í.i…ëÓ`M£É¨•†D,6bFO0‹qÌ¢ršÅ™ òùò>n4•M#&ÖäɺJ®^ë2f Ä`Æít}CFV´cÕGä“d_çÏHðG¾Ó¾³µk¬®nÿ¾“rõ‹,UDÙ?Ú™eò~ó…Óe=pz¶êÌb‚ˆX&G'ñ]ÿÅ1g‘KØIôcö"7b%ÑñcÖ"';HôÝcˆŠ4zD¼”qÒ}ÛÙ`C„n­AÒ¯¿°WοÁ Ͼ¶©ÝæåZÍ<‚W_ßí’ Ø=ûë[ïçVÎFÏ¿N+×’w¯ÞxªçÎËoÛÝH[húø§·×0YQ¥ýPsõ´¼*!]p¶ mЧ»g¯Úærj¿vm×1dIÖÓh-@⟼ðŸq­8X lèèØ p9SDͤYVsÿ‚ê¹](ñåPWŽ“: i~pá_Iä…Æ }8táö+hàO/…:;÷À¹½¿ Àm´3Å [ nøeZ nè‚óþHÎò&Ö‡¶B¾ŽRê7ö’²Pg’Ü3üÝ…¦±„á޹…½š[ͽ¡yL{•ö Ý?óOð¿rÂ9ÃÓÆL7™o0ŸY^³n¶ Ûßrü©ó>ç³òÓîŸxÎ×]ã_x(x&¼7òFô“DcÒŸúbÂÌ粯519OóÞÂS-Ÿ,øjÛÉˬ‹v–TÿLÒú‡Û‘†~Ù.‹Ö#¤ù;цX²o”°Vß‘Éð˜×¬_Ò³<µöú›·íZ½íÖ+¶ß¼és}kV­¥ûÑß… ÚŠ>ë×N¿³i@F$B;dCvä@Nä‚zÝÈ’zò¡¨eq”€çRÒp5¨ å@¦kA­hZŒ:QZŠ–¡åhZ‰ºQZ…V£^Ô‡.GW 5h-Zw°õ£´]‰®Bƒ½„Ö^˜fÿéhWW®<8•¡x2‘Ì'“žºÜËì?1ÏBÓHx{Òé¥9oM.^\´,P#Gërowì[è†}‹}.—žu4‘Éë0AfïB"Œ;tˆý%ª0¨Ì¾y4ËM¼ÂþòÿŽý<'rÚ&M–TøöExÖöûB5ç…£fKuì2ÁhÂÓïœàÐvöI4 pà0‡DY€^’Â>Ã>×ù8œ/B˜Øp€CkÙ§!ýF²O±7 œûeÂΉ½Ÿâ¿ìüMH÷þƒ& Ã‡:îf7Æ¡00ÀÁ3‚t…½`ÞÆ<Š«!AˆàH8 ñwkàH„r"”!U„TR„$§``¤š«Ë©CÊŸ#9qÈ5Cªží;ž#1€•pd‚#™ Ôiæ<\¡¡ÐÀÒ´w€j ¬å5Vó‡´4ÿ-SË+“s™óåMñé$®/„àñ$.·—:råV«u(<J =ÎmonOlœë ÷F{½s¥p)ZJ”ç²ál4›È>ÎÂh xœ;Øs¸ç•žW{¸¡ží=£=l+Q'S9ŠCQ‚_˜t{r­bÇBæ0Ü΄o°(a °€cC`žƒÔç õ9Ô 0 3ž#ìÂ@5¤OÐ<#ùÌ%ù,Üø³“mùÞŽ•Àr‡&X¨ûYÈ––Vc‡izÂwhzoµü!š€°v n#es¡ûmD%€!€ z•Ý€Þ€š! ŒàØð·ÝÀ<Ï2ϲ鲩É@N'ŒWV /uHŒhÀ„Ÿ¢áC4<@à #eóJÓÇ+MßYiºg¥)&: ãˆÓó¦ÞS²Ãµ¹PÄ µ$Ä¿¡áj¦Ëö éAÓ¿M¿ šþ"hÚ4]$çÕAß51vHˆ¿FÕ4Œ• Ó÷¦ SkÀÔaÂah-¦¡Ÿ†^âŸ;E¤??„ÁÔÄàÉöd`ŠAá “í€f'Û—š™l Ð'“í÷¾ÿˆé†?žŒœ t8ðGxGŽÿ½Š‡W gŸ|-à'P;Žþ«ÉöÏ“ò ç?ÇßD!ž”ÿê£çMà4ý/ªç}}2½Z}t2};´úJÓVœLŸÔû'Ó}u2} ƒ“Qr7L¶×:,d+i†”Ý‚¢ ¹’žj‹Ë¡æ›/SOîšL“³:ISxÉd¸ Pœ\å·qõÑæ“az“>¦UÔ¡0½h/ŠRlÆ"½xHŽó“áÏC-Úç£gÿÑ~‚Ü8ú=' üË·áþÖÃá?ã“Ïþþ8y\“WÓS8z,ðÓð‰ÀßF¦ðúÉÀtzЇŒWÒS ~!prÊ2øXàpúÚÀsašûxráUO´7 o <…ãÉÀçÓß&—n†;^ÙéEžögK£S²Ëíä›ÉB -¼3P„äSxÅÑgM‘)r)PÇ3ÇõÐb,L/e]ëKLéðžrZ·[·Y·^w¹n¡.¯kÐ):Ÿ®Ng筼ěy#/ð<¯å9žáo§ß‰'2£]+¤åHÈѸÄÐi|Uèd@©‡¾S±±ÝL÷šÅ¸bíFÝkWZSÝSº WT¤º+|ß•ýG0¾oŽ*̽S­í%Iw{+VòÁŒ³wÅKðÞ»¿20€»+Ó[P÷f¥òñ¸áòMx±Œœ·”ä’u‘¥¸´ó3‚áj8OQ’/±*ɾÊ׺×ôWžö Tr$rÁ7Ð]Y¶F•ÙÁlïê<ÎŒ4ÐßÁì躂¤ã;:抡3Å@cQ‹E!R …ðQZ¬‡2 uu …ÔBßÃ+H! ŸïÑBתuE  ¨« (ÆøQ„Öaü¤ЃZ™8¿2#Â"­L4"ZY)t$…"é()r¤5 ŽD[iö3³ÃQõrP”¶Å´Œ/–I¨e€ ªeʤþþ¶-þ(ŒnúÅÖ-]ÛÂ]Ãá®mÕ/Ýr\Û¬(G¶þ‚d(66¼yËuoÚVùEx[gek¸S9²iËgdo!Ù›ÂGЖ®µýG¶”·uNn*oê oê8úÄè’îKÚ:0×Ö’ÑϨl”T¶„´õD÷gdw“ì'H[ݤ­nÒÖå'h[ÝW,ÆÝ}ýGx´˜¸¯Q|”1І½ÁÅNidí ƒò]Þ—8Ö!5P1†WL$«¡£¡ƒdAï$YfH«Yò] ƒÞ—ðSÕ, ’-áÅ(…ä®ë;çþwíÚµ›Àž=)wï‘iÚnè´Á5Ý•¥—o쯴WÚ»*åáÎjØSý-é/K¯´¿ÚÎlom?Ø>Ñ~¸]³gÏ$[_ ½b†BÛC£¡ƒ¡‰Ðá–d\Õ¬Ü>ú Äîj»á×ÕIÛÜþÉáî=»ÈA»ÔæR{RKú;Bh H»$ódäÖhÐß@øÿðïú„÷ü%ÀQ’Â6° ]òõ¤Åa:2›;ÚXÈ-˜¼é¯Ù¨â®Õ*nïÈÉ€'Ky¡CÁ£— ü;€7þ à ›cs´ò=Õ¹³]hW ÃåûõnìJí¦»€bò¸wïJ¥Ð.Õºá ÐõæÿÅ"ŽwíAð(à…‚B4u9mÁ þ'Å%‹É endstream endobj 236 0 obj 29344 endobj 237 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 32 /FontBBox [ -569 -307 2029 1007 ] /FontName /XSVCLH+TimesNewRomanPSMT /ItalicAngle 0 /StemV 0 /Leading 42 /MaxWidth 2000 /FontFile2 235 0 R >> endobj 238 0 obj [ 250 778 778 778 778 778 778 778 333 333 778 778 250 333 250 778 500 500 500 500 500 500 500 500 500 500 278 778 778 778 778 778 778 722 778 667 722 611 556 722 778 333 778 778 611 889 722 722 556 778 778 556 611 722 778 778 778 778 778 778 778 778 778 500 778 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 ] endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XSVCLH+TimesNewRomanPSMT /FontDescriptor 237 0 R /Widths 238 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 239 0 obj << /Length 240 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚÍW}XSWšßss“$!Dð&„&„(*Û€ QëGµ„¢‚ˆ¢ˆ€2(®Zµõ ZÔqZ]§£<ŽíÚe­áÊhÛ©íØuÛÚm­3µ;n}F;ÕNmg\ûiåî{o¨û¸ì{ßœó;ï9ï9ï×¹çž@ ¬¼uMµ- …Ôs†Š¹®½ÍúÊÏþñj_àS¶,jÚð_{ÔÔÅN-ZÚ±ðÚ•åÚSÄg5Ô×.øìxñxÝ$0¦:bö©žˆN'>½¡©mU @)ñ4´K›ëj1ò‰ŸF¼º©vU‹6Ÿ!¾’xë²Ú¦úâíÏÍ!~ñö–æmÒGÐEü Äg´,¯o¼aþ+ñ¤?êmêCý‘=RSX)÷ð BE b掀@:Oå²\«¤Û|Øß•.p£iw¤Ð“Kài PlÎ/‚%è§þS6™ ó°üX zZµþ†ÃB8 _AÓAxIÚ y´^ Ì‚Ó`ƒÅÒ  :¡ÑØtè–>.‘¶Ñ¤­6ÃvAíÃ0q©t(eÐ çñaéœÒ4Qå"+ƃ&ÁZ¹ æÁZñüÎb‡´Y:MjHß(( »^‚cäÁ-Ìî„ÛK#%DÂ1K¤™ÒQémÒ“…´Vž!Ú{à ‡ë0ˆœŽ‡¥Fi¹t¤«6ÀVØ ¿‚ßÃ÷èB7ËeÍrÖÈK‘¼öl²æ²ç\@Æàl\†Øß² wLj‘ö£µrIc/¼oÂÛp®‘¤S°›ð4;ÌÅs»¸}|;ÿŠd—®’}a¬ mƒ#$ÿ1\„Ëð-|G>˜Ñ‚ŽÂ|,À ¬"z 0Žmb/±Ãì:§å~ޥм,ý§ô E%\ãZÑ~˜L>Ë\N´›bõ¼A¹z›"öGøѧð%ª0IÓpÒcÃt‰eDäW%.ÇDŸà5FN1Æú¹·SªM|>ß!¥IùÒX¢'8Š|E©&ÀÃJæª)š ÐHšŸ‚M°…âÚ û)‹ýðYðünÀM¸?"‡4“mtŽl‡]D»‰öS,ÿ‰vò1ÚG')ǧ‰Þ%:ÿAQý„²w…说Ǯ“ß‘:Šq„äŒZ”ŒâÃè#ïfUâBÚ-¸×uã^ÜO‘?ˆ‡hgõ“÷Òûx‰è/x•¼¾‰·Èïæ!š¬øü{’­'ÚÄž§r˜½Eô-7ŒËåfqOpÜî÷2÷.÷9åq¡ªSµOõ;ÕYx/çëø~ ÿKþ†?Ç_S§«k¶kvi®QVfSn áþ'žvX¼ ¬õÓ‰0Tô®Á6øiÉ«•O¹î èyè­ŸƒëÀÀF±_`6åè×|·›öÄstVŒ¥7ö"½[:¡sá<”â)6®B*dñÒu0KŸóm|%·R©˜ifüÐ9wÊçƒ%tŠÓØàkÒGܲl#Œòff8Òíi6«0"5e¸%Ùœ”8,!Þd4ÄÅêc¢uQZšWq !Ûo/­±†2jBª {y¹[æíµÔQ{OGMÈJ]¥÷Ë„¬5Š˜õ~I/I.ü’Þˆ¤÷Ž$¬EPäζúíÖÐ{>»5ŒUÓ+©ý¬Ï´†®+í)J{‡ÒÖSÛf£ V¿¹Ág aÕ*moèô×øh¹/¹­sgS Á ÑòÂ!˜X»¶ÁL KøC»ÏJ¶û”1Îá¯]š6½Òïn³ÝÙ!œXgŸ{I(Î54]žg%Ñ•¤Û½X¶ºbØt…½0¿FnÕVW†¸Ú`ˆÕÈ:Œ®P’ÝJZý©ù.ûSËÿÌ=ƒ!æ(­­ï,¥Ðt•GØ™«}†¸Š™VZ–m V†pS0b„b{Ä‹z»_î©Yb EÙKì Kj(æ0£R´x-~{­/‚i•b²7YaÜÙæuãm”w±»XÆñ6óº~öT¤ÿÓъܩK„3îÄeMö™²Ö)Jìdë8¹ªuãHŒž ’—‹CQk: Ѭï0Ø­_%Ê~ý‹û{j‡zÔÃ× 7åtÞÙ4>ÔV¾% Ž¥ï»|Â{Sxµ@[V¥8Ðñ*ã˜%J­’µQa–sÔ¶hšÙåšz³hÊí¢©†oЦnÁ#E·‹ä2zTžÑf̤â௾õ"ßðÞÓÜ…3è.a“.ó{鑇ÉÞhÂxÞ¢K‹µ›L¦øaÉ–4‹=idrN†3ÓS¨5ÎRª-µ<¦Uå^”Ü‘³5y‹skÎóÃ_Ö¾l9f:oMQe$³(®Ìävg»²³Ý:çð””2SÖÈ,KrùÁdLvšü.ΩՔ÷jPCœ'ÇãÑh£t®ìdË𔬘4ħ9øÜF;ËS»G:¹œh¯ÛSžS–“§3:mYé#½P2²¼Å¸ÞxÎÈËŒyéyùžýÃ)caûÏs{¡å‹ÇT8ÁrÑXh*4·{Ú '\´˜á‘¤"úÝN*2%jxC»kN»¡Hc(ú©1Áe6i EV¤™` †§Ðaë‹Ã“âóâó32s0³Àv·ça, N¥GƒvŽe ¼jÏVGí‰Þd6¤ºñ“ì®!f§Ê‰Wâà›ž÷£¾Ï<›‘îäŽärIö˜Ä¤Áfœ®i–Ëçæ2“%.Ó6¸·èLZ—E•›«q<ôãÖt{œW Íåv¨<7Šió⊾FÔ*üÉ[w2¬ì$„¨ŸäeTà|e…Á®ùæÎÈOS‚ƒ—oxto¤;mD£[…šî,jjˆ24WñâQ‘0 ­£#À´`ñÄI%®Ç7Õ¯p—4/] ÏWi•|ç}À#Wüf‡z‡† ³.±LH³N‚ø0ÛF` ³­Æ0ÛB`³Íqa¶‰ 6Ìž&ЇÙS1a¶‘ :Ì6èÂl=½,OhÃl&ÌÖ¨Ãl fÿ@  ³Õ\˜u°0[E€ˆó+> àû´:Ñ:wqG:n/ö°òÞ@µÍ'Oö³:â%¶€ê¯”úEâ}VOõ묖ê#J‘Ü®ÔÍl!ÕRûQ¶ˆVi-Që-ŽfùxZA§”ºW©5Þ„Vý™Výo[õ/µê×·êÇ·êÇ´ê‹ux–¾±zìSêz¥ÎðFÕ«o«·•E>£Ë¢')uŠR'y‚ú+AýAýþ ¾&¨ŸÔ§õʼnØIWj=>¥Ô•zµR7(õ ¥v*µÑkÌÒœ¥ß—¥ÿe–~~–~\–þÆÑ5P:ol¿þr¿>³_?¢_ß?\ÿ[ÚAq+ÆAÔ¾ƒ4:bø2!Œß‹Õf‚›¸!V§|%V;¾«3„âdü Tk)>ø)TãlÂ?CJæ/b#“ñOبðÀ‰ÂEç š~>EࢳŠàÑ™EðžèL#x7ÿ&:G¼%¬oˆ ‚“b ‡àu1à!8!æ„ÅÀ‚ã8*º—ˆ¢{ƒð*†ÀÍzIýz±:™zŸ«SÖŠÕcÖˆÕã„b7®„ÅÆ¶!V¿—°•Pö­º•ñfèVÆ—a£Â7ÊãK°Q‰ÅbúŸ&Ï[D>ËX':'‘š¹¢3› (FTŠB±gA@Yì1(΄€2išèî%±GE÷²Êý“E÷{BqV€åYp(Òå¢cIÊŠg(î!\d¹Œ#Á«d%œŠRY(ËÙ#yH»l¢³ŒÀ*:G¤F`ŽD>Q ȾÄËÑ} àVæG{HÿÕ‚ð}uºð]Ïá[*7äM w†ÑáMþæ¼"|éÌ®;G _8u§n»p¾û„l œ# ë0áœÓ(|0 ï9®§h¿ý¾zŸpÒ9_x6ÈoX…Þ8á°3_ø—@ŒÐX*¼ûâ…hÎÞÀ.á4ïYçR¡Óéßèµh“¬¤u–»S„w÷šÝB“‡š¢Ðè ㎠K»„GXKæÖu‡z£…'È–ª@¶0+ ó:A£v sÊçÔŠÈÁ¶% µ &›Y'hÙV*›©k_×Á ”‡»ì¾>8謲Þ'vy»”9G§˜¼ó>]Ûîèš|à‹›,뚺óÃ;åᩲ®²®²®©Þ©Š.ÿâ™%+îy~ÖÖi<8 +è]ÿo^Œzµ endstream endobj 240 0 obj 3786 endobj 241 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 239 0 R >> endobj 242 0 obj [ 722 ] endobj 66 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 241 0 R /Widths 242 0 R /FirstChar 119 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 243 0 obj << /Length 244 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 246 0 obj [ 744 549 ] endobj 135 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 245 0 R /Widths 246 0 R /FirstChar 33 /LastChar 34 >> endobj 247 0 obj << /Length 248 0 R /Length1 3800 /Filter /FlateDecode >> stream xÚÕ–ytUÅÇ¿sçÞû’ð‘… !ä…H$11D$Á"J£ÒÈ8-!°E°""ŠJMS›*X¤¸TŸQÙjS8ÄU Šm¡ŠJ” -I)$ïõ7ß„öœžößžÓûÞ|æ·Ìú›¹3 @8ª¡Q0«lFºa¤XŽIê;kébß‚É5¶È_VTiÅܲ1^‘ÛŶiîüªÒE'¾<èb›6oÎŒÙ-W ²GÊãöyb[5®Oô[æ•-^ñ±zUô"ѽóËgÍPûqZô)¢‡•ÍX^ÒM="útÑ} f”Íù¤ßRKôjÑã+Ê+°Yô­¢ßZ±hNEÉóY;E—ñ†„‹MÁÌÇÌÈ…Œ 2/-6 —pC±ÎZ˜Š(QР¶`ƒJÃzñÅËhÀ!I¹HÃt½CÊ´£{ÐlMÃQÑJ‘iÝ,ùL‘Rõ–eÅa ¨Z°zX#ÔKxÚªW«°÷!Þ(%¯ X¿Ž2d[;Qb×Zë*­g±DyQ‰ëNkB¨…:» ¹ÎhLÛðc‡.³>÷” H]•Öçá Î"ÇÊÅLl²fÊHU³Ú¥N©O­IxGTíê¸3–¿R™o .9°ËŠÅBì=#´Ýåkbˆ¿I¥j‹sT=-óŸ(³¿„L<…ÇÅþ””ó#S×!MËÈqãä—¢ëÄ’íÔˆ|PV`’ÓŒûT=–¸I¬Ä§w©dë:§F¢^'½E¨snòìk [‚u8ïø­aÖ),CÕ&%_ÇGÎ&k‡Ä#©·jÔÌΘ`‚3 œMˆ’È$H>MV$Þ¹‚IjŸ•¯Þ¡^¸çˆõ¹îŽÆl為¤®ºén’jp®Ê¦©QÜ Sín¶jtóÜR£FâØ¸bíª Ö £Àã:¶¶R}^¿•t×lÁ7‹}‡ïMHKý7Õçõøü˜èï^åÛ N,¶c{ýN_¿N ñÛI‰gÿ›ólZêø‰Å¾=Ê3ª¨«ÙQÓ‹Ä8¹XD£‰Y죊ÒÌ®µP¨µKí²g=ˆ)µáªDz‘~ìô±LxO;y,#²gBϤ„ž ¥6Ú+ulû¹@­§ÇÕ¯¹)à ûÀi”݂₴HO÷ä¾Ý·÷ï¥ûà¹þ £œ>±1Ñ^$k;,ÎNòÆEÇ'%'¹ñ±I‘·zO^h’¿·©Eþ=óä‘‘—‰ôü–¶ü¦,ï%ÑÅš—‘”u{n¶ c¸Êl%ö·¢£zňšÝO U93 >DGÁm7ÎãIïh~fïå£o_Þ½­£9Ý3·ýë@›Z®«µ,ÐöÕž»æêÔÂøë{O)+üpßß}Íj^鸪TÕë½6•8Ùönà|jçW£+Õ2Ç/'•¯Àа&}0<,ºÛÕn¸÷dŸ 12dï•Ïdœ‘ÃUvV¯è(×£‡¥§Ä§„…6&:C‡ Iöy“#Såè 6öI'™1ÃâÂ8*ÄJ’%çH„䑈z"ebE ƒ­Bá‘IZ¬’GJÞ[ê¸"+8è-%»£Ÿ÷ƒ‹gò[ó½ïû­­Hïxÿ-I½g:Z;23TBn‚–é&úÐÓ+Ñ‹ñ HìoB˜•k¼¾!îÜxý|†óâ/ƒ/«•ª·êÝ”±»µ%°_´\k°Ž.ìZòd§K­l*+°¿EÜG:÷SmÆYÜ”ßj¦fžý{¯WÝȃ ZÙ9~QÝ®s”uœúŽz9_§^¸~:dõ?=7Û>ŽR7IN”k¨‘·t¦Øúã ìS·uõkãAI±Í‰3<_Èy«ºFÑÕ¦+±Âè¢)#ÇÝ9hrUÙÌòùæàxÉœûÿá±ÿ%­jå ­lRã!¡EY‘0D d;y¼F^%ÿF¶‘­äò¯ä×äWäeò/ä%ò"yüR†§ñgÊçå6-{ã<5#k|N¹…> endobj 250 0 obj [ 744 768 247 ] endobj 67 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 249 0 R /Widths 250 0 R /FirstChar 33 /LastChar 35 >> endobj 251 0 obj << /Length 252 0 R /Length1 4648 /Filter /FlateDecode >> stream xÚ­7{X×õçÜ™ÙY#»°ÂBÀÙuA»ˆ¢Dì"‚( Qˆ ² ŠFBÕD‚I4Š±ÚØ<š˜DÛ$M“4+ú-j›økšÆ|ñ×ÖÆ¦y؆Ä|MmÓFMe§g4±ŸôÎáÞsÏãž×½³s€hèÔÖŽ@$À"✠1¥µ§Ûõxqq ­ÿ À'-ëZÞ±éËdž;¾|õúeïôvïOý\{[`éÙââÏ"ûhO~;1¢Ûù Ñ!¢'µwt¯³ßÀd¢ß'Ú±º³5€Ýl!Ñ_QtÖuYg²}™h×m޶Ú]ßû@T²±¿«sm·¾6­Õu{[Wï›i›ˆ^ `9B<### L œ‘ÄapåáÌ™§ º UBÃÉ=qúÇ4ÎÑøs¸”ä$ ¿¬ÿŽ3¬ ƒ…‹ ! ’a#‚¹p ‡JxgC?̃èÀ›`þòÁOÂ+´c=t’n9|Ü´ë°þñòáÁEˆ€¸ ÈÊðCý8ì…Ïà‚¾Oÿ3äQÞ!8¥ÿ ‡à58MgõŒ ˆ6L ñüœ³³ ²ö+®“ëçöóÀïá?Š„ûÃφ‡õåúCú[ú?){"Õ>fÌ$ÅP  –R­W™÷ㇰ`ˆjw Þƒ`Â8òœ¥x nÀãq<_1ÆlL&Ÿì~öÁ1v‚â’¸.Ë嚸‡¹§¸çøÝÂRaðaÀò¹¸5Ü^î ß>ªWéè/êÇ(7EcœiÌ¡lk¡žNpl0kÝoÜ%Šç$8DQ£ô†Ÿ„?Âyºs—©fœT /`!QœeèÃ9X…ó±žÎg6`WâFìÅûpÁ¸ò$Â#øžÄw †ñ/_1‰ÌÉ–ÆTVE°ˆ ÀZY;[Á:Ø‚gÙ~6ÈBpE\9 иcÜ)î]î#î_|ßÍßÉÿœ?Á¿Çóÿà/ 6Á+Ü,,´8-–ËÓ–â*ñgâ{¤¿GàÛO+¬g³¯¡—ͦ÷ì—ôëô+VA'±àÓT©gèÞN#xŸ@%È%ˆ$¸‡jêä´ÔIÊD·Kž’|CR¢3!~¼#.Ön‹'EGEFXE‹Às !˯”7»´´fOS**² Z #ð-F³æ"Vùµ:š«ÙTs]«©’æ²ÿÐTG5Õ«šhsBav–˯¸´·}Š+„·Ô6Ðz‡OitiçÌuµ¹Þe®%Z»Ý´Áåw¶û\6»üZyO{¿¿ÙG憌ÓÈì,ºT‰(ðeíNB††_KR|~-Qñ™2.ÕXªÕÔ6ø}7¸ÝÙY–µ*-(¥ZLæØvcŸ‹TëÈwvÖ #~ؽTYº=¤BK³± |§Aãk6|Ø3µŧ%løÄù yeåà[B¥–ÚúË©4Û+FÉfƒ <@TÕ™e›4ÜÜ8„ûhmŠßà4¯tiJ©ÒÞ¿²™ju Á$5ɯ|Ô4ÕD“ÈÎröÎrSQ†²K²K <ËíìÅgïåÿúX”©wü ᪺«uAÓ2‡ÂÔ\­¦…biLm3¡¿u&©ÑÓˆ”å -¢¬¹ßv#íÒ„T›âê¿tPʹ¿\Ë Œq,©¶ `,ã¼z#H>¶¦ß(7}Å¡ïG¿eƒ ç–.T“çp)ðs8Ž%EXÄ9‰ÖˆÏÝåuÎÌÌyç «G çÙ.VÛF ¡¸p¤Ðvž¦\ožÝmŸLÃ-ô„.}-T}}0ÄýárªùÕm ïfB;ØÁ¯&GK<'Y£ãx>ZâìR\\BBÿ’µÂž¨î{GUœŸçoó} Åűh- oÚÞÌõÆÆåÏH°ˆ»-!6AL›ÌìM'û^ŠÛç_ŸS{&éÎç¸&÷µ¸ûÖÿ&¼/|ù§áӻݳ^Ä\f<ùÏlŠÇ•ª+‚aŒM´Ð#ÆXlvK\<Å䨈z)&q|¼SõÂјÎ\SBØÌàV`"…$NΟ‘o·Mf“gÄ'ÄÚÙìyUóï[4+î±Ù½7Öþ6éÉ­ÿ­á‹=½)î;6œÆV”!îv7à ¿H±½¯†¯Ò·/ ÒÔ8aJT”D±X§°Ähéu÷ºï•f,Šês¹^>mú´ü¼©ô#dQpBi™ÇSZâu¨Ôã)3ó¥Þ…Kš :ÕÄÇKsä;XôH‹õÌDî_-âÅqF ámÁ¸G{U»Í1Þ:^°ŠÑNòϸzFGK‰ Σ¸Üø Þ c÷.ÂX8…ÅTê ç.ã…ÌLªÉš[!~¼ÝŸ0Þ=½§Û§¥)-âôÔ<Ö‚u]#'ÖW:Ó“LÂÎh¡Qˆ¸4·z Ÿ<Á’ ÷¤wjŠ-ùŒõk0iÉ=_.‰)¼€h5écC—Ö_ÅîðnºÉíDF\Ñ7°Âf“~>ü¢xäªäÊ#o€›=M4ò©¼ŸÚ¾¾zéëwëÍ,!Cëèa`#˜LÝìg8D<4½ÄŽÙµÐ æ–Õ–U–fÖ¯èh[›]×Ù¸íJo©·A\ïhDQ?j‡ñN=ÆÔcñÉ |ªÕ /‘y¯9»ÌÙf΀—Ô(ƒµKÄ]ü¢d>ã‰ý7ÆÑ|Œ]®†:h´z•Yé ßO«ý´bð3†±º›B»›Ø ;i½“Ö}L l¥l;‰ÓIœNât‡‡%DÕ‡%¦ÅùD^ç›”—¨b¢¼&å!o¢<&%3k­êaü«±î`ŒüÚšqòQjª¡dÌ n™/¿‚Ï‚ $ÜiÎ÷¨ã\Ò‡.é=—´Ó%Ýí’^ÁíPC‚ÕæŒê¸étTV#×H7ÖHGpõ7rª#]z9] ¥K?I—îJ—zÒ¥ìtÚ=@-·„?1種Jé«Jé—•Ò£•ÒæJiC¥´¬RrWJ-ÉÒ¤dé†dzzÅ<³+"h9¸Kzpñ.ÈõÈ%!üò`žœ™•/‡p[°>‹Ð½Áúä’ñ¸ 2x¤Œú ƒø.ð™x=zM¼½¦ü»AOm[,z’К`Ñ0•cä˜Â•Á¼aâÎ Ö7É%˜7fs*ø¬Îí&ñ”`ÖÛr‰'C¦{ä™bòLõ‰cجO#uaÕ3BˆA9¼5Äð|ÉS'_Ì ñĹ²úcFˆ½”?ðRä?xšäßUÊÇÉÂëõÃò«žÕòá,sÃO}G ëðuƒ©Qò3žÝòÓžmòŠLñÞ<ÓÞÃõ&z(ƒ˜‡ämdfm}`‚òíy†‡(yY\™U%·û15FÎÉš!/ð‘k=·ËóG=Íñ™¨ÂsØLçKU*I‘K<)òMEo˳|”IP.0¶åi£Î§æ˜éåÍ•3)=þ<¥>WžH.QÍ–o^..ogˆÓE¯˜&¦ŠÄÑaµÚ¬ã¬ÑÖH«Õj±òVº·VGH?£f¯¸Ãb3…7fÞ\ÛŒýßH/#C+£«B}³†;â{ŠÅ±Eö‚rßu¦æ±9ózOŠöpÕ‚íù”Fmª±ÐS«´éFÃ2„gñ¿o?5P#Ñn<ë¯3ùn_c£³J›[ÓÂOý+B$XAý !ü”Ô÷B•¶Ð´Äò A½Èˇ Ã]Ù|SmÛ¨š‡¬šÏ@†Ú0xL56ÕÞ6Ô¶fø}¦Š[M•­BŽ¡BÜK[}©©¡×ŒÛ©™†RLCyy¤R”g¨ LÍ#…¼©¦Øó8kT\7*®3Å‹¿猊÷ŽŠ÷’8óô´•þwz?¾iÑA6+þ6ÍÚöj’ûZ\®Mµ–iÍ-­í´i+m>m“âs ,ÞsñC¼Xñ À}ÃÀµÍ\¬.6Ï[v¬ñ_ãkÛU_kv\ÇØÃØÃ×ÿuÄ~C¼Åðå7|ù _[Ô-¦/#7ÿŠ¥k¯ótßqGÓÚµMðoÄ ¦J endstream endobj 252 0 obj 3309 endobj 253 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -179 699 676 ] /FontName /LCQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 251 0 R >> endobj 254 0 obj [ 333 333 722 722 722 722 250 722 722 500 ] endobj 92 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Roman /FontDescriptor 253 0 R /Widths 254 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 255 0 obj << /Length 256 0 R /Length1 3688 /Filter /FlateDecode >> stream xÚÕ–TÖWÇß÷Þï÷û "‚?@BÏ”9¦ˆäœ8Á©™.Gh†Lø9%ÂDÌ ©Ù#mK242·Ìœy¶gΜ³Íä¸ÒMÌMm®¢mæï"[Ë9O>>ô¹ož<§­NÿuN߇ûºŸÏçþúÜ_Ÿ €hÔÁ w^EiÒñ5±´Iš1oùÒÔÅÓ@¥ºoYÕŠ҄ªXÀŒ”òÆ…‹jÊî¾ðü%Ñ_•:ÛÊ”ο0)w0à–KùgÊÅýºúµè[ET^±tEÿ9êmÑ¥>ú/ªœWª–(éÏm=¦¢tEUTOµFôÑS—V,xï¶51€-zJUeõÒðGxEôtÑïªZ² ªø™;DŸ DÙ: v>vF&Û>±|üÓøoŸWp c°V¯Ã8ÌD+ŠUv« ¨ ¬“Ò1x»qXÒ(d Äl—:!œÄ>œÔ³qT´2dêDɧa†ÔjÑZ'cZÕF´ê=NíÂÝ¢j±EHqKÍ«(4{P,½ÅΗõjP­ŸÆ2Y«jëñzZ7fçF¹“0/#ˆí¦B_ôc‚º.½—ã÷8ƒl= sѨ犧ÔIµWVguŽ«C*¤Ž¹“ù+“¹&àŠÛн: c¯èIgœH¹]Ç ÿm*SÜ£j‹Ì?_f™ØŒ'žYê‘iš‘aÄs\Æù 1ÍbÉrD>„ÇQàžD‘jÁ2ï1Y+)3{Õnd™f·A¦Þ,£õVç½dŒvüz°WŒµ¸ìõX} A_“š{ð®Û¨·Ëzôv[tƒšÛµ&˜æ à6¢¯¬Œ_òÙ²#)îU¨ý:±f»Úùϵq_Óu´7 óÝuE]÷†yij·{]ŽEƒjõ²1V…¼,uÀíÅH‹YÇ+W×vb†çú<×1Z!=56¨Ó>7?˜û…ÂÔ#³üéSSc}©Aä{Ö¤îëìÌ/t’ÜYAw@ФE´gþSᙌô©ù…©û”oâ„H·K&ˆqz¡ˆV³Ø'NÈè:ËeáN™»Mά ¹Ýx*ÊÕ†µµ·e"öTÛ©¶á}âüqiþ8™ƒPµI oôÅ\ÿ`‰7¼9E€m£ÒrûtDa½§ŽêaíëÑÍŽmÏéåtdbX(GòáÊßÏ70ΟíËÒ5jC¸"^¤šzH 'aôð9ÝT?•m“~3T$»x6üN“ª­TµMvî…*Á‰ÑAÎ}@nOo½ƒõ:%—WEÅžÊi! êh·góçÄ„¦˜½6©„@Cà>Æ#^%º‰žõQßòQmò 2#6èï(ëcιõ1[þ”ã…Šôñ›™âå®p}“º] l ×s˜œqݯ>Ô+çC¥¢d¾t£æV^ÙE h·¢–änË͉o3Ã;o´GÕ"žyÎ1”ÙpæÌG‘¤I…6Óíò›&}+ND|ðð¨Äµ$Y7XäÊšÁwIb˜ŠxØ;Ò¿‡žÀÌü‚û¦Œ:½¦bnå¢[13¼Knò¿ûB.笗åuÝëj,ÁDiYÝ¥±¥µù_£Š»ÿ0KªPÉݯâîWÑ·J,Æb«äîWÒ7k1ø Û”“ Éä<ò!²˜œCÎ&”WÎÞõ©ÑÏY” É/‘3É/’3ÈéÜ©Êùää4òóäýäTrrç{âégÙÿ$Z&ðFßGy<™Gær6ã(ßKŽ%sÈ1ä=ähimäÌYy9’Ì"G™b3Nyy™A¦ËÿÄC)šBÞ‰Á2†+¹Õó„ÞA9„^ÂòjyO6 ý´§Ê‰ö¶þm´$S@&åuƒO‘‰»?k%ñd¿ceuú"NFt%·¶>òM­Gì)ëÍÛhe#m¤mÛ‹·+†–žd4ÙƒìNv#£H²…žDW¾QàÅwÈÈK—LÚžý/‘Ù—ˆµNzBÒVIAI%ù Ôý«UõÐÿɇ¡ÿw_ò?V&ÿ( endstream endobj 256 0 obj 2030 endobj 257 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /VPRCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 255 0 R >> endobj 258 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 549 549 ] endobj 83 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Symbol /FontDescriptor 257 0 R /Widths 258 0 R /FirstChar 32 /LastChar 62 /Encoding /MacRomanEncoding >> endobj 259 0 obj << /Length 260 0 R /Length1 7356 /Filter /FlateDecode >> stream xÚ­9 tו÷½™ÑH²%d[’mI#y$KX¶å/ÆÆù# v Æc&6æc ÄüKÄ&§ù–†¤ÙnÚ„à Jå%iÙÄB”$„-Ùü¶uÒ§Ÿ“¤Í‚¥½32„ì¦{¶çì<¿wßý¼÷î»÷¾;od »€`÷Ú®õ‚óH9‡uSwï&ç[ïn}€¸ÊëW®]ðÊ8Bµ € ¯¼}늯÷hó°º{–w-ûý檗’[püÔ$è_I¬F|?âîžµ›¶d”ÃâaÄ·¯ëîJUŽøÄMk»¶¬W‡èãˆÉü;ºÖ.ÿç=?} …Eܳ~ÝÆM°Žd!žxÁú Ë×_üófñN~!ÒÈû‘w¤‚„@ …o? üí‡ýNiUß)Ís›P`¤qó!‰Y i±w°~‚õOÑ…±(W9Ññÿ`l(ý£É\p‚—a ìÀþ=dÁ Ôî˜ í0†VÏCÝ{Qî+°B=¬!âÏáÞ^G9zëQ0#}ôâøL¨EÙŸÁ»P‹`+ƒ3p çΆf˜£t(ö&äÃcpüœebƒ8S.L…µ°ÄŽ@TàL»à^"‘±qèÀ²õzþ.ÆÞÄ}ñ Ut,Gɹ¸Ò1¢!$}h=¨O4áJ­8â8QÓúØ•E„j˜ m¨÷vØQ³W಄nb†bu±—b¿–ãÇg¢¥Ð·ÂØ„+< '`¾&­TsÇžŠÄNÇþ€²½bÇT ÛPÓ•pçàŽï`ƒI"™NªIé#‘Óä-br˜½Ì0+pbì¯`CËxq7Y¨u LG½ÃmÐ…+ßÿC¨ãøŠX‰›‘:òµÓ)t]GGéX†`ÇbWM(z‚GK£æ•p –ùh·ÍÐ ƒè»GP³gàœEÏ|ãð5\#ቚøHgŸ…úý†¼OõÔL%ZC?`üL%³Ž}ƒãBÑÑ?ÇÚbí±;c'q÷ïãZòÎe;-‚%¨ñ2Ü{/z{'úN.»±ìƒ'á'ð,FØQø®ü®ý:¼ ïáúŸÂg¨Ã8|…k0Z$K ±añ´Z%zµ‰Ì%½d'ÙEv“=äêxˆ''ɯВõ´vÐt}‘¾AߢïÒOègô/Œ†±3.´ñ¶ž]ÈáôÜmÜvnwT5uâ‹hItAtI´7z>ÆÇô±¬XolGì‰X½úGÅ’j0€$ôˆ½z ÌÁÒ„‘ÖK¡VÀôÍ´æ£hÏ⟅#è§Ÿc,ý w÷zý=øwö¸ ÅdÀ¢S1ž³Hî¨wÔBæ“6²˜,!·‘¤‡ÜI¶‘í¸Ç,ȸ˧ÈQrŒ¼B®/ÈWè^Ž&R#uÒlôL=¥ ã`-ÝN÷ÒïÓ‡éAú$ý ý) Óãô,Zãse=ãaJ°„˜[˜9Ls's€ù1óæ9æsg®1Ì[Ä–²·²ÛهؗÙw°ü‘3rn7Ÿ[Æ­áîàú¹‡¹!n˜{»ªšª óßÌßÃïãå‡à x~€'íæç%HÿëóCxžž§!ø>E ì¦Óðìä“硉]£˜}lô?é#äWYÐMŽ‚såÁŽÕÊ<Šçb¿Ã:ŽõJ´ó ò¢/Å.1œ}uì· }Ø'Þ„'â<|ÂjÈÌ·1E¿Ë0³à[#XŸÈÍÉögMñy3=n)Ãåv[zZªÕbNIN2ƒ^—˜ Õ¨yÇ2”@vHšÑé gv†ÙLiæÌ—ºÐu¡3ìDÒŒoË„Š˜óÛ’A”\ñß$ƒqÉà I"8Ë¡<'Û’œáóu’3BÎmÃþýuR»3<®ôg+}6SAtˆ¸\8²öÔ9äÓ ÏèíéuÖá|#CŸªÍɆ£¹b(Až9 µ];z¬d‰P8Mª …S¥:…ÇxB]ËÂMsÛBué.W{Nv˜ÔvKKà Մ þÉáÊÌa¾6¬ªÅ©«ä À€óXö©þý–vú—I˺·…™®vy £?l‘ê–mcÖoÐë½ÐþIæGÈ SÏŒ®åý3Ð43ãh§ŒuíG¬qžç¤}ímaÒ‡;eueÕã›X.…dJçjgX#ÕH=ý«;ÑæiýahÞêNK ŽÄðÅrö·´I®pUºÔÞUg;– ýÍ[_H :S¿ÍÉɱîœîB“äTçTËpºËº3¿;NóT‚"7ú!ÂÆæV#²"Ò,ÜEØÙíDÚ$ÜÊ4¹Y> ú»§¡>í°*¬©íìÊd›rArö èFiü³oSº&)*ð%È]ÙÙ7ù×ûa¿?œ•…>Gÿ,G7¡j• ¡8'»7œ.­œát44¡»ÚËhw—KvÙ@$K ïšÛǰ4}‚{˜vÊœS×9)óeήëœÃ;%ŒÆãÊ)%¬Î¼ñgÌI¡ž²01ÿ/ìå ¨|ÞUÞyä·^MPÃò!àT!J"4+˜Ä0 Uñ!©jÊ„8¶]!·ƒÕ/|Q>Q>ÛÙåPU.L ŠM~ždt½X“TS#W˸iÿùZ„yíÚ4PnszÌ*§q­*ømp·9ÉœL-:‹ÞfŸaZ¤^&mUß%õzöxN˜^Õ½jºì¾ì¹¢R’’‹M))-&w[**,68M·Gr{0½0z½MdìöD ~Æg¯œ¢–YSŠÝ’Ã4eJ±ÃQœT\XTl2;M,˱A'°lP[ œó å$à/÷ §öês­þÂ(Ïí¸8*\µá¢ÑTÀZŠ577÷9a)W£É"SxNð j”·òlîõ.ÉÍÏ#xÛ*™Š%©’ez‹])*^Å3…2ñ&‚|Ფ¸Š'©Œ—áõ$%ÙbF¢~fzVúÕݬVš×â®H[—Ý1§¯x&9mOõ—N$ݾ[æMœkI÷WNÙšÄМôYQÎ¥JvÜÆôO)O x¨ËÅ'»Ew„T¯ËMœËÅjLYÑ‚‰ïÏð1.I¥N̰ß×NZùèô9‰) %ɉ¬ ˆìô“ö[T0ÍÙ¨›a\¤k5®ÐmÕlÑhFtg5gt_ëô:“›Mäô öÄ ‡t=íÊÈ4%'+v¶U8êÝ:ô‹Ý­f=hs+²”e=ÚLϤá;ËCÕ¸AcèÙD¸T‘6nMaCЧ°œ“mêý‹*ö2£ÁÌ…SK,Œ+I1›^ZHóÜ•©W“qfØòíuo¼³È×{õÓI•ä˜ ¼“ºÖ;G¥çRí{l¹4Ÿ­]èææïÜÓrš†Û'Â.>ɵ˜-­?ΓéÑa®~IÇ5Ε浔ã­O¹ÁùbŸ0g¸íðxÐ]h ¬ lÉܸÏÝïÙ—ù¬ã™ÌGŸYœYŸÉRÜÚõ!IÁbŸFÒ6RÜþ‚d0¤úr¦¤ˆ&·o„þÚT¾ÀëLð•ÙÜ…>--¸Ý…Ú¢ÂfèÀ˜ —Æå°¯š @Cø'b©„/Çý×È—ˆäçAé ñ È%ÞâJRRI Ì)<ƒ†‘;ɼJÊðf–°Ê!“2Ù6…d¡ŠÓYyW‰³1ȯ±pzzaÕwÝÑwù­ß®lmåÉéƒÍ•O>°³`*{Ô,%êRyJ‰Sk‰U­ÖM$î*[þÀš¯/¿•›“^ÿñ¯Ì鈎ýåÇÞ€œçlh·£x¿ úàÉn·à¶ E6.ÉÖhé°lËØæ¾/ã>÷!ûA×ÁŒƒî#ö#®#GÜ'í']'3Nº_7Ÿ±œ±žµŸuÍ8ë>ãy;ëmÿGYù¿–œ‰Ølöœ®uæ¦ ‚Û€~ ’Ûšž*Y ÑB-F³dQ¯'=>^R7êˆAgõIn1'×fl9Dr猂ÐlÊ ¹éøªM8AnºQ`-:°ZThÅo‚BÊÏ3¼àC'9Ê.òËù¿Êh)ÝËåúõ誽jL¤r‡È¾Â?Ùw¦RciÜ7œÂ8žíŽ8ÎìÅì9ªÆÑr#¨¯w1ÂïÄdZ÷0?é^ s# è g³gÀ¢'R†å®Û«7çî_P}PyybW˜·™û HŒÁg8¯£Êçõ”•&O²ºâÞg½#Þ3ÞW§_ö¾Uziº­`+½¶©åÅõUí ­›{M¦$$LÕ”X‰¹‚ z¾zŸ=;T¸L ë´RB£¡°Àa'&U©ÛXjð½.ß,_£° @49ìŽ*£)M¨Gi‰ÙÀÑCîÚì„:û2û;cw;êK{¬£¾ÆîŽ- ffu ÷œUN2€§lG_á£×ûZÇkÖn¿îÃÑÑë¯CÙ‰½˜yÎYÓd÷É^W¹è)£«ÕZ䈺 ~ÁZ±,m]έ9Ó™zò±¯0Á*í›»~ÁÓ—ñ}w6º€éaà7ø† _£WÛhÐîJ·äرIM6ÑdÐ z[^—Bý|Šdn´ò4B*‚fMÉTä¤Ûìy|®¹Ô\æòåN/ ¼{é|)2~L&ƪ¾˜¨’û¯÷ûÕð¼:í|šœ¿©œ¤D¼˜Š‹(Ưb;OÉT ’ã7ƒÉE]Ïfü¤éŠ}™©™)z•A“¹QÊŸ{«Ê.cJj}Pð­ÊïL4¿ÏWPy×ÂuËž\5¥*z17ɤå8ÂLŸFfî:¾‹a]E”;ßñyxÉHƒÑ•¨Qg{ĬéõkÆvøâÆŸø•xWžÂ¿ûÓm†ò/ Q+ø©‘«[¯CÙ‚x‹ÜŽï Íuyª Š5D=¢NS¥±ûoúfU³¿‹s­ g7ÆÆÙ°Žð1÷ƒ ¡‡¹?vVþÝ‘hÉ~ª§‡™ƒì=œiR5ìÅÉWc¥ `)à?!!N Ó¤*ù»váŒæÚ†˪µË7æÌÚÔuûªnPÞoûÖå°ü;¿¨åmæBJ s`.,x‘>N¡DúðpS©¡ýUƒ<=4khÚ04@m84@‡Ä¡2zHú݃@¡»à•ã ú=xïØ…@¡ÿ€@¡;ðº*BïFÀEèvl„nCÀDèV¨ÌxÏߌ"´7h@H ‘¼Q«“i¹ÖƒŽ¬VÚEJ;Oi“•VPZöøzݺõºj-ù5ô ~Zi»•6)¨ïÑý¡G7Ö£;Ý£û×Ý/HÌF†]i¹`òlÝùÙºðl]ÿl]ùl]Ál]Ölyª?Còǔ֥´Ž ¥A÷UƒîíÝ º¡]wƒ®¨AçiÐEÈ¿}º÷útÏöé2ûtRŸÎÞ‡Ôç  9Iž‡FœàÂpS¶ø"yœ¸K‘ü˰ó¤XJNA+㿘„# *ðÔ£ТÀçÀ«–éÃMÅb„,nª@°x¸i!‚…ÃMK´7-Å%@“2¤eØ9&VI38•)çL.1¨ oAø™ÃâJ]7\»T¬Öj¨UÄ*qåV„6YñjI™œÆ8©¡«Ì×Ï‹ãeÒ:,^Áy<ÃâG-– ‹x#ô¹`‚ø¾wL<×ô x¶)B‘ür ’‡Å_zqÈ ñyñ ñ¯ByÚ«Lr(.ö¸3¢FðH\úaŸ2åC¾9xBü¾÷¼¸S^gßlóï¨UÖ^+}8¹+|câRñ{b³W«SáÞÒ¢¬=«ì¼XïSæŸ*bÈy^¬ñ) E…QÇJâÓNc…¢2[þ€B Äw’ƒ[ÌnQt÷£šž At‹DWíJq¾¨5ƒ'ÉnüÐ$;ƒ¥üà“üà.~p#?¸†\Ͷòƒ3ùÁiü`.?˜Á:ødµI-¨õêDµV­V«Ô¬šâ¹HŽÄ> fÉY&Y%È@ÅÊ-«ô “ÿ¢ÀD‰šBCµ•öƒšîÃz/Ö=XïÁº ëN¬wc݆u Ö^¬ý±_GÐ~z÷q!Þ½›n›$n£÷Nöî¥[&{[h¯ÒÃCü‚¼&ÂáÀ»x¬/Lî«öµ…I˜H¶íV³¹·ÊZeª4–Ψûަs²õóXÿîþ›ÒØ´õ—¦Ÿ£éEòK¥=v‚_çÅ#¼"Ñ8AE`P|œ°ÚÃ4Îk ¶·‡ äNÌÞÞΕ§¡U´"T7B+eÐÞ6ïÓªP³L‡÷ëÚQl¡"†Y» Å L(Fƒ(‹¡2‡±î¸˜“VÊbM2@1ºœŠ˜“nVÄÆd±cÊBuÇÊÊö%Ø ˆl`_ºIdàÛ"ŠÈÀ¤Hº"âõ¢H­W9–áEcÞ …íþ†ÝgçÆÙ¹ »ä¶/ή³ë‘íÿ|–×ü=Ò¡UójÌPUeU>åøÄ°Jª óÒßšcãäƒ]€ÿuì¥ endstream endobj 260 0 obj 5324 endobj 261 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -26 -208 768 686 ] /FontName /ZFRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 259 0 R >> endobj 262 0 obj [ 667 556 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 500 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 444 ] endobj 120 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZFRCJB+Times-Italic /FontDescriptor 261 0 R /Widths 262 0 R /FirstChar 75 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 263 0 obj << /Length 264 0 R /Length1 3844 /Filter /FlateDecode >> stream xÚÕ—yTUׯ¿s§‡Šø˜DE"¡ÂC¢FŒ`ÐXçjjÑ(qDmeHP#ÁÄ8$H55j©jmblB‰Ec¬•%F ÚX%ÚDÓTãØ*M­XW„G÷ùÀt­®ö߮Ջçw÷þö™‡{žPü±&ÒçäÎ*{¸(Ç%õœ³tqTÞäKìk€’S0?wVX[ìfÑÊæ/*ʉüi/ÀÜ ÚúófͽZž8!pþ©Óâ¿÷‚ÜÅËBW©hñ Äw/ÊŸ3K=‡[⯿cî¬e~ÔZñ¥>DåÍÊw1r©!þ.ñ{ä.öUc£øº<5¯ û-ï›âßüüESÐãÑ#r ý„GÆeµ'0ëŒ0 SP‹luÕj3JU"^較j‘4‰˜iî<Í8½8mLG½x9H6ºË{<“\•†aD` jU9jc˜Ú…mF¥Z×0 ½¬8ÉyYænä"ÅxÙÖ÷5. ÐxK”…È6†ã;¨°î` =Ó±UØaæW]ÙÈTw¥öøj Äl”³¥§ÔiU£Îª/IøXRÍê„=Š92Þ04Úµ¨1Âñ$jÄÇ0ÓjÒsˆxé¿N9j³]¯¶Éø'Ê葌­xIô­’¯ ÉfMé9®c´üÅ›¢¤Ø%b’˜dŸÆ4U‰%γ2W3kT5RÌ »D¡_!­©ËN[#ÎÉÆ:\·«Œ¡ÆY<ãŽäÜ/ì2c‡ÌG]i”¨Ùms‚ñö$”Úe‘™ñÈ{º¬H/û6&©}F"ÜæµóþÜØÇŒ«†¿3síªQÝuú;±ªÚ¾+›¦DÕ:©ªšuÀìH‰™ÇÅkV´b5’Ò]Žm™†BB”»ÊˆýöܪôïdEêILø77Ê튪ÂĪÎEQ{[['fYáöÔ*»g•ëWeÅÆ\øoÁ ‰ c&fEíU®™íÕŽ˜™)âä,1µ'²è#2õ®5ã+·rìí²g]Kï`ÁQ~¶a¡ÿñóÇ“án8Þp<)8Ðë ôäXh.4Û/ûÊ]wo=åă' Km³üx©#8ÝÏØ€R Êr7ÔIùæIÊ“ê±ü›Çš»Õ¶Ræ×çkºÌø”¤ëÛ+:2ÔdNJìÑ5 £JÔÅ.kmjùj§.²… Ø[b£×Æ$%'„õ ï!ÝŒvzvžœÙ1¼‹¥z[=û"ÍÝvÉ;ã’·¡î’[Œ†+uAƒå_2ú7z¯œ™‘Öèu×y½aZeJRúÄ¥zBThàÃj¨ð`Š·kXhL´¡B,;4¤k˜Ë“ª# :Ú§ŸG²H´«Q;¾ØÈ+š°¿¬hSdj÷Øt¯ï†ïæÄeFËËÅãµé͈ Kíµ±xƒºl¬Yø¨o?º°¥¸ÓËÖ|ðŠe%{ñâ©sêŽ6ããÍyõκøâ¸d˪ØWst3ÌÖjÀj°ûr}"°8#¶òÓ‹%ÉoN¼ƒ*tÃOò„‹Õ–ê—$H2E ’w°¼»IGlÝ$ggDºÏÜü<­)Í-pÒÔÒ„þ-Ÿ–tÓýyKSK²,à@))؉‰B ž¨0WŸ˜h„† Å;Њ»Wšdn¸w=É {û—­¾k¾çÕrÕMu«KÚÓtÅwP¥_ùºÚ¨ÏóÕäùmi ©åuù‡}¯HøXÛbêŸó™óD—´&=4ý|ÿ^Ñýwkµ¯\vÍvqöo.ËØ•-•ò-žâÛyï¼ßªo"÷Ë:k.²œé0äDÏ-á¤Êlo×Â3’Âe^ôl¦Ë<ÃuM¾Íª½WAíu:2W™ùØ#£‡÷›\”;;‘>?||»ôñë_fF«±RÙðÁTiâY¡A[‘ÐD+é#[Èfòù5y—üy‡l"o“'o‘#¿"ÿJ6’7Éä_¤{&þLûºÜ¼seo\§§mWi_!/“—È/É‹äò òäyòùù)ùò,yÏËž´å#Þ)j§Ä¶ð{Ú'Û©•iÿŽW?Ÿ}ÓŠ‰°Ìr>9œC>Af“3Èéäãò»QŸõÇéMc?§ÒÎ"¿GN!¿K>FNæJM¢=‘œ@Ž'Ç‘cÉ1ä¨Ö?IOeý#©dòD?B{8™A¦s4Ãh?L%ÓÈ!äCä`)mÊžÓö@r™BzÉdÑL$ÑîO~‹L$0JØöd<ÙqÒ†-oíÅq‡ö¡KöFaŒÜ¦Ü$åBõ(™#S~¬èü‘T"h÷$Ã3ÚöA²;ÛîÆ\adW2´n™J‹¶¼µ,÷Ðñ‚ÙbP{,ˆ§QÛ¦”ñ‘ºlž®*I²Ù‘ì@ú‘.¤ ùºšàÞQ¼‡ôÿf"H]³bÿgÊègŠºRjß$é5IU’JrÉ/“±kÊTa¿ÿɃ~ÿwOÄ?ÔœG endstream endobj 264 0 obj 2246 endobj 265 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -177 795 706 ] /FontName /FDTCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 263 0 R >> endobj 266 0 obj [ 744 795 549 ] endobj 128 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 265 0 R /Widths 266 0 R /FirstChar 33 /LastChar 35 >> endobj 267 0 obj << /Length 268 0 R /Length1 5388 /Filter /FlateDecode >> stream xÚÍW}TT×µßûÜùbàÊð5 ˆÜ¯80AD*ÑfÐ4~DÃÔDQD@)Ÿ5ÑDHPkSm•eMjž5Wj†&iLk–McšDÓšå‹/®†41Ijͧ•ûö¹CŒvùþxÿ½»×Ù¿³ÏÙçì¯sÏÜ€Øxê›k[Á[hä 5[}G»ýÙ>ù,õôiK[—5oþç¾ ±SËVv.ýâŸ/þÀt 56Ô.ùðDI€¹‘&6Ò@Ì~Ý$÷’<¦±¹}­ùWPN2éƒieK}-œ…|’¹=CsíÚVS>;FòÛ$ÛWÕ67”ìxb!É×H–[[Ö´«§¡ ÚFrFëê†Ö¡«¶¿“ìˆz•Æx<<"5€F>¢o„4j5›p RÔóÔÞçm¨Z½¡oÇÐkê!6pG=ù°†? è ™E°‹Á‡U Ò®õð9ÞKá(|ÝÌ Íà!m7L ýÒ`>œ,W‡ÀÐ=p˜ææ@ú¦z‰¬å‘µØ;0úGa.âJŠV‚RXGà[£× Ý*ïhìò½´ÝýP€ÙC‰DóCPV»¡ÑFÀ5|¡TÙë ¥È^mNpúj—„fÏ©òyG:wNËêåºÈ¥¡Øìáå|TçV‘mwÎrî?tÇ,‘—t‡=Pä½ÚšªP± ·—J–½¡äuؾ¿ëù»e2Äœåµ ]唚îé1È¥ÚÇHª˜g§mÙÖ@U·"Nh¾G¢h}|$¸ÂŠ’K寮AÊ9Ì­RR=©>¹ÖÁì*%Å“¢ îœÛÆÉJÊ€»Ä]Âq²Ã¶1‚>?{2ZÓ;u‰°bîͼ ·$ûÉͽ^3"“¯“8k˜]õ“HžR”ËCQeÁ.ËhUHï´Èö®/€ %_ùäö‘ÚáƒÓòð./çÍAóÃ}í· #è÷ß°%ž4½A¢#«3J˜õ:IXj”Á(!¤˜¢Âì®ãŽe³mÙÙ³®ϼQ<ËòeñLËb˜Z|£˜·¼qâq™Ôœú˧¯?¥oüvïiá¿2è[ ó’,8éY—dgÑÖèdeJ6d2S¬)ÉÖ kæXëØäjkuòrëòäÆŒÆÌ'­O&?c}&yÀ:lµ˜¤¤‘™‚53UNHΡÒ³&ÑÉé¦Ér\azÒDÙ‘*S‹3 )K'šÀ.¡äY™Ö$óÈT—%.ÌjO¸¢FË.fÁ>רÜ3׊o R$ZÅÅS¯,œ_Ÿ\„qñEÙÙÙ`).~›÷‹æÃ…m°°p Äågd8â¦à„ñÖ¤¸Dkr’£@ÎÌG†G“ rJð±©Ý÷uìË-’ ³Fئ´e%äsËu wç™Æß8Y9oûSC‰¾ì˜¼¼èŒ2ü¼\žZãݲŒè<о̴çbÖŒOÇhÒä“×;o¢c¸ŠQßés4Àÿ\„¡§†~düòæÌw3S·†¯¦¯¢³Ã¶ý¢è{Á@= Q&€ñ#ü#ɨiÄïc€8€Ù’²¥Ù÷.onXã.mY¹„¯×u-ÿÞ¼ÃÃç+~½Ó°ÓȒ¬[™&%†YAB˜m'ˆ³G ¨XXÂlAl˜m%fˆaöAL˜m!ˆ³Íæ0ÛD@õAS˜m$0†ÙC˜­'ЇÙèÂlNfk 0"Iž¤iÒ{~|ÃvÚ qgwŽÁ%¹,HÑ[ˆ[XEr€Õ“¬²%Ä?Óø›šÆ¬øK¬–ø1G4wh¼…-%~õïaËhIÓ–Ø2Mž’h–g  D<¥ñ#7zÛÄ3mâoÚħÛÄMmâä6qb›XbÆ·è÷MÄ>7h<Ã](.; E¹«|Hj"ÎÐxšÆ“=‰q0 ¾Ä`@\ÇÄ+vÑ+*âCߢñuoÔø\»4ç‰ËßÉ÷g‰?Íë²ÄIYâóKŸ`"š=#úÅ÷ûÅÌ~1½_ì)þ†NP,ŽPb!jÿˆ4›>r•Æo”Áµ\UjF|¦Ô8 >Uj2¤’üÔ˜(?øÔà¿B¯ŽË±‰q|›4ù¸ÐIøŽâzž–ŸÀ_"ð¶âª&xSqe¼®¸F¼?(®t‚W¿àeÅŸApRñßEð’âÏ%x^ñׄÿ Ás8®¸W(Š{³ô†ÀÍŽùMJM >¨Ô¤lPj&¬Wj&I%n|z5Û‡cXCò>Â6B[+ôhó-УͯÂ&Mn&äó+°IËÅrúÄ×-£˜9Ö+®df‘âÊ!(þ<‚*Å?W*q>øµÍî¿æá<ðk‹f+î#¤vâ$ÿgû_©¸_—J¢°r‘¯òƒSÓž®8÷“vÞpUr‡«áŽ ›<ç8u—®¸ò¤O\fé·,ïyž{çHÞ$sÅIgýñÒëÎAé·ß×ì—Nºê¤—è€ó„uè‰•Žºò¥_ùc¤#þ•Ò3~>– ýŒÖìóï–~Lëw­”ºœ‘ñ-žTi3’hŸÕî4©ÕÆ}'¤wÔœK]Ejr’s'¤ÎÝR£3l"wë{ =ÑÒýäKµ?Gšïç²Y2\’À\üžZ¹ØVGî°¶ÈÅÖ¹µZ"wØ¢Èuµ(r¿-Ž\e‹ŽO“¦åÒv'¤2ÿhén²tD‘й³ŠTä×ÌOp‡yÒÆõò¤H9î,Iò›¥ù}ÆûŒ?0ów3Œã(cš1Ño²˜F˜bLf“Éd0éL̦İzÉ3†ÿ$, :ÎuŒsù)ahb0£ÄƺÀÄ¥¶ÚÃÔ¶PÛDm#µõÔÖQ[K­ƒZ—zé8_=ÀºØú~K¤»ž­\Ƕ ÷¶±µÃ½µ¬Cë… ¹M¾Fuk·Y;¦Ú¦ÆO‰+*÷Þ‡yö÷í[p'Ý[º8*ô“ŠyU¡ÿçuT "4–j°‰,ßç`U¸šMôÍåã¸Ú µJM zY©A RFC/Wƒ^a´¦¶«õõôú¼}½½šŠ~/ôh*=ú½šÊ‘ÈN.2@;y8šÁ .MÍe0s5:š6‡6óx4­”XlâZØ”«mfÕì9¤âwr•¾l')ô9³µéÌï§Ýmº)2ݱßÏçF–;"óšÏþÿô4”þ_Wï¾´ýÿ«”} Ô‚¡îú7´©ÎnïÛ~iø?DF°®¾‘cmCè’Üà m—½ö¾îCw˜>ħ»eoòÝ[ÕwÈÓàUº=ÝÚ?Œã³VîºÍÖö›¶*Þa³ƒ|³JnkÖ®;LïâÓ³¸­]ÜÖ.nk–g–fË·|^éš[ž¶·G:wNÃz×ÿGweÅ endstream endobj 268 0 obj 3665 endobj 269 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 0 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 267 0 R >> endobj 270 0 obj [ 556 ] endobj 74 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 269 0 R /Widths 270 0 R /FirstChar 104 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 271 0 obj << /Length 272 0 R /Length1 4388 /Filter /FlateDecode >> stream xÚÕ—}XTUÀßsϽw¸ à Ÿ’30€|L¢†féš©kø "¹2 ~ÛŠ‘•!•k²l°®ZkfmDFf®>b™¢•’µ»º­‘ìë¸>ˆ3ûžw¨çÙ}vÿÝçÙ çwßóùžsî9 ôPœK*J\ 3ÐÒ)nÉÚjóÊÙµ2Ê7¤°r×Ã%F—À…­þáG6”»zݨ? ïX¶´¤¬;hâ_üÌèÏ^†ýYvõBÔ–UT¯”®¡¾õèG*—”ð\¹õFÔµŠ’õ.¿ öêQ7¯,©XúElu8êgP媬ªö¼Ï¢~u»kõRWñ+˜×?mz´1ã#R!ß|« £UÂ*héƒó0ž”¶ÃD˜ '¡˜õB ÛuÌÛÑ;^‡øSØ`1?€y†à´Á%i!œC­Ò¥(|Ï€9˜«Y’¤X'Yœ”‚¤‰ì5Ø#5³-°æÃ(9söC!o… È”B±¼\Ú¦¨’öæAK“¤þ4Ê7!G™ á¸á¯¾ÖC»…µ/ƒ«p ²¤(…z©{zœ]bGØgìKi|ÄN±!v^™Jå8J#ô)'áˆd‚UpuLäò°ªˆ%¤`ÿE*g»”slŽ&޾Òá؉ö0ŸÒy#Ø8özà~üKáhÉTjQ>…31K¹óY3¬QÅX¡a-É•Zöébf ì+5²EJV‹áIèQÜÒxé3XµÒMÌÙ _(õÒŒ‡Ai–jY©/&0C™uJ=„ad,ø^ˆ32Jé‡Yì¨d`‡¾ò¡ôµ¤W§@™ÒËúØ-5MMd-Ê-  –T³`<R3ÙqÕ¡a‰ZŒãñMÛ¶xá1°;uª"s‰Õ¬¹¥ÄûÊÜÎ ÍgæYlÖSÍšÎ솙îÀ æ6¯wf¡lR湕h7Oôsˉñ×þ›óšÍ:mf¡¹é& W;yqg¢(44£}rM¬^ Ê= r¹ò®Yþ2¨ÌO‘dHë¸Ò‘ZgGg‡=4Ä’h ±”Ë0TÅMC_ytA·¾]­¦í„B¶GÖK)XG¨ÓOÚu¸ d­³ËõÚ™%Ë"뇦óV¶§Žòo÷ÌeœÙ,XäÌ6Ç„Z5cüÿ,ä¡FÞ”al ôiJ²ΨÊ^ ¯—[¹æoÍÅ<2*EJ3[ã²µ+½]]!FGzh]]½í½ZŸÖbp8BAƒÃžË23²³Æ&%«:5>.)klvf†1Â8¡->N ‰Ñ ™áaª.–!1S2Û´¼à'×Të§'ÇŒ2Ç™f&å»­*k½zîųõO¼{üËC•»F¼ä¸ÿÝ}ûÏ&Jª%Î<*:V'Go.­Ù}øâàv¹¥³é‡êJm©gv¿÷ÝÒÙ¾xOõöðŒ÷H…ùÎ ³5<Р×[¹SRTÓá,ÜÀ›[™uŸáŤª´À`}D¸Y/Ct0XãUkpJšv¥½·³W»€CǦ‹Á÷õjïõi}hðýÛ™oxa8|žœ@ãŽ0Ƨ2²b" áaED _ºÙ°aÅú†µÕ«?1zNo)]ÕfÌß9'kÜÁ\óÑÖþŽc}½Ç‚£XÕ…Á–½í·öK{´ŸyhõÎ…ËSïš½"!|«çó×=žÁSç™$Ó×ò*¶Nqã8ÍNÍÚù)}€?ðwרz­sd¯Qô½¿Ëá°‡N`Ã3ÀãϤ¥ŒJ ð?¯ŒŸ;Ú¬õÌõU`ÜbðÛ– eÎñ©6‹ L‘ú»^¶Ûœ¶Eú™6Ù–nhÒ«‘-æ{‚+Áp"AIPÝéU9–MõO6 7ó±9Zgg—Ö}¹½Ýà(¢ðuŠðõ‰ŠàáÒÑÎØY*óÅlxI N„óã–có-.–9qëÎ-o¤XÌV£)olþ”{󢊌± qæÈy#÷UÌp-7ópí®#åì†É5}Ù¶“,É–1™É çÌ)1Å™Ìq‰K KÖ•š6olÜ4ïQ<ò¼-xæu*£iÆ@u~ (ÌOlT`˜$Ðð»ç¡ŽÔÀó˜P ™ùƒ`âh5à;ß‘XFE™á9‰9!V»üÍÕ¼< ¡}:pgÒî|zÓ7ÚÕ;wÒqçX8¦P5Þ !XÌFÂà 3#GN¾]g—«vÜî±ËÆWãõ\÷<Î6³HÙn{ Ûs‚9»[¤s+=GVzrwû\ls{åiωntèûŽPzºÞë\œ7 †&žïÜÞðýÛÛ‚_ŽN\U€g­ïü¥2Jóf<—çzݾâ·õÏ÷N>årbÚÎûa*ÄõY ø…/÷¸Ú˜•Ía¥)TZñ,7aœDt¨ƒî:ž×l¸—†á6TŒ<ôà=÷O3{CEiå#bÓãyMÜþãûW5ß+Õ0<À™Läð(R"™A¼Dñqˆx›8H¼Eüñ&q€ØOüŽø-ñïÄÄ¿ûˆß{‰x¿Bþ…ä¸e¸^zH2‡¯Iî&~Eì"~Iü3ññ â‰Wˆ þžø;âçÄψ—áq\§ ¾ãQ»H¶‹(Ëð ÉSX>"ù±ƒxÎ Ï’ü!ñ ñâûÔ÷Ó$·OOKÑI£™Hòâxbqñn¢Ks\sBÎ!Ž%f3ˆéhã`'9˜J´­09†ä»ˆ)ÄÑŒm(øZ2­Ð$’‰ ŒŒÇSƒã‰Ò€´ÝŒ1âø;Hä%K ÉÑDS¾oŒ$FQÛ‘”ËHŒ †SÃè„A¶¨à[ØBñ,š†Z(µhöh7 ™cQ” ¦ÝD–@¢ž8‚@ô'úuxGçøÅº@¿i……Î(:‡8žt1D~÷Šþ/ÆÑ/Fk Öþ¦½˜Ü˜N`Òámeú¶zV5æòÀ˜ÿ»'柋€Ü‘ endstream endobj 272 0 obj 2719 endobj 273 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -212 604 711 ] /FontName /DWQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 271 0 R >> endobj 274 0 obj [ 744 247 549 549 494 439 ] endobj 89 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Symbol /FontDescriptor 273 0 R /Widths 274 0 R /FirstChar 33 /LastChar 38 >> endobj 275 0 obj << /Length 276 0 R /Length1 3788 /Filter /FlateDecode >> stream xÚÕ—{xÍ÷Çßßßåœ 8NBRÎAÈinKCÑ$™ºÍBIÅ%±V$¥t.©ªEÖš²Ì2k»2Õ®= µÖ’CkפìÂL[· ë:1O%'û|ß9¶çÙ³ý»çÙ/¾¯ßçóþ|ï—ß÷€Šõ0‘1¿¸ TìÑ¢4Jê3årÏ’iå–Ø×#¼°´¨¸ ¢Ô%v«h•E‹W^ =²0·Š6yÑ‚Wºe ìóh‘¡ï«&À.þ€EÅËW…ORÛÄ&¾kqÉü5gÅÏ¿sqÁªÒ.ê9ñ§‹ïYRP¼ð“¾+ ñ—‹ß¯´¤ly /ˆÿ’øCJ—-,Í=yŸøu@H¨h zçømŠ&8|Væ‰ E µ¢h‚1*573eذ)ª67µiQvN¡*“1·×Ș›íÁœçh,ÏŒƒ­BôdCI2äÛá–wz ]‘nikABÛÇ'$Ýt]hkiK’…Hóš’Â1ôpÁë‰pŒéžáHIN³Ý«H´Ê¶Þ»žhE¼ñ“öÀµÀ³j­ŠT‘ǵ\ Ô©Œ+_Ö KµKÃvt„ÔÚã%'uW$|ºc/0½W™ûx÷‘-zhú©{çÞêûïöÙqͲãä#üv²Œ]ÝV-ßÔý÷·løgäþcYgPh-@ž‡¥r2ç‰Öã l×ÂÓ’¢d^ôlfÈ<ÃyM¾±*Ø+w°N‡ÌÆeM“3zè´ÕÅóJësÀ'ð¦þÖÿ‡Çú—™Ùn¬W60•EšxFhÐV$4ÑNÈ6²•¼G~IÞ%ÿNÞ![ÈÛäßÈ/È¿’Ÿ“!o‘7ÉäŸyºþDûºÜ  do\§§mWi_!/“Ÿ‘Ÿ’Ÿ—È‹äÈóäïÉß‘¿%Cž#ÏâYÙ“¶¼cÄûˆÚGb[ø5íƒÔÊ´E6’ 8%|Ÿöiòy’ü%û~‚öqòYOþ‚L—Ò¦ì9m§‘_!SÈd2I4‰´ÈIláPÚCÈ8r0I¶¼µ7ˆ;t íXrº cäÆ0å&Ù)ôR÷È™òËDçïK%šv2*³cô&`Û‘ÌAö"{é’Ù GiÑ–·ÖÂäš(^[tcnžFm›R&@ê²ÝyººQéJ†’]ÈÎd'2„t"U诫 ÞQàÅ{Hÿ¯$šÔ5+ö®Œ~®¨ë¥ö%½,É/©N’S~™änªTeCÿ'†þß=Ñÿµ£5 endstream endobj 276 0 obj 2181 endobj 277 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -177 604 706 ] /FontName /FDTCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 275 0 R >> endobj 278 0 obj [ 744 645 549 ] endobj 115 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 277 0 R /Widths 278 0 R /FirstChar 33 /LastChar 35 >> endobj 279 0 obj << /Length 280 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 280 0 obj 1919 endobj 281 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 279 0 R >> endobj 282 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 130 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 281 0 R /Widths 282 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 283 0 obj << /Length 284 0 R /Length1 3632 /Filter /FlateDecode >> stream xÚÕ–XÕWÇßç|Ü+^Ф…è%E$ Et¤â¼(’¡9‡ËÐ) ["wâÏéò1sHÓ\Ṷ̏eÊl»9sÎÌd®tÛš÷G¢¿$y–Í›S6ûí‚@ àäŠÿöybˆ~EµŠ¾Hô~ó*-óÕ¨•¢7ˆÞc~å¬2RÃEßcZQQ¶,èV‹~@tÿ‚²Š9g{¯”:oŠÞ'XYµ(ü"ŠÞ&zFpáœ`ÉîÁ»·à›‚éé‘‹SzG,ÿ|´ôõ“=Òs\ÁIŒÀ:½£0Í(Q—±WmF­ÊÄzñŽÀ3Ø‹c’r‰Rk§äiÇ)À)='D+G–¾M¾q·äjÔZ'a1šU=šu¬¥ö`»nT«°ÓÐÇN•œ×QlíC²õ.”Ø÷ëP¥ŸÄbåCJôh=±‹Fƒ}9N¦ãBØiU苞ä«6©}~sªs0uz¦´ô°:¥ö«Óê-]„WÕQÕ®N:ãø–K/pÅiÆ~ˆ°_ôDŒ²ìˆœ{¤IûM*W›j»ô’ôþ ²°›Ä¾Uò…e5 Ó’–ã åM³Ä’íT‹|¢È9…iª‹Ý‡d¬ÄgíW{‘m58Õêu³2âÕ7 Ãìdê–`.9!=RŸÆRTë›’sÎ:uz§ŒG¼Ó¨«ÕÌÎ1ÁD§µNzÈÈ$ËwºÌHç:ŠÔA ŸµS5}86ÎËú¢Žv 0Û¹¬®¨6w ›¢ö:m¨VÍîPŒTín¶:ìsc¥DµŒãá5«:°ƒ×±-­á÷…tÊ—f‡wûOMÎÌø7ÕïóøC˜ŠYî?ÐÑ1©ØNt¦†œ^!+ŲSúžû8ç¹ÌŒñ“Šý”gl~¤Ú±¥ùbœ\,¢ÑÄ,ö±ù™+º<\o—;OÉÊö !Ðņ«¼Ž¶1°åLK|­-­-ƒºÇ%Ç¥$Ç%—Ûh¯²Û/„ë=±mï-tÓÀS®Ð…Î Ä`HÀ×óˆg}ìp5Ü)T…Î}ê>ÇñÀŠrÑ%Êë»~~ðù¸aòfÀwÞƒ”«ã|ñ žþæ“£ woÚ´;­õÝ«§œ[Ã÷‡Ÿ7…ç?ž¾M½¯üòÞØÆ˜¥scæÀëQ&fW·«Ntu𛦧ºSõ–è-QQ…®Qv/LìÜëÿ»{NÏø8Ÿö¤Þn>¥©­×®µ¦6mÜèìHߎ Ÿ“7z[zƒÚ¬Šå}¬sÌŠU‚«C³^wƒ ºÖkÃQ^_knË`¸öËg.RÉCùÚ±í…Ö~“TBmu-x²Hš±hé‹÷v˽¡”—ÇÆ‘n-ÿè[®™9!ªûÑIdN´ÆåÌšnºuÆ»æ?Î(Ç>‰rmšÙ$k» ¥öl‹úYy§ËŽ;Ä”3*Qú¢áC@úÏ;r©HËâ#õº2¾˜0æ®1…£Ó'/¯˜Y9ßôŸOxìÊÿö8’,t•“ԟסW+aXÊ&-<$Ô” Ctaò²¼Eþl#ÿFÞ$o×É÷É÷ÈkäUò]ò ùWò2ù¶òÏ”/áÌ–v_¢fd )¿M^ Ï“o‘"Ï‘gÉ?gÈß‘¿%C¾Iž&ßÀ7$ÑÞ@_Ñ^§íu‘müšòkË«”E¶'p\ø å—Éãä1ò—lû/(¿D%›ÉŸ“‡ÉŸ‘‡ÈŸ’ñî”vìÔ:^“øÆbÉôÂ<ëÉob€aÇUiÛ:Z&k"k§wˆfdKn˜µìO5sTsÞÖ²?kdüΈg =kpD<«±J¢:ôXB3«ðuäŠÍx,¡c1»Õ”\I®3ÃäZÑ©1΃̵œ–eäRr {½8¯s_Wa!ÆJɪN%Å’† gÿz‚¨äì9ûA¶­ Ð_l•œýJ¶ÍX,|eæ‘sÉ9ä,ò^²„œAN'ï‘%³×ï¡6íœJ¹˜ü*9…ü y79™3UDyy'9‘ü29OŽëø£´ô‹¬¿€–|îè1”G“yd€½Eùr$™KŽ ‡“ä´%kÎÈ9ä2›Lf‰Í ÊÉÏ“™dÆ Ó)ŽL# Ub8ò5Z*WhÊ)d?tö•Ã’{¤^˜L»_ÆÈ’<“¿7-I”{‘‰yëà3ämŒýiæJ {’ŸŠÐ'£ÓqÑ‘¯±u—{h¼hÝ1>â‹çn4²%e¤)Û»+––2šìJF‘]H/éÁP¡+§«ÞQàÅ{È’[.‰45+¶¿Tz_*ÖÕRûFI;$…$‘äRjêTUúÿäAúÿÝ“ô½ÃA endstream endobj 284 0 obj 2012 endobj 285 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -197 550 725 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 283 0 R >> endobj 286 0 obj [ 250 600 600 600 600 600 600 600 333 333 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 123 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 285 0 R /Widths 286 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 287 0 obj << /Length 288 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 288 0 obj 1919 endobj 289 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 287 0 R >> endobj 290 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 57 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 289 0 R /Widths 290 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 291 0 obj << /Length 292 0 R /Length1 3532 /Filter /FlateDecode >> stream xÚÕ–TÕgÇßÏó|¿÷¢!^A‡Cï"’’ sê‡Î¦9Âe茉"rJäNÔét‰2ç ÙlFFæÖ"ç–»c†Î–ÁQS'n¦nö[¶üUJËÄ<îíó¼/îNýÛ9}ïy^Ïç×óû×…‹*äÌ+/¢'îK«¤;æ-[â_4½Úù" û–”'}"wŠ­vÁÂ¥5ÛÌF@Í.›_\r>.'p$_(Cì;êàúE\V¾dyï%²›g[]X1¯÷à¸èù¢Ç”/ÆôTO‰^(ºQqùü¶kEt— +*—„ßÀ³¢×‰>4¸x~°è•‘ÛEo–â±bS°ã±#ò Nò´ü¬­Ç0ëõŒÇ ´ H]F£Ú„•Ž âƒhÄ!IÙHÇÓ 18‰=8©gã¨h¥ÈÔ·K> IT½Ö:KÑ¢6£EÇéñê5lÕõj5¶a:©y …fÊ‘¥·£Èùº^ç*õKXª|¨D‘ž §õШs®#Û„Ùx!4˜r}Á[„âÝz]­æFçÓÜÔ¸µè+3|¶¬È@÷ Ô^ŸiP;nÍ{D_бžI(q/«vuÃ3“¢Ý¨V-žQ§:=YjŸg´'NJTË<î[¹nuk‘‘ãõ¸ŽÑ Ãý¾NùbI(çË…þÃ3éÃÿMõû¼þòC½Vø÷D"ù…N’;3äÞ2)1!'eÐÙÿæ<›>|J~¡òNÌë®vâœ<1N/Ñjbûļt»k5JÛR÷e9^$æôpàQ1®v0¢µ­5¾S­§Z3úú¤úJtVš¤ÎsáÍÞ¸W{ÒÀP¨¶:±:MêHȉÑQã@9¾S¤|çå pb;§š]jkÄ›H£œ×SîP¶™Œ%¹ipUŒmJ’†OÖ1 è'ô!Fb’Dê Gõ€W$±ÆKž y)ãYÁE‰ì…¾®œÛ1Ö'ð½ßÑÕ]ï”tÅw¦«£+S:•0’<ƒüèãCÀŸè2è.ô달‘ÙNêÍš §rãÍKNâ«?„/†ŸT«TÕÿ@ÆîŽóáf•sþ“F}tQ¸iQøî¢.µê@ÅÁpóyq‰Î Óª«£Þ}¤÷Ø;4û5¿usÅ­<Ò(³Jfr{Dï–që»êå~™Þq³-fͧž[ŸqŽ¡Ô)A¡ìй¢ß%wÚNF<GΠæ,æÈüÂ{‘¾hoâ»ëòÈ¡`´û˜0lúŠò¹ í^à~ÍÞwÿá3Ñ,7¢«”‹0ŒrHƒ'„š²"a‰&»ÈNò&ù yƒü'yì ¯‘ÿ ¯’'?&ÿF¶“WÈËä_ÙË¿P¾$/H‰ì‡KÔ¬lpòyòùgò#òOäYòCòdù{òwäoÉß§Éð¤ìCWòA¢ í„È~Mùx7­å=Êï’­äQ¾Cùy˜DNçJPÎ'$§‘_"§’SÈÉ‘?JOïgý“hÉ㉾ò2—ÌáhÆS¾—GŽ%Ç÷£¥´‘=gålòód9’Ì›AåäçÈtr8& ‡Qþ,™FEª´áJnµTîÐ!”SÈÁè-$¯…‘d³0@»_æÈÈÿ6?€–dÊw’I¹Ñ}py;ÛîϨDò6²_7}2;}ÑGZt%·¶yƒ¦ˆ–Àã»}ñ> endobj 294 0 obj [ 744 549 ] endobj 24 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 293 0 R /Widths 294 0 R /FirstChar 33 /LastChar 34 >> endobj 295 0 obj << /Length 296 0 R /Length1 5388 /Filter /FlateDecode >> stream xÚÍW}TT×µßûÜùbàÊð5 ˆÜ¯80AD*ÑfÐ4~DÃÔDQD@)Ÿ5ÑDHPkSm•eMjž5Wj†&iLk–McšDÓšå‹/®†41Ijͧ•ûö¹CŒvùþxÿ½»×Ù¿³ÏÙçì¯sÏÜ€Øxê›k[Á[hä 5[}G»ýÙ>ù,õôiK[—5oþç¾ ±SËVv.ýâŸ/þÀt 56Ô.ùðDI€¹‘&6Ò@Ì~Ý$÷’<¦±¹}­ùWPN2éƒieK}-œ…|’¹=CsíÚVS>;FòÛ$ÛWÕ67”ìxb!É×H–[[Ö´«§¡ ÚFrFëê†Ö¡«¶¿“ìˆz•Æx<<"5€F>¢o„4j5›p RÔóÔÞçm¨Z½¡oÇÐkê!6pG=ù°†? è ™E°‹Á‡U Ò®õð9ÞKá(|ÝÌ Íà!m7L ýÒ`>œ,W‡ÀÐ=p˜ææ@ú¦z‰¬å‘µØ;0úGa.âJŠV‚RXGà[£× Ý*ïhìò½´ÝýP€ÙC‰DóCPV»¡ÑFÀ5|¡TÙë ¥È^mNpúj—„fÏ©òyG:wNËêåºÈ¥¡Øìáå|TçV‘mwÎrî?tÇ,‘—t‡=Pä½ÚšªP± ·—J–½¡äuؾ¿ëù»e2Äœåµ ]唚îé1È¥ÚÇHª˜g§mÙÖ@U·"Nh¾G¢h}|$¸ÂŠ’K寮AÊ9Ì­RR=©>¹ÖÁì*%Å“¢ îœÛÆÉJÊ€»Ä]Âq²Ã¶1‚>?{2ZÓ;u‰°bîͼ ·$ûÉͽ^3"“¯“8k˜]õ“HžR”ËCQeÁ.ËhUHï´Èö®/€ %_ùäö‘ÚáƒÓòð./çÍAóÃ}í· #è÷ß°%ž4½A¢#«3J˜õ:IXj”Á(!¤˜¢Âì®ãŽe³mÙÙ³®ϼQ<ËòeñLËb˜Z|£˜·¼qâq™Ôœú˧¯?¥oüvïiá¿2è[ ó’,8éY—dgÑÖèdeJ6d2S¬)ÉÖ kæXëØäjkuòrëòäÆŒÆÌ'­O&?c}&yÀ:lµ˜¤¤‘™‚53UNHΡÒ³&ÑÉé¦Ér\azÒDÙ‘*S‹3 )K'šÀ.¡äY™Ö$óÈT—%.ÌjO¸¢FË.fÁ>רÜ3׊o R$ZÅÅS¯,œ_Ÿ\„qñEÙÙÙ`).~›÷‹æÃ…m°°p Äågd8â¦à„ñÖ¤¸Dkr’£@ÎÌG†G“ rJð±©Ý÷uìË-’ ³Fئ´e%äsËu wç™Æß8Y9oûSC‰¾ì˜¼¼èŒ2ü¼\žZãݲŒè<о̴çbÖŒOÇhÒä“×;o¢c¸ŠQßés4Àÿ\„¡§†~düòæÌw3S·†¯¦¯¢³Ã¶ý¢è{Á@= Q&€ñ#ü#ɨiÄïc€8€Ù’²¥Ù÷.onXã.mY¹„¯×u-ÿÞ¼ÃÃç+~½Ó°ÓȒ¬[™&%†YAB˜m'ˆ³G ¨XXÂlAl˜m%fˆaöAL˜m!ˆ³Íæ0ÛD@õAS˜m$0†ÙC˜­'ЇÙèÂlNfk 0"Iž¤iÒ{~|ÃvÚ qgwŽÁ%¹,HÑ[ˆ[XEr€Õ“¬²%Ä?Óø›šÆ¬øK¬–ø1G4wh¼…-%~õïaËhIÓ–Ø2Mž’h–g  D<¥ñ#7zÛÄ3mâoÚħÛÄMmâä6qb›XbÆ·è÷MÄ>7h<Ã](.; E¹«|Hj"ÎÐxšÆ“=‰q0 ¾Ä`@\ÇÄ+vÑ+*âCߢñuoÔø\»4ç‰ËßÉ÷g‰?Íë²ÄIYâóKŸ`"š=#úÅ÷ûÅÌ~1½_ì)þ†NP,ŽPb!jÿˆ4›>r•Æo”Áµ\UjF|¦Ô8 >Uj2¤’üÔ˜(?øÔà¿B¯ŽË±‰q|›4ù¸ÐIøŽâzž–ŸÀ_"ð¶âª&xSqe¼®¸F¼?(®t‚W¿àeÅŸApRñßEð’âÏ%x^ñׄÿ Ás8®¸W(Š{³ô†ÀÍŽùMJM >¨Ô¤lPj&¬Wj&I%n|z5Û‡cXCò>Â6B[+ôhó-УͯÂ&Mn&äó+°IËÅrúÄ×-£˜9Ö+®df‘âÊ!(þ<‚*Å?W*q>øµÍî¿æá<ðk‹f+î#¤vâ$ÿgû_©¸_—J¢°r‘¯òƒSÓž®8÷“vÞpUr‡«áŽ ›<ç8u—®¸ò¤O\fé·,ïyž{çHÞ$sÅIgýñÒëÎAé·ß×ì—Nºê¤—è€ó„uè‰•Žºò¥_ùc¤#þ•Ò3~>– ýŒÖìóï–~Lëw­”ºœ‘ñ-žTi3’hŸÕî4©ÕÆ}'¤wÔœK]Ejr’s'¤ÎÝR£3l"wë{ =ÑÒýäKµ?Gšïç²Y2\’À\üžZ¹ØVGî°¶ÈÅÖ¹µZ"wØ¢Èuµ(r¿-Ž\e‹ŽO“¦åÒv'¤2ÿhén²tD‘й³ŠTä×ÌOp‡yÒÆõò¤H9î,Iò›¥ù}ÆûŒ?0ów3Œã(cš1Ño²˜F˜bLf“Éd0éL̦İzÉ3†ÿ$, :ÎuŒsù)ahb0£ÄƺÀÄ¥¶ÚÃÔ¶PÛDm#µõÔÖQ[K­ƒZ—zé8_=ÀºØú~K¤»ž­\Ƕ ÷¶±µÃ½µ¬Cë… ¹M¾Fuk·Y;¦Ú¦ÆO‰+*÷Þ‡yö÷í[p'Ý[º8*ô“ŠyU¡ÿçuT "4–j°‰,ßç`U¸šMôÍåã¸Ú µJM zY©A RFC/Wƒ^a´¦¶«õõôú¼}½½šŠ~/ôh*=ú½šÊ‘ÈN.2@;y8šÁ .MÍe0s5:š6‡6óx4­”XlâZØ”«mfÕì9¤âwr•¾l')ô9³µéÌï§Ýmº)2ݱßÏçF–;"óšÏþÿô4”þ_Wï¾´ýÿ«”} Ô‚¡îú7´©ÎnïÛ~iø?DF°®¾‘cmCè’Üà m—½ö¾îCw˜>ħ»eoòÝ[ÕwÈÓàUº=ÝÚ?Œã³VîºÍÖö›¶*Þa³ƒ|³JnkÖ®;LïâÓ³¸­]ÜÖ.nk–g–fË·|^éš[ž¶·G:wNÃz×ÿGweÅ endstream endobj 296 0 obj 3665 endobj 297 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 0 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 295 0 R >> endobj 298 0 obj [ 556 ] endobj 81 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 297 0 R /Widths 298 0 R /FirstChar 104 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 299 0 obj << /Length 300 0 R /Length1 6628 /Filter /FlateDecode >> stream xÚ­8 tÕ•÷½™ÑH¶%d[’eË#y$KX¶œÄŽ;þŒm)Nl“;à`ÇqpBBBHqS“`CŽZþ´¡e»tùÄd"²TÞ44[¼4 PØ–Ão·†r(nKO e‰5{gäØÓîÙž³3zï¾ûî}÷Ýß{óž€@ìäþM}[`!ü{ÎaÙÑ?´ÍóÚ[; ®~Ý–›6]÷»8°€QnÚ¸sÝçÇ?hH«à»úÖþöaù$€õn_9ˆ–2ŸDÜ7¸iÛG îDüCÄ7÷÷î`‡lˆ‚eSߎ-Æfú=ÄÄ=·ômø—ý?|ñ9ˆû·l¾mTÂ4â]ˆ‡·lØòË?mç?ˆó¯Â>š=šE؈°æÎö|ý¡ð÷<Œ^³ƒÊqÛ°Z.nd1›À ¾‰mT?I®R“\”&ŸRÿƒÉGîÌ–Ôã…§à>øì€=ؾ„bX„3>íÐ SD†9¨íwáò}Nh›É{8ÇÓ0/#Ÿ¢ð ر- áø"hFÞ†·  ®‡p ÎÀ(»:aLÒqõUôÉCpü˜eÔJ £O7Á~8¤R¨CI{áN"‘ÛÔièÁwêõmøø¥ú*ÚÅCš®c-r.ÙŽ) 2A[@@}æ@δG'FÚ¢nÅQYP24ÂbèB½wÃÝðjö¼IVÓm̸QOªZÞùp|jQ‘»¶Â6œáAx&às²’ZTŸú˜:¡¾¤þA!nqL´¡Ü¸ ¡ÜZü+xß)ø€d…¤‘tòy‰¼F£L)s€‰³'ª|ôL­)F­«0÷WÀ p#ôáÌ÷À?Â8êø|FœÄG*H„F¦á"ü.Á j‘A|sH>¾~RŠ^«Ç¨vedˆ “½dÙO¡Ž‡Éqr‚ü=ÙB»hÝCÒŸÐWèkô-ú!ý˜þ™11nÆ‹>>ö°«Ø#œ…»‘ÛÍíåŽ*g.&«’×%W'‡’çU^µ¨ÅêºG}TM`Tÿ¨{Ò™à #¨^ KñíÀLë5ÐëàfŒÍôæƒèÏOÂŒÓ1—~ŽÖ½‚Q>@Ëþ _À $qC`ÑϹ˜ÏÅdZÔ‚-'+H¹¬&7’udÜJv‘Ýh㾇ȷÑÊÇÈQrŒ¼@>"Ég^ŽfP+õÐŒL ]oæÁ&º› ß¡÷ÓGè÷éè?Q…§gÑ¿§I&±0~¦ ß(s5³”écne1?d~Ä<Íœc.0ÓÌ%f†™a+Øjöv7{û3öM|ÿÈY¹2n·‚[ËÝÌÝÂr÷sã\œ{›ûÂPiPx‰ïäïàòòãð(¼ãJûêsrþÏ;ÛwázžFá=øz`]€kg.y:ØU0‰»O>ý/úù9fVô“£`ǽŽrmàÆâdÄu êo°àž¬~”Ä/FKžTß` Púõ n/ÆpW¼ WÄyø5‘¥¸ÜÈT`þ®ÅwvyÞÜ9eáÒ’PñUÁ@‘ß'z=b;?Ï•ëtØs²³lV!ÓbÎHO3yÇ2”@ITZÔëQŠz¶HZ¼¸TÃ¥>ìèûJG¯âÁ®E_çQ<½:›çëœ2r®ûœrŠS¾ÂIO-Ô––x¢’G9‘< ²jY¶ï‰HÝeZo·ëm¶HG̈x½8ÂuF< éõD•ECƒ£ÑÞÊ›¨ÿýïÒJK`Âj¯O×$+ÐÜ·gЉ@ãˆ*.)Ur¥ˆNcüѾµJDz®h$Ïëí.-QHs¿´F©IÉ Í×%+|³bhFÑžõš0æ9Vrjôî„kzCk¥µ}7t)L_·6…5¤8¤ˆâØ5åü½ÜŠÞ=K|‰ õ/ê]„®[œB{5¬ïnÄÚ®õ L:ÒÝ¥ìÑÔÕTO1 EµžÞ Å$5Iƒ£zÑç®Q:wzã.—<¡â‡-ê]Þ%y•†<©»/’,F;w>›+{r¿N)-™p/ô¢Ë&JK5¸ÐëNÁßîKõ¿z*]ç›|a[ç¯Mi Z¡xú=¨@—„¦,Ъ0Ú¿Ùðé&è„õŠ©¹wT¨Ñ|ÊùÉ3ú)`¥é¿ÞÓ7Ûcð Ÿ‚ÖÔ‚}%a~¹­„BJq1Æã3€aBÕêõŽù¥%CJž´Eð(yè*è@?öu×”¡ß½^-dc Ö ¢ì]Ö•Â=°&/rY¨[¡½åÔeJÎ ²÷2åÊð^ ³ñ¸~(ÊQŒEW~™‚=+:X£ûÿBÐé@µõnðÌ£}õšdËG3D)IÐb9‹a ÍÀG ä)åØnSr‚lgH¸X;S»ëö™Zh¨fÅjîÉêµ°d*_Ôp þët‚9}i¶CõõMfçòÃ~9h´íÑœ'í¬ÝåpÛs,Ùî³)Ïear‚Äà7¹òò<6³ÙâOWe—hÏ¡¦ hâêèpa®¹(hÌæ¢´8C!¡–”…jCÂ)²ôbûÌ4L£BÓ,áÐa¬¶êêÕQm­v‚0M„S©zîÒS‰;’!'Ûa/ŸWUY…_ÉùEùÞ áo ‹æWT–—ÓœqN®M¸ŒŒ…k¨±³ÎõZÅÂõÇ¿ùWÍ”EK(++èla UçJ¯7½¬gÆ4Ñõè7䊌ÀfÜMy´;•óøüEŽ•é+M÷9w¼˜o”Í{oÎË  ºþxzz«- r…l|Ük2qf£É”Åg˲q-,—FÁåÎ3fÙl—å±±ërËºÓ Üe箸ãÏ…„P8 3µ Æc­æ‰ê²ÉÉI"\(sÕM»œ…¡ e΋=®º—SóºQhàY^&PUQ"=‘“mwäxw_ï¯Ï%W}üЀ´‚m^åãV oMN¥q¦Ö3Š—ÏòÞÀV·çÉÂdœkYÝs‰óºŽZâ;â>â=RxÄwÂ}Â{¢ð„ïeûÇçY÷YïÙ³¾3þ׋_½_ü~èsÉc’H~¾»´4vÎÂpž X±.³Ì²LÉçÌË•œ™ÑAV»ä0n!ƒA^2¶™I¦Ù”|bi8ß*ä—É77Ó*¶°ÎÃå#ÚP@8Ï*°38†² ¤‰Ut½kîœL¡ ?zçÐçÄjsTkéÒÖD&Ý.²`0†zƒhAÀŸ––6ÌILMÄ03?]"Ÿ¦r³'„3ãžI#ŽÖ*Áx¹‰‘ºó婌åçדªzRî`¾’Àœ-•Ô Á4„I€gò‰L™òåÕܦúÅþ ÔB¶·'/ŒH^ûU¢ÜßX©vÔy{n`Oš¬¦õò™u¥]Z?äsf0……l׻ɾUœ×’óÛÃw_IÞ«Çׯ~ļÎÜ2±ÊOp‚†`À_S]yÕ†º‡O&g/.üuàµê7f²ul} ¿²v~]KCwúʺíl÷椧WšªœÄ^ÇÊO°%è.I'u^[úæ4)½-³|^›Ø Õ>kufPxƒK‚Må󿉶wAƒÕ&Ë"Þ=Iu•=“—1B¾æ’ôˆ{­{¿›qû "k ö°-Mî¡  )д¸±lèœS[,€‹fOnk“7tºçtóJ§/Çpr·gh6ˆC¸‚Î9]Zø´¨ë$Ÿ ®ÓÂ9ÐÉu.$Ï™›ŠT– «Ø .´òyÚ‘ÈÀ3‚ ¬|FëÊ®Suyoàq;òÛyïœ ‡¥±Êó¬ŽìêŒm-ñÔ¥÷±iÁiwwÎél+làØá4ÞánÛÚ_×D7,õf¹½ -LKã,—ì¨$ðR±ÊϵdðŒÏIJ|á1Ÿg9!6¿¿ÈïI ËÈ}Ø—µË[-)S & .*-1€AL÷¥!,”›«ìÕEð|Y¸ì­ÏN_œžFçA>µC3=ÎZáâ4þt'Wk;únϤ¾ÌlúJµœ$<ý1çˆpFÛÄLè_»ˆWYm µM|žæi©0PTFÂD‹C€xµºÊ˘fŽÊ~yn½¦0WòC.¿ïÖeá—oç¶@^¡ÛN‡“¯G¢n¯Œ7Î3²Ù&Êî`Zš…_è½a©²WHËŽxÝø]¥_ÌYbœÖ׃þØãß Ü˜Yû)!F?5ñÅÎËPV»ñË‹§p0]ùgCûG’Ø0Bò‡É#F—(UïùÊ9ßÀþFfîQ?aoƒÍÌ=Ïø7Þ€oÿqRA}LsdVÞº ° ŽóøÉCˆÃ6;³A;ÿ¯ìèlnm -_¿ià¶Ò%Ûú6®ïŸý‡EýË üÕ›‡K)Þ¹—êw;ø ýÉ€ZéýñŽj1Aï“Cc†O/_BÇ·ŽÑÃ[Ñqq¼†×ÐqÏx=ì9ÜA4ölM…˜“ cñ1;AGd%è]l z5A ôN™ :‚À’ û˜tü”Þ =A¿…¿§{˜ô›Œ :Œ€OÐ= z;.Aw#`t&Aw"@ev À³Ðv Cr&BB˜ˆvÁ5ÊÙ´ŽÜ[ÀL6èõõz}­^gëµ ×ìñ-æÍ[Ìiä0ˆøKzݯ×Y²eÐü‡AóÔ ù¥Aó¿ šŸ'ƒÐŽ·^srv»ù|»Yi7¶›kÛÍóÚÍÅ효?A+Ò§ôګײ£ÕüY«ùõVó+­æñVs«¹¢Õìo5'È¿ËÖóÛ#æ'GÌE#fiÄìÁÞgŽg¶e‚éÞÛPÀ…xG‰øòxÐJ‘ükÜsBlÌ%§ †Õðçgáˆ:|š‰áQX®Ã§!`Ôú{ãóÅYï¨CpC¼c‚UñŽÕºãkpŠë C²<î™­¤<ºÈ¥³S´ÃÕàÕŸF¸8.Þ„£#ñæ5b£‰4B³ÎV3¯D˜¯)Þh&9³b¬³Z°htóqñ¼8]“ +ãâG(Çß_ž`I\|7 OËéâ;)ñ\ǽâÙŽÅîŸ-Çî¸øÓyN|F|T|" ÷<Ð…N±}Ï“0"x Å}Py_0AyNüNà¼8¬M‰Ò÷ €]Áóâ-ÍúÜ›RঠŽFêºà”¸Fü–ØÐÇ_ãÑ©W/×ç^Rs^l êò¡ ä91ê9/6õ‰eQ'4¤°ª”ØÊV.êÒæŽée)KJÑÄ’åºî!TÓ/gŠ>q«èm¾I\!šDSìÙ‡—–«ùØ÷ùØ^>v»™màc+ùØb>¶€…ùX!+à³6£€gù cšÑh4Y#Åu‘Pß“‹µ&Û hÀÀj5«·ªÕ4µEQb¤ÐÚ褣`¤±Ü‰e?–;°ìÅ2Œåv,»°ìÀ2„eT}ïYmô¥·RÍÛé®ÙÎ]ôÎÙÖtÇlkÒ[¸ˆŸÕæDoHuD!÷(†ƒxESÈ¡</€‡ºvûPƒ³ÁVo­^ù+UïlúòqþÝB_}H[ÇΟbšþ]/’Ÿêõ±çxñe^<Âëm×"CLgˆé 1!ö2›epº•Ú®íRžrw+ó´†êînSÂÚ]~‚6кhd‚Ök »kÞ¡ ÑN­Þ‰t#Û* wídƒ y D •yJgëO±yh½ÆÖ¡d£ÛÁ£³yèvmJc;¶µ&9VS£³°'a«Î²•=ù–±¯³Œé,c³,y:K €,ÍåXaŽ u²ïKòò9œ"‡urÕ—ä`ŠÜ’"· 9ôÿø 4ý=ÜÑõ×6ÙñˆãÔoj|†bš^ú[2n›}° ðß[¶L endstream endobj 300 0 obj 4771 endobj 301 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -82 768 682 ] /FontName /VPRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 299 0 R >> endobj 302 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 611 389 ] endobj 134 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Italic /FontDescriptor 301 0 R /Widths 302 0 R /FirstChar 74 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 303 0 obj << /Length 304 0 R /Length1 5648 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸyñ82¼fÎŒ‡œa‚(ˆV¢œAGD|1•‡(Š((ÅÇFM4ÔÚFc[%ÖäšZu8Rš¤1©Ö¤šÛ˜Ï¿ª‰¦!I­yZ9w3\£÷óþqÿ»g}{ýöÚ{í½^ûì9Ѱ8êšjša´ÓÈjéum­öC?~îõ¿ЧÌo^дþŸ»z ÑìĂūæW$¦4˜Î’¼³¡¾fÞ'ÇŠÆD5К‘ 4½[÷,É]ê~ M­+cXHò Õêâ¥u5pבLëÁÔT³²Ù”Ï“üÉö%5Mõå[v”ü-ÉbóÒå­Êð>-M!9«yY}sÿ ÛßIöD¼Ecj°)Ÿê[õ­TÜRH¥f£•ñ÷\µOû‹éF§¹þW•÷¹4òl “23œéâ‡]HKMœœd³ZâãbÍ1ƒøè¨È“Ñ ×q !Û'–TÛƒÕA]†8q¢G•Ũ¹k :h§¡’{u‚öjMÍ~¯¦Dšóÿ‡¦Ö”îh¢Ù^…žl»O´ßöŠöΚRIýg¼bÀìÓú“µþV­ÏSßá vŸ­ÁkbµÝ,ikh÷U{i»^‰ÂŽôdS¢A‚(uã Œ¯YÓ`#P5|ÁdÑë &‰^mŽsújæžRéóv8žì ޝkƒ cÜËÕuvR­¨$Ûžì…ªÿÐ=Oœ×’ ¶ZíÕTU¹š@U«6bÝA«è ZW_µý þwÏ÷ô]“Aæ,©©o/¡ÔtL ‹ÕªTó4I¥Sí´-Û¨ âÆ@Ø Í÷põ¢O©^dFˆÅbCû¢jÊ9TTÊÉR²O¬ñ‚ðp¥œ$%i‚'»×¶vŒƒ’Òë)ò©8Æa[ÆO¿wmáÌÉÍÅ Z:óà¹þ¾Y±¶àùÔÆmI/ùëéç¯Õ$ÞþX÷üí¾›»ÿÆÉþþ>)¯UwQòD W¿®:/ŜǥՉQ‰ve‰²²K„ÕaÈL²$Y-–Ì¡–¡ÖY–YÖ…–…Ö†Œ†Ìç,ÏY_²¼díµôZ-f“88“³d&‹ñÖ à -kLºNL3c ÒGŠŽd‘Zl$g²t¼ ì”?oÌÊ´$FNv™cC¬æ¨+bˆèÒqj‚\C)A…·¯Põ´ÚŽë›­¥Èª¥Èívƒ¹°ðÏZº´dµÀ삱˜¯åÄ;G ·$Æ&X¬‰Ž|m8SËaxÄ1*?»Ÿ×1³mWNA¿P5È6!¿%« ?>טS¢‹0×4üöñ²©›_èOð¹£ss£2Æã—%â¸Ú¸ÛŽÏˆÊíË4üZ´†Í)ü ѤÉÇ{o­ºƒå²vr"î|µ _ý<†þúbüúžïYõá £Á©["5‡ö­zË4-޾d ôd Ój&Ê0^Ã?‘ŒÚÎq{  ¢¸|ü¤b÷´…MõË=ÅKÏ#gÔ•Ð÷{8j>(ýíVÃV#K ±y‚bíñ!¶™ .Äž" ‚=I`±M1!¶‘`Pˆ=AÀ‡ØãÑ!¶ *ÄÖD†Ø:zA#0…ØZcˆ­!0„Ø£úû7]ˆ­& s°Š€…ØJ K@’”8AøÈïøÑîB{n àÖtÜR”ê)z3q3«¥H÷°:’6ø?«i¼ÃꉿÆjˆÖxXs‹Æ—²ùÄ¢þClí"hÚ[ £I*ŠbyxZ€Ç? q£”Пiá׿ØÂ¯káÇ´ð#[ø¢H|—~×yìÖx½Æ3¤¨~ßVÀ‹ªÊ'ôÊã$§hÜ*%ø+þõ¿'ÀWø>=ÀY°^S×ø¯ÖxƒÆ+4îÒx¬›ÅÅïÎâžÅ×fñ£²ø—1†>=yŒ”õð—{øÌ>­‡ïÌÿŽNP ’c ¢ÿ„4›6x‰Âïä*ÁÍ0Ü«R ¾«œŸËUBQ~ U&Ê^…*œAø7èÒ©òEld*~ˆš|\è$ü@v½LËχáý0üYvÍ"8+»²Þ–]CN‡áMÙ•FpRöÛ ^—ýÇeÿ¯Éþ‚—e-AHö_!8†#²g1,{Ö ¯`<ì™_'W%ÑècrU Á¹j$Á£rÕ(¡Èƒ+ Kó±u †å$ï"l!Tck†Nm~)tjóK°Q“›ÕùEبåb!ý7T×- ˜U¬“]“ÈÌÙ•Mý¹•²¿B(âq:øµÍ¦_óp*øµEËž¤öì¹BþOð¿Lö¼-E`)ä ºÊNM{¢ìÜMÚ¹Uɨ†g 7y®âP´ªd‚K3ê$U=1\‡!²k;CvM °Ë®¡©áØÂ™·È~5–x5»¯ <Úú()ì_%ßU¥ ßv]¾¡v³W=²ðW’UøÒuEøÜ5\èså Ÿ¹"…«Q8ßù²ê œ# {¢pÎ+¼çÞv^NÐyûCÕnḫVxÈa)¤C)F8èÊ~ãø /ùÕ±xá´f—»ðSZ÷Œk±Ðî o’…õtHVÐ>Ë<)B³'„»Ž K=ùBSue¡ÑIÎ9· Ήܭë 1”¢„GÈ—Yþlaº_•#£Á%pÌ¥ÞSËÃÛ²ð־ؚ÷ÖÒð6'|]Í ßosÃWÙœ#„ 9´ÝQa¼ˆð Y: …ª³²0Ú¯™á ©IÖ¥&-_Èöd ‚?R˜Þmœiü‘1ߘg|À˜atS)ÆSœÉldŠ6EšL&ƒIgb&0%„”KRºú{`0«`Щ\ÇTÎÂ?A M &ÙX;˜ØSÔ6Q{‚Új먭¥ö(µÕÔVRk£Ö®\:¢®îeíìÑs¸û([=0¸šmèmb+z+Y›Ö ª6 »'A•A|Æfig76vt‰÷>¬z€»xlÿÛ‚ûéÞÕÅÔà³¥S+ƒ¿N ‡«%5Pª~b÷²‘,Ïçíeù**{qé«PÇq™7@ješt±|Rƒ*H]ªtqC4µÍªZwg—ÏÛÝÕ¥©èwB§¦Ò©ß©©ïä"´“¤©"Á¥©¹ ‘ª MA¢Í$IÓJŠÁFU “b´Í,š=§“TüNU¥Ûí$…n§[›ÎüaÚãЦÃÓaøÃ|Nx¹#<ï y÷ÿ§§¾øÿºâHÇ¥ÍûÔ¿HÕ¢¯žZu°£þ®«µÛ»7_øï”Q][× bM}ð’Xï n½öîŽ}÷™Þ§NwˆÞnØç›VÙ½Oª÷ÊR‡öÏêHùÞ²m÷ØÚ|ÇVÙÞûl¶WݬLµU¾í>ÓÛÔérÕÖ6ÕÖ6ÕV¹T®Ùò-œZ¼ü®çÇ­­áÎýÓ°œÞõÿév¨• endstream endobj 304 0 obj 3892 endobj 305 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /RBNCJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 303 0 R >> endobj 306 0 obj [ 556 778 778 778 778 778 556 ] endobj 27 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 305 0 R /Widths 306 0 R /FirstChar 98 /LastChar 104 /Encoding /MacRomanEncoding >> endobj 307 0 obj << /Length 308 0 R /Length1 4364 /Filter /FlateDecode >> stream xÚÕ—}XTUÀßsϽw¸ ƒà "2#Ç(æ`j”F¨¬‚ "¹)21ø•¶bdæš™k±l²n_kö±5‘‘¹fòˆe‰f‰Öîê¶nd±K¬[àú(Ìì{^FŸvŸÝ÷yöÂùÝ÷ã|¾çœ{Î=4×’š 7Ä@!Z:1Å/Y]oY9·QFù2€Uí¾·¦ÂäÖ¸°m¿wźjsÒ®'P@®_¶´¢êR¸Ë „þìehÐÄΡîB=qYMýÚØç¤=¨W¡>jEí’ n‘‹Po@]«©Xë c Žu‚eeEÍÒ/âê¨{Qí®õÔûÞ‚¨ŸFÝá®[ê.)c@0ªAz11"¢ñmÅ· 2Z%¡‚–>8 “`‹´¦À}š]¬^ ª}Mrµò®Y˜\Á2¨,H‘dHë<ß™ZWgW§#2‘d°VË0èáæÁ¯|Mº°«ßÕ©)@;¡„í‘õR Öé ’ƒm¸ d­«Ëö:˜5Ë*ëgñýlÏ6js†¿O>‹ët¤Â’yN]k}¦ã*~AµÓϯ۹¼ä¾ñãæ.O4nò}þÆ9ŸïÚÑ“L’i­Q¼8N‹K †~T |ÄÄU¯uÝÒk}ïïÎÍuDÞŠs3 ã 'CÒRF§„NP&Mž0Ö¢ôÍõÕ`ÜbqmdC•kòx»Õ‰æý¸v—ý}‘]¶§vëÕ˜VK¢#ÑèM<’¨$ªÞtOŽ„¥qビ-™F ÏÌѺººµKç:: ¹e¾.¾>A¼\C®v\¬“á˜Æ–ÍMãMKŽI¬ e6s.X¼çÆ×S¬›Éœ—™?ãö¼‘e¦¸ÄxKLé-®;jÌ^cŸà|£qW[5»lvÏZ¶yáTk²5Õ™¼¨¸¸Âo¶Ä'--©X[ViÞð@óúÒñhó·âÙÖ¥Œ¥½ õù) ° ±!a’@Ãï[D‚©Aæ1£2 &ÀÄÑjÀw$¾c°ŒŠ2Ãó(s†BœvîÛ yyB;;04iCgaúV»040”Ž›5ÇÊ1Eª ˆÐÀj1é0`ŒÂ½’#'_ßæ=]ïqȦW~ã÷}ã{˜m`1,¦ÃñöÀ%ßæºt­U:±Ò×¶Ò7á©aÛÐQ{Ìwäº?þ^PÊüþ.éžð¼14ñyçúºo+~•Î*â,Vç,•QZ†Zðüç{ùúù M7=7|ªå*(Qô0ƒ÷C»†ë³jðK^)î0^eVÀÞ—&Ri<€g¶ã$¢ëBtßà¹Ì½4ÚP1v0mþìÛ:w]Meí ±Çéñ½*î ÿáÑý«šï—˜>àL&rx)‘̈ ~¢8D$^'^#^%þƒx…8@ì'~OüŽøwâeâ߈}Äo‰½Ä¿b÷8ü…äøªp½ô&d_“|‰ø±›ø%ñÏÄ‹Ä/ˆ$ž'þø{â?#žƒ‡q*øN@íS²}в Ÿ|:@aù˜äSÄNâ 8Žüˆä‰Ç‰ß§¾#¹ƒx”ØN|x˜ø.ññ·ÄƒðÜý:8¬ùOcûÂÂñvö6„¡çÞú„Ö€ž·ñ棢Mx8Ò…6aáðd ÷ãÙÏóýð&ÞÔœ˜ïM¼_p¤È×J-¼A}õÂëØ¢‚oa{×ájÔ„Mh¢¥×5GŠ^™(¿Le^"î#¾HuîÅ5Ïá×$¿@öç©õçÈòl ¾gñŽ*4QŸ°pø•ÛùÈ_âœph¡Ò»©µ§Iþ±Y¬cø9L@6‘å)â“TÃ.òþŒ¸“Ú|‚¼;p%sxœòl'ïcÄm4§?¥<[‰‚ø">꿌}ÛB–Gˆ›kg3ÜŠš9Þ¶¢ñ4RŽFš·‡h<›0~çѳ‰<›àz`#¶ª‡#E„7ÂO mÂÑ""Â"v«(¹¸¿"×úaÚy€r­#ËZââjõªüá}í:˜Ž%=ÕŽ÷g7ÍþýäqC-;›fßM}«…•0mµ4ûµÔ7aá°œÊ,#ÞK\J\B¼‡XN,#.".Äß b¯/$mõ³”äâ|â<âˆÅĹ4SsH."ÞM,$ÞEœEœI,ðÿ {z;Õ?ƒ,ÓhGßFòTb>ÑE£™Bò­ÄÉÄ<â$âDb.–æ¸æ„œCÌ$:‰Ät´qpœFO´mP€L%y1…8’± ßBK¦:†ä$b"„#ðÔàx¢4!­d·`Œ8þÞùãÈKò(¢9xÜBImÇP.1šh PÃèDA¶¨à[Ø"ñ,š‰Z$µhø ´…̱Œ(ʆÓî #K(QOA !ƒˆ:ÈBªøu¿]……Î(:‡8žt±D~ߊþ/ÆÑ/FkÖþ¦g0y1Á¤ÃÛʬÍÛ™'õò@êÿÝûO¥‘З endstream endobj 308 0 obj 2696 endobj 309 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -177 605 711 ] /FontName /DWQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 307 0 R >> endobj 310 0 obj [ 744 247 549 631 494 439 ] endobj 100 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Symbol /FontDescriptor 309 0 R /Widths 310 0 R /FirstChar 33 /LastChar 38 >> endobj 311 0 obj << /Length 312 0 R /Length1 5760 /Filter /FlateDecode >> stream xÚÍW{xSU¶_kŸœœ4mÚ$-4 …“4MIÓ@”j‘Ó’PÂKyÚ`‘–R(”Ò˜J¹¢ ÒjaFt ŸƒÞ^$=t ƒƒ¼Š8ƒŸw¸ò uGtÆ‹O$ç®sRQïÇýãþwÏÊÞ¿½ö^{¯×>;û@l¤†–ú60Áê9MeLCÇ:ÇÓ?ûÕÓÔþ€Ï\Ö¶¼eóíÐØÉå«:—½òÍ¥>ÉsIMõK?<^y3@â»4g|u$í×=B ÌÄg7µ¬[Ÿò0´_¢j]ÕÚPiø 5%â -õëÛ ¥ìñS‰w¬®oiœµcÏ⛈wµµ®]§œƒˆˆø¼¶5m±Ïm'~ áUêCPýQ=Òƒ•ð.Ð ÷0ò  2©ˆTlܰÐj \TKl¡rogìuå=n-ä‹zJ`%<ãà-ŠÑiàá ¡ ƒÔRÑI#wÂb¬€ ÖPôìÐÿÀÛa†Ï ›¡$’öA1­— óá8a…ƒt@ôÀ!› =Ê[ÊÒ6Ž´µÂVØc¨}á<®RNU°úàÞ¢"9iš¬ó’7C¦ÁLZy!,†¥´âãð8ƒÊVåy(¾±PJv= Çȃ«XŒ\·FªˆÞ†?a2V)s•£Ê«¤'Êi­0VÄZÕì‘—~"uídÍcdÏIx˜„ p5vâ~ÅÂÜ1¥MÙOyqCiìƒçà%xÎÀ%’4b&Va žb‡¹Tn7·ŸïàŸV\ÊGdßd˜k)BÛáÉ¿ çá"|_“6´£ˆc±Kq:.$z0ŽmaO²Ãì2gà~ͽ¬KŠ]TþSù’¢’^Šq)­€ Ì ŸÕ®!ÚC±z^¤\½Jûü…èøu˜Š#IÓ(ÒãÄlÌÇj¢éäW ®ÁljÞÇKŒœbŒ p!n—t[ø¾SÉRJ”2¢'8Š|:E©&Â-Zæj)šMÐLšï‡-°âÚ(‹ð2Yðü>‡+p¾CyÈ3EÈ…y”•±8ž¨ % ‘%Óqåi>ÞN-ÄŸ7á.ü9'ú=¾„§ð¯x ?Ç«š•×Ñyu’î=ÝoçËø…ü/ù>}‚ð»kŸÄÇ2CéQö+g•ÁHoZ1Ì¢·` ùÐJ>¬£ódì&ÚCt€bù[ÚÉÇh½@9>Eô:ÑiøŠêû”½!¢¿Ó»L>~Mþ)ÆqR3j×2ZŽ·`€¼›KTƒËho´á]¸‘¨÷áŠüA¦<.Óuéöë~¯;Ã/òSù¾“߯?ÊáOógùKúlýaa‡°[¸DYY@¹)‡Ÿ>©´ÃzáYhbl€N„1t6­„#¸¾eòê.L¥\wRôüôÖ/Â{ÀÌÆ²_`åè7ütní‰_ÒYQFoìyz·B°‹Þœs0O²t*ަ“,U¹ 6åc~¿Ž’;FS±ÑÌÔásî2•cUtÒXì9åÏܲì>+忏³]YN‡8ftæ({†-}䈴T«Åœ’lJJ4&=¯ãBAÐ5¥ÎÉ©‹èr\S§úTÞUOõ?ꨋ8¨kÊOe"Ž:MÌñSI‰$—ýI).)]—D³£*|Ž Ëy#àrDqáìj?p…‘ËZ{¦ÖÞ©µMÔv:i‚#hk 8"XçF¦t4uë´Ü ú‡côP A‚DuáL®ßØd#P%‚»+Œd¸ÚçÖ/Ü6»&åt†}œÜàZWU$Å;<]ç Ñ95¤ÛW°Bµº“–º–vG%XR§¶êkk"\}8ÂêTo$݈¤oøÀöû}+øÐ#Ì=¥¾±k …¦{jœ­S¹ú‡ˆ›>×A˲-ášn ÇÐl{Ñè ª=u+‘W•«©keÅæÔÈvÉtÕ¸­FÎ24ÆW0h»çf'eÐWé«Tñf§íž8~x¼ÿí5¹“§Ï¹T5¹BdfÄÑ )q‘­Ôªqt5L 1zÂH^®ˆ$L®ë2ßD³"¼Ûìrt}”(×åO~ÚS?Ü£w›¿µ©¦óúŽ ñá¶ö_údúWOØJ)“׋´eu‚ȑ׉Çì zADÈ0$DYáQçòÛl^ï¬+3¯UÌ2Y1Ó|­&U\«P˸±Å§%—Š›¿têê|Ó·{Oqï}—C7 §r‘ßGwˆbÌN Sy»1+ÙeµZSGdسì®ôüŒÂO®¿Ü0>a‚}ŠaŠ}žaQÂBßòŒÎÂ3¶y,|dÔS†§ìǬÇR™ºœ –`4V[}¾oAÏè•™YmÍËϳgL=˜kÐk4z ÂÔ>âü…~¿`H0z 2ì£2ó’ Ñœšåæ‹ÆX\¬XïË÷p…‰’Ï?µ°º°Øhñ8ó²ó%¨ÊŸÚfÙd9ká,Õ–âìÒâÿß9i)ï˜è_dë(·¿f÷[Ë'ÚÏ[Ê­å¶GùÄóvLJ¯ ßµô kz¹À›;¼‹:Ì‚¹âûÆD¯Í\a0W˜Y…0ÑL O¡ÃöE8"G¤LO-N-ÉÉ-ÄÜRç=·`)uj=º8"T%ð#W>aoâG¢y´ß/(ŒMI»9]ñ8éöŽŒ½ä3ᛢؙœlw¤ˆKw%Lµâl¡yDf2_TĬö”\gln3Z ^»®¨HpßôÝiÖrm7‹-.5Å¯Ör¯‚,ð¨4o9¾{ËeùÆ0r¦£ŽéÕ„x¬ˆŒÍ!A ¾jAŸRm¬£E°X³¹Ò%%;Sì©B–“wê+ikYS·:gìÞWWìß°Ù‡hsͤ–Ýv¥bÈb-÷äI—;Þ±MºüqôC*åÛ ½Û6ž„x…p,*.ŽàJuŽÀñeãËŠ9ôàûüU^I2û2–ÿJ ©¤Ü;P•³àcè,ùî%>«8$Ïâ·^°þöüÐ┊/ ÿÂàÕÎëH»X{[¾—WQ1õ:±'b?¾¼>òýÃéËÁÍÓ-–{X#”Ð~«&ÅÑíIOw3=EØL” |„¯ÚÊÖáµôu˜S5kò´*ï¼-k}U­«–jwtõQÖC7Üèá¨,„E¿Û©ß)°QÖ-W‹iQÖEeÛ ¬Qö %ʶ˜£l+AJ”m!H޲LQv?AR”ÝGe› ŒQ¶‰€…{ Qve ôQv7eÿB ‹² \”u°([O€qˆ“FT‹ï‡ðÍ:<è(ÃaÜ™;*ý¬Ž¼7SmfKÈÓ¬x…-¥ú3­~K“x“5Rý<«§úˆVÇ%whu+[Fõ­Ô¾•-§UDMZdËe4H•‰¬OC;˜ð¤V÷iµ ¥µ›N·›ži7=ÙnÚÔnº¹Ý4¾ÝTiÄ3t—0a¿V7juŽ”Xf:Tfê(3¹ÊT‘éRlÂiZ©ÕéRZØ46½6›ê¦aSvØT9»èÓÁ„÷kõ}Z½A«›´zŽV{´Ú"YòLïæ™öç™Í3-É3MÈ3ÀºîšÐ(%˜.˜rLcL£LÏÐJÁd9ñ5¤Ñ1£V‹QüF®µ\‰Ãçríh‚ÏäZ7Á§rmŽX™ƒZÅ?€Z\@øWèÕ©üylf*þ›5þ=ð ›ð]Ùs‚¦Ÿ‹ÃŸãðŽìYHð–ìÉ#xCöd¼‡WdÏ‚—åƒàE9”Cð‚*$x^ù NÈ¡%Q94Dp<Geß*YömŸÅøX©ß$×fPï½rm&ÁF¹v<ÁÝrí±Ò‡wA¯fãºaÖ¿°Põ­ z´ñVèÑÆWc³Æ·ªã+±Y‹Å úUç-'ŸUl=ÓHͲ§€ ,‡ÆÔÈ¡9b¥ çCH[l„4 çBH›t›ìë#±[eßÙ?sØþ²ï ±2§ƒÕY!pkÒSe÷~’7œÿp6|ÃxÉróAÒ²’ M©›,Tå\ñÉ.n¦Mr­³Æ—)¶ù¢¸ï˜Øê+[üÔ”Åf7wL\éÞ-6¹£2·¡'ÊPJï [† Äù!•7Š‚Þ#rÌ£žSkãÛšøÖ?ØÚâ§Vkü »3~\Ý?ßDz;V‹Õ~Zî˜89”%N$M}²X¡+‹å!M}±/ªml¯´R±À—'Š!£8¿_¸]¸I(J„B!Gp £…L!Í`5˜ Ɇ$ƒÑ`0è :3€!-ª\²Õÿƒ4½Y½N­uL­Yü/ˆ¡Á´Jë{ÊV*P¹Ê&*÷P¹›Ê*ë©tPéR.Ug².v÷€9Þ¼›mîÜÀ¶·¶²õíõ¬CkE U„ýÓ ŠÊ–>lÙ1É6Éz‹¥|JàUÝpíýá±ýon$û£&ŽŽ<2}nMä_G‡#EjCžÉW¯õƒl<+ Y© ášA\ÃÆç¨ý¸&&±šô²RƒZHŒË‚^U z¹,Ml»*ÖßÓ ô÷öj"ü^èÑDzø½šH_|%) •$HLo&æÑU1Úš6ƒD‹I’&•‘‚ͪ6g¤h‹Ôô¹Ý$r«"ý^7 ô»½ÚpîÃ>§6ÜnŽëÀÆýñéÎø¸“ƽÿŸžÆªÿ댣ݶT?Ëê\ÁF*u‘îúòÜ´Äáèß~aø{-§nIC“Šõ‘ ®Æ@d»+àèï>xƒáƒêp·+ЃójúJ¹[êÖ¾æŽÎz|Æ®ŸèÚ~]׌Ço°Øãêb3T]³vÝ`x—:> endobj 314 0 obj [ 722 778 778 444 ] endobj 90 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Bold /FontDescriptor 313 0 R /Widths 314 0 R /FirstChar 119 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 315 0 obj << /Length 316 0 R /Length1 5300 /Filter /FlateDecode >> stream xÚÍW{XT×µ_kŸy1:2€Ñ3Ã8ˆ|€HCâ€3êÑ0†(ˆ(Š(%êÕDMÔ jMª5©òYãµµÆáHÍGcR­µÑæas½Í_CMCÒzÍÓȹ¿s†íçýãþwÏbíß^{¯½×kŸ=b"êMëH"EMyYèIŒœ;*œÏýøgÏ¡ßIdLYX·¨fýïî 2aHœX´tÕÂEÏ­—Èr‚ˆ‹«*Ë|üBA ‘Õ…1Uè½ÇðäI‡VÕ4¬Œû=Ýy)dËÒÚŠr:@Ù ›jÊWÖY²ÅÈk ;—•×Tl}êÈÏ@v×Õ®hPÿƒš!‡œV·¼²®ûŠãï/ÅÆ“‘ L´Z1VQ X;¤#”L¤ž¨q÷õº±†\ݯ«¤‘ØÀc<Ù´„¥‘ô&rs†Œô,)TÈAŒŸ $vaf.Íã| r Ù°kýƒï£…t˜>§fa¥òCÛG£±_ Í¢Sä¢Åj7…¨‘š¨…bn:µ¨oªam$¬ÕÒ&ÚÊCÐ?Lô>/UO‘L…´ŒÑy¾[=¨U–Æ2àÅ É4;Ï¡y´;î£_Ð[¼JݤžB„fØA9ðëC×x4¯’ ¥Ý˜)½Mæ>\¨ÎTª§a'ò°W˜m£]´Ÿž§.êæ,žÎ‡Õju¹ú£g¹¶Î Õ%°íË\¬ùOͽ¸4Gý4¿Lë•—–D¤òpD”i62"ÜÈ€Õ9~¿ï¿i2"<Ê+›& 5Í“bb™&•?©h¦ÛŠá’o ÇœÐ}EQéj#eKœ‘8w¡»ªiIrN3J”drÐ]GhZ‰2Ð?P|™އît!)¾_†wºÅðãGbãoï¥ë¸,šq#/¬Yr‡àfÄY¡qÃ×±ZS9–š*ÆB O˜åâHÜø²&û°*bôØÝΦ/…rw}zëHyψÉcÿ‚´®VÎ'ó=}ý·„L}ðû®Ý°þ£IÆ‘5˜e‰¬Fƒ,I"9Îd–™Zâ¢âŽ£®EÓS¯æO¹ž?Õþeþûõ|—=_ã‘#F'¸†=ÆË§®=k¬úv×)éÂwi°ã%’J¥Ód§zÚï"¼¼;Y&†[Ã,Ùâ­aqV«7‘Y«ÝÌVŠ3cl¢Ù?Ñ:‘¬ 愳Ý^`‰Kõ÷qÅ''™S]F—©®%&mroïñëjò]gÉpn zÉŽ«ù ‰yY4n\Wã;Žq]ï@ƒó6ß‘±yí ŠŒÁУs8Ídv'¹úñ˜Ü1¹£%öò¿ÿYzvñe÷ð?ª²ó\Ý{³¥<|†]Ùß½fLéî@d±ï'ºö«“uóâó¿`¶èòñŽk«nà÷ÙfŠû^_CukŸuÔýl÷OÌ_Þ˜ùþ¦<òHOh9Ä×ËØät® dÕNÈ̗øY×HìÙÇ„ŒÓ´pÁøÉ…÷.®©\á+¬]º@[¯?êJí»ð66/Èßl3m3‹~QѬL”ûFE )*¶£â1@BTlØ£b >*6úDÅ£[T<è½¢b=Àë8P,QñÀk¦¨X0FÅ¿ Q± EÅ*€ˆŠ•ŽIÉßo¢üAˆß±ÓËÎ\ÞæmCykA–(Côv´v1‘ìU±íçzû¦®ñ†¨DûŠ(G{Docš[õ¶V,D{ú÷ˆEØEÖµe±Ha‹¿ —Èæ3TO6>¡·‡ôÖìï[o;So{¡Þv Þ¶®Þvg½mL½­ÀÊoáwÈÆmz[©·iþ^¹¶ƒ¹¶Æ\›;WSùT6ž¬·)z;Àß7lë Û^ Ûö†meaÛì°mhØVП›ðÙiãGôvƒÞ®ÖÛ*½¡·^½Mð'¤ÛÞK·íI·=n›Ÿn›n{‘ãñ©dc«¿O»íÃvÛ°vÛv[û Û 8AñÜG‰§¸þ#cvÈ er”¿QJ€«1¸¢”|®”zŸ)¥irÁ@þ•ZþˆJy6ð¯ÔjÐä÷¹Zhø®Öå äeð=Åû"–ŸÁ»1xGñμ©xÓgo*àõüAñœTBNÀ«J( p\ ÝxE e^TBóQ%Ô x>GßR€¢øÖË/q„|â̯SJbôa¥4°V)X£”Ž• |ü µê>6ôİòn`=P‹­ŽZôùZjÑç—qµ.×µù%\­çb1þ—ÑÖ-BÌV(ÞÉ03WñfÂJh$ D Í l<‹Búf÷RH÷p&…ôEÓß!¨Ý£ø:áÿ”ÿ‹ßY¹ Ž‹(‹µU!òèÚ“Ïhì©JVO5|=dÀs ‡“_¯Ê0òêF=ðPÓsÇêªxw\Šw"À©x‡Ç àˆe¾¿ÒbIÒ²ûÛɧ¯ïåï ûß–Êò7¥Cå¯[;å¯ÀW;´C ÈÿôFÙã ÿÃÛ)æ%wyGÊŸz­òG>·|¾åEÍ: g?ùœ7A~;”(ŸõtÊ'pÞ~WºG>î/¿‚rÄ5°?^>ìÍ–ê- -•ÒÆ’äg°fwh‡ü$Ö=á]*7ybãüÉòz’±Ïr_Š\ç‹òîcr­/G®ÉBW‘«=pijC®òD-p·¢%*ØßK¾¾Ì eʳBšl•Í&¯, ¯vO­ˆ]lËcwX}ìb«‹ÝZµ±;ln캚»ßæÅ®²¹G'ʳ°Ý1y|(U¾ –)r¾æ¬"ç…tó£}Q-i#Zµ¤åÈ™¾tYYåYmæûÌ?2瘳Íw˜ÓÌ.ó`sй¯%Ñb·ô±ô¶X-‹Éb° YúFÕ‹þ¡ÚïA_“]“Ak BkEì§D°EÐä‡h"‹x ¼ ü(xxø!ððjðJp#¸I½xT[Ý!šÄšv{¬»F¬î\-6õô6‰•=½•¢QïEšM`Ûdвº1ÂO8ú7ŽsŒK¼;!oBà6MYO›ñÃãøßÜN÷¦.Žü´hfIäWƒÃ‘QZG.Š ×> ;Ä‘ tˆ Â%¼\Œ ÎÐÆyy µb]ZEÔ¨T¨I©Ôª©Q«”ª«mÑÔÚZZƒ¶ÖV]Ÿ‹Zt•ã.]åPl'/ `'¿P3YÉ««yMVM ‡B×ãjòc3¿_×ÏÕšWŒ×7ë¯Ûóx òh*m(´y2ôéa?Lû\útulº:fƒ˜ÏŠ-wÅæ]˜ÏøÿôTþ_Wm¾¸e¿öI_æV‚Ë"Íø¯eÝ|§³mËÅžoý´²ùU–WF.º+‘-­yÿm¦÷kÓÍî@íÞ[Ò¶ß_PšýÍúG§î+Þ~‹­-7lï»Ífû´ÍŠ5[S·ßfz»6=U³µ]³µ]³5Õ?U·\<³pÅMÏbÛ§aÞõÿªUVÌ endstream endobj 316 0 obj 3570 endobj 317 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 18 0 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 315 0 R >> endobj 318 0 obj [ 444 ] endobj 136 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 317 0 R /Widths 318 0 R /FirstChar 122 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 319 0 obj << /Length 320 0 R /Length1 4800 /Filter /FlateDecode >> stream xÚ­7kxU–çܪîê<ŠtçÙ‰ ÕM“wwèˆÄ¤’t‡<„!‘!¤Œ ‚Y@ˆA!ÈPÄQÇQ*Màë*£ìª#~ÃŽÃÊ2>˜5Šß8ìή€3bºöTu@ÙûcêäÞsÏãž×½Õu‘ÐÈm¾n°Â✥‘ÙÖ³Ú¶¿¤$ŠÖà“–t/íÜøÍ¾aC,;³ôþµK’ò÷\.pùí¾Å—KJ¾ˆˆ¤=Ĉìàí!zbGçê51w±CDwm½¿«ÍÇe²b¢ûˆ×é[Óm*d¿ z€hÛ¾Îöú½­hû»»V­V÷ãDÿèÜîÛ»{ßKÛH ðÆ“ÄCÐòÑ22ÂxÂéN¦ó8¼¾2Ðßj`†H¡aåö@ €ú9+4þ,#9É‚¯«ÿÆiV†´Á‚%Eɰö’­ ð)Lòð9=çà3˜ ÷Á¨†WqôÃ,(„N¼&âð,¼A;ÖBéVÀÏÀN»N¨o¯^…\‡0H{ ‘¬< O«gà9ø ®©‡Ô?ƒ6‘Æyõ?ÀI§õ$唩ds9tc[­>Åäo/œ€O1^-†8ȇ"ðÀRè€Nx'Ùëp>ÂdÊ&\ä§æÃ6Ø{@A Ægø0µC]ó(‚å´o'es.ãßÄwÔduHUÉ·¦A™.?ÏÀ!x^ËÞ!+8çs._ÕÉê Ò¢ªÉP?¡°ž2Ù ÿ ï|F^Ó±ïÅnìÃ~|‡•q1¼`˜¥Ò)ƒ‰ê}ÁlŠE:OQ _†_¼ RåÃÐÁJY»ÊY8™ŸcèQQ¨o¨¿£1À8ª ÁLX k` l¥xwÂqx .ÐYýFQ@3&P Cø ~Í€YXYû-×ÅõsGxà🊠O_ ލKÕ§Ô÷Õ¿Qö ª}:L%˜F>J`Ì…&XLµ^¡ß§á Â0Õî<\„O`‚8žòœŠex®Ã_à<‹ß2ÆÌL"Ÿì và4;ËÎsI\ —ÎåqÍÜnî ÷2¿Ë°Ø°ÒðsàñkaK°-¸8Ø\<¥Ö¨{Ô×ÔÓ¢Ñδª(Û9Ð@'¸Öéµî×îÅsާ¨NÂ)zÃÏÁŸà*ݹï©az¬T bSœåèÁ*¬ÁÙØ@ç3чËqöâãx€àµ±¶Œu²í/±#lˆ8àŠ¹ ÎG p§¹óÜGÜgÜßù$~5ÿ0ÿþ,‘áÿ‡¿n0\†{ óŒVc¡±Çø‚ñ¨°BøµpüTãÃp~ü´ÁZ¶›}½l½gïÒ¯ÕoY%Ä<Š/P¥^¤{›Oð1LGNð(ÕäIi©ì6i|Jò]I‰Ö„ø¸Ø˜h‹9jœfŒžcÙ^GE‹MIkQø4GeeŽF;|ÄðýˆÑ¢ØˆUq»ŽbkÑÕl·kʤ¹äÿhÊ!Mù–&šmEP”“mó:lʇ-€÷Íi¤õv£É¦\Ñ×µúz@_‹´¶ÛiƒÍkíðØl±y•ŠžŽ~o‹‡Ì ËT°ðœlºT‰Ͱå¾ VBš†WIrx¼J¢Ã£Ë¸T¯o±R7§Ñë¹ËnoÊÉV°¼ÍѪ€£L‰ÊÛ®í³‘j}#ùÎÉ^¦ÅÛ";o ÈÐÚ¢­|?iT8_“ÂZ4–,%ÁáQÖ}aý¼¹ò>ù#¡ÂR+|íýTšm•!²E£|OU3×FfÙ¦¦F75…‚ÐceÑîðjœ–å6%ÌQæèè_ÞB5‡úF’œäuø ~Œ×é×7†bK{—GŽ™8ÆEƙ̻…ˆ8Šì Y1gÄÄØ¸3ö5c‘®¿ò u,¸Ú+…n÷Íèò\¸§¸ŠqJ~šC˜6%¿À=9>¯ïlˆi©Š/Ϭ¸»¬dqÝá´ô‚ÞÌq&aj~ú̶FŠåcõ+|“¾Ã&Ç2#"DònÊd‰‘âÛö5?s|Ëiž‹¿i<ÖèÀñeåNgY©Ëª¡2§³\¯=õQ\ª¡â¡KNì‰ÝËÒb bYäh«éÒîï­Â%Gì%1€øcZcØ+[ÄHŽñ¦8ƒIˆ´’ÆÐu,2RLL°žÂ5`Çq!ŒÝMº”cá•Púµ×®|ײ²è|V.„ø8Kl|Bœ} •ÂBµ˜`¦¤ºY+Öwž][mMOš;»" M†°3k3ùäñÆ‚û¸g]“SÌÉ'a¬w„M '¬\Ut Ѥӧ‡o¬½…íÁ]ôViýkØM} !¨7,ÁW‚¯ 'oIn>FÃ;`g¯@3jG¥ñ5£Ÿk}2ôÂYŒ¦¯î¾-2¶ˆÆzo˜ &Q‡ýuè1ûFZÁ¼ºúò견†eí«rê»:}Œõ» ¶C;Üé1Òˆ 9ŠÞWêä娰ß5`T–œËÀƒ (—Šxƒ\¸ôÙ¦Ïf}¼!Gh¬Œø×ÒÙŒ'ö1ŽæÓLë¾TA¡Õ›ÌD¿_`-Ö‹’ÞZ9N:E M-´‚„yþͳ¥7ð%°ˆ;ôùQyœMüÔ&^´‰;lâ#6ñ Üu$¸_ŸQW'^¨ËëÄ’:ñî:ñ$N§¾KDNŽM_Oéâ/ÓÅõébOº˜“N»é_©Ï?—mÕâ·Õâ»ÕâÞjqSµ¸®Z\R-Ú«ÅÖdqb²xW2½½Ç£vF DA-‡ÄÄ»v4Ï)•ð›cn)+»@ àVC6¡Çü ¯J¥q¸2x¤Œú ƒix=xt¼]:^ƒ.]þO~gm[å/~–ÐJñ•cäêÂå~÷q§ùš¥Ò0tÙœ “†süÅ»HœéÏþ@*µà$ÈÅTbO·.v€[WŸ0†þ†4R7 Q jFÑ/·—n8ë¥ë¹ž8×r&BʰWýÒ'NBr‚ôGg³ôïÅÕÒ²ðvÈô¦ó~éD¶¾áWžSšux™ºÔ}r„ô¢s—ô‚s«ô|±.~έÛÛÝ £§2ˆy\ÚJfVåÒ‡Ï/=èÖ> endobj 322 0 obj [ 333 333 722 722 250 722 250 722 722 500 ] endobj 16 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Roman /FontDescriptor 321 0 R /Widths 322 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 323 0 obj << /Length 324 0 R /Length1 6524 /Filter /FlateDecode >> stream xÚ½8y|×™ß{3Òèë´% É#Y¶,ù’mƒ±-°9Œ1`‡˜ØCâØâb™†#~PhHJ(6MÓÙV”°‰·$-Ù@ ›4i®†ÛÔmwd[°ÔoF »ü±ìoõ4ï}×{ß9oÞ ÐÁF`@ììéèƒuGÊ9¼Nwö¯r=YU¥ °ö¥}w÷lúrÿ0€âY:r÷½KŸ­›¶@u/€:·»«cÉgYU8ßøÎ/éF‚®›EyãyÄ3º{V­ÎlbŠ¿‚xÁ½½º‹š>SâöžŽÕ}ª*úcÄEÄ]÷uôt…žÞñ>âíÒü¾Þ•«`+¹ñ‡ŸÜwWßú×½›? <‰4’?’GJ’Ö€æqÊ7?оJ?ö&Eÿ??%pßÂTr¯–{ hÑŒU@ àÄËÆ<f€øÇxâõÇX ò‘ûEüߘ4œq\ºh¬ª¼àÀ¬=^­ƒ÷a"XÁ“JÄÃyøfÀ0õp„L…í0 Ê ‡T@ù ”@Âiœ1½([ß7Îz)þ ÒJàDáZè„ hÁU…ÄGà|Wã‡ã„ lF‰Kñ?@+èQŒ¬2qÍåÐGòèªøV¨D}OÀKð>I‰WB2C9„àn膸FÞ/à¼EèM ž:X;`/<ø%ȃ䇬:Þ_óÑ‚å8ozs>ƒÿ Fò29wÄÇã¨Û“ Fæ€Âaø‘ä œÅvFÉ\²€ñ0Åq>^¿ŽòzŒš p'ÎèµèÉð/ðkl V)!óHÙH¶“³´†1³œbVü!9k^´²f£ý+ÑÒÝðÆðYø9¶Wá·y5ñÐjº‘^aŒŒÈÎQôÇ7ÄÆOÇßÄŒ( ã߀m¬‚Õ° A{÷À xÞÆ\ýÆG ÄŠ6'ï‘/(P#õãj¿bz™íÌQØì{ŠJÅÖØ3±Ëñ»ãÅÿ/ôžbmebæK±MBU0æB+,ÁXß#×Çà( Â0Æî¼ïÁÄHúYJjÈd ù1!çÈW”RP§Ÿn¥Oa;CÏÑKŒq2>¦YÄìcžbže÷*–(V(¾¯T~Ám‹uÆ–Äúckc§â ñÇãÏÇÏ 5n´FÊé4˜ŽÞÎÁ;q>,…5r¬·Kµ„öƒ±@«NÂ)ÜuÎÃGpkîÆA-ÇÁ†‘( e¤œT¢µ$D¦“2›4c~ÒA–“ud=y˜ÀöCrý8Žm˜œ$¿&çÉ[Ø.“?aûŠ*(GmÔC½T¤ Ø`ë ´›.£=t'¶gèQzœF`*™:¦[„9Ã\bÞb>`þÆÚÙUìƒì?³çØwØËì²×Ebžb¾Ò¦,Sö+ŸVãîá~νƒ{Ï%xNÞr÷wÂÝGÿëéT¼Ï^ÃèWtfb9FžÆHýë¶Ûï±‰Ø ±i°=„11Ë›™áIw»„4§c‚=ÕfMI¶˜MFƒ>‰×i5j§T° %öÔµ»"ÞöëõL›–'áž$t|‹Ðq!©îV™ˆ«]sÝ*)¢äÒÿ&)&$Å›’Äà*‡ò¼\WØãмò¸¢äŽ9-ï yZ]‘Qž)ûe˜GØíÆ ®°­;äŠvW8R×ß½=ÜÂ冥€&/ #¡•Ž@mǺn’D8b÷„‘TOHæ1™áŽ%‘Æ9-áз»5/7Bj;=‹#੉èsƧKó\(ÚÔ‚ºór—IöÃÝÏ’Q·KPÇ-¦£5BÛ%ÆœˆÕŠX×|bûý ?ú-f„fÖutm¯ÃÐ옖@Û%¬ãQÄæºpYº¹µ%B6·&ŒmOxÑå K”ö守ÚSãéÞ¾¼cM-CvÑöt„Z#ÐØ2”*¦ÊH^î°mý7e8¯:¯Z§¸mëãgßMÐsF+Ë|ˆcCÓ͸I“g:šquÊJs¬|–áZùLÃX9T••®`WX4ºYx¹ýÑëW4üýÅ(óîLù$°(¶—ö*ºÁaÑ¡ãY†WéÌ,«ã#o6[­vöÕ4cªÉ%Úcîï&Í»2+ÜúªªLeeÄh*Ã^7¼^X`2—”Z•œÒh°š¬œ7‹ßø‚ùpx ·öw2‹wx±{ãÀoc‡c7~{{¯{ÊóÄ)X${JО©hêE—š½SâŸÑê9½Ò`TšSÐ&Ë4í úÔäÙ¦™ó6]»Õ&kd“  (‡&qY%¥%FCÍ*M±šŒtꬆÙ/˜bÞ?uýä9í·] ±kýë{¦9ݬy›tá!{Ý-C±?ÇžGÛÞŠýž\ÃÝ׌¶y_c CU e”Õ’<â^=nÙØÚÑûmãÆÍ- ¿¶®°€´±hW%™XìõpéÞ‰Å%Á¢”drmO³¹}ºIS›]7¹¦jIã ^_Éúì$WZì›ÑÙ‚¶à™‡ÉT,‚èSû-[,Ôk)±PÝØbÕ‡éÌßsz,òQrßy±%JÖ‹F^ÇPV•¬Pq:ZJ™()xQ§ãS­¶Sd5¸ÉOHŒ×и½åUhêÌ«£7ÈÕœŒåŠ6HI6ZR¬Éî‰h¶íNWr3ƒt1iê;7PoóÙçf^¢U¡¾>cf6ëHS–ÜÁ,(r¸Ù3à‹ŽOÈç0Ž<5ýNl[¦Z®ë5Ý›ü 7 Z£[gÜ`ZgY—|#éšžŸ§Zªj7ްgMÙOÕЫ*TjÕÆ¨5T­a”Ö2C˜©ŒÒáètš¹=Ê)©²š×:m1Zã4¼©!š(¥Çæ]C”’A!-pîʨáZ›©ìÊhªFÛªÊG±|ûm¶1ãx-ã_JM퀘4É™v¯ÅdMƒë°¥‘T›"‰ñBŠÑ0ÁŽÕ+½999$ÇP.ýsr6m‚6"EÊF‚ExG$O:Xl Juèöfy=¥tñű͚Ó-Û]áñôãSoüùåçË]Iäí„•yÌs¯ûüâ}]º oÇðë$czWIӒ–é˜{Ñ èÇ3ÖwÄÒR Q©S5~ †—©‡÷ý w•#ó}ãVxÍ)6ãc¶ –в4'§Tz35LšËG|QÊŠê$§;À0€Ã$Y+m¸]œ»ÚVfò^^ŽXÕ許LŠHºg3ŒØ¤’…¶R)õž‰ÁâR¹^-JOº7@òÑINé$ÁdO¢B|ËkÉiz·eGAº3ÛiLò¦Ï˜ ¿þ·ŠMc_8á^úPíÁž uSÜÅž\{²³ÁW=Z;¶~E•Ú!ï¸CÑ$ÅZ{‡Ø/‘ƒÅ ?Šûןþœ•KyÀ·/:È?lgŒ¤‘Òt"ø‰”¿+#£Öásy´.¶JãÐî1¤ iLNFF:&Æoqš]Äå,pRçcNC–•óû4íÄžcÎʰ¸ÅE˳çÚ0a— #mRÊf^>7ºoQc&o|¯ßH›´Ÿ“DŽï=•¤TÊ£Ͼ7‹R^K“Ýê;Ë3 5nSÙjkÑDŽ¿#ÅÂLïÌÏÒÆ¶˜Ù­*l$¯vÎS°nK¶ÚlÓžn]R‘ïŸT·¢"T'“Màg z´üT×BHH<®&2ÿ;C?N[9Ty‡C•—1÷@¾Ì\>¼ŒÔICÍ‹„j5 ޝY!•4æ UîEvöPîBµ‘dA>ÉDre¶‚²xúø¨jö¢¸â8÷G bÛðvB¸h®åGY¤\ͪpøÈ¥G†„÷8ˆVáÝÀ"áw•õ®ðjóeáåÀ½ÂK¹ò„Ÿ…NI«Ã³¤€ìµÂO{…§?ª”Ù‡‚òzûšåá1?Oà2+óñiH¸?(iÐ ÷àŠËs„N$ïõB~n©07pR˜¸_˜Ð4=$Ó/Éî|)òÕN¡:à**ߦ„Г!¡Lš>$'”åËîVÎrÐ=ö„Ý\(¤£J"æ óîæîâæq¥ÜD®€ór™\çä,*“Ê JRéT•J¥T±*¬[•%ÿPÌ‘ny‹Ò JVêY6P©§‰=ƒÅÒÂÇäæÙ™Ò_e«2UËêB·éÚÇûœÛýœ‘} s["Ï9[#Ew¶6D&J/ÜÃä3òI84L>•†VÄÝä³p“Lw‡Z[m ‘-QòixYË:"¢Äü øÞŽ ‘ùò:àGRhš¥ס%à—ÖÁ’-‘ÅIˆp Iƒ$v²X€^–ÅÞÄ·ùáA¿_QäÃ6Yd›"_Á€',/À©¡Á@@–ÒDHlw&"/ä” Q¤2(‰ Q`0X$³ß°s즻If/ü†Ÿ`J°!;çÿè×Uó¿“;¶ðÉM¤/ ížp^í‘ýÝ¶ÈÆÅ.×à¦'Ç?xÛwvKcGWäIOW(²Ér .> endobj 326 0 obj [ 250 722 722 722 722 722 722 722 333 333 722 722 250 722 722 722 722 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 333 722 722 722 722 722 278 722 722 500 722 722 333 389 ] endobj 107 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DQDWOL+Times-Roman /FontDescriptor 325 0 R /Widths 326 0 R /FirstChar 32 /LastChar 115 /Encoding /MacRomanEncoding >> endobj 327 0 obj << /Length 328 0 R /Length1 18696 /Filter /FlateDecode >> stream xÚ½¼y|[Ź0sæÙg$#ŒR ˆFüÒuK6b~ J~JÂÒ+·8Šíß½!üBìÕ+6®\7tâç1„¤j„Dí+×n[Ñ™«ùBª>„j«–/Yöù‘ißA(sô¯_Šíô  òžUë¶\½ü;¸òcß²vÃÒ%wß÷ؽ5÷C>³nÉÕES3!eȱ~ɺåÞû·¯ òu7lÞBãÃZÈù…¯X¾q›u ¬·Æ”‘ucDÞ‡¼‘‘9hA¹ä¿(xgýÿñÁjX$AR$CrX›ÊT¨©‘i‘rzd@FdBfdAVdC•¢=Ðmâ TÒ› á S‹ßŠ.GîªâÑ-Ð{_9”>^ô,Úƒåh;ºu úz]Ž6¢Yè0Ê /ð¯Ðxo/º &/A“qäö SñM¨YPü”úöçAtú+ÚŠ~‰–¢7àÂqäA@ÍÅ•H'zÕ£[ѾâoË$ÐSè½âo‹Ô‰¾‹ÞÃÜKïµ yètº›p5nÄ×!¬ájô2:E©¥Ç`/zÐtÔ‡úÑJt”Á0§ÍD‡ñ/èI0S?º'ñ©â!À£zÖ V\O…Š'‘U£jBYt º=€~…kq3]Çœ€=äÑt«°hùÕâ#ˆƒ§-„•ÞîCÐ[è-Ìá>*B‰¾_ø0±V¸ÝŽ~þ‚ex¾šÊÓϲÅ5ÅÑâëлæiGSaÝÛÑýðvÏ ã@]?€=yWá™ø~ügf‹(6qCá? Å¿nkд ­G;ÐnÀÍcè‡è×h },ÁüC*JýšV1‰LETÜ%PjµÂn]v¡Ûà9=~„8€ãx þ%¥¢*¨µÔõÔAêsz7}„þóÇâ¤â³Å×`Ï?êrÃãC³«Ûk{w‡ÐóèÊ£Ÿ ?¡/ÐYØÉ5øv|çôÔsÔ/˜oE(>Zü¨Ò;FQxâ°ƒSP¬e=z0u½~‹þ‰þ‰m8…¯Ç»ð0Þƒ÷áûðø+êVêêwô}ô÷éý31fèvчâYì’Â}…‡ŠÝðv:;tÓ{¸hq3ÐÄ#°#èô*¬íïèØ¼­7áÙøj|¾ïÅã÷©Nj µÚHcºŠvÓ~ú6†c2ÿÁüZtèö‚¯0P¬E„nd@ M°î~x£0Ë5ðÜûp½Øú1Pí§@Í_¢o`6 ð,ÇìÄ~ÜÏÀz?^„—àUx;~ĿƦԔ™rQ{©{©'©ÿ¤þHo¢ï¡¦GéŸÑ¦(’‹bðt‹à}Šþ*ž#ÞͶ±—±ÏH~:Q=ñ“‰ßCÁ_è-Ü\x±Ø_¼²xUñ‰â3Å犇‹§N¥v«€¾ðøQ-pN7š†Áú/G›€&‡Ñ]è;ð<ï0ŠŽ¢×âþý'úúžÑ'€ÙÏ„wú} ïdÆn\ôÒ€âËð ¼_#<7âðƒøaœÃ¯âSøMü3ü+üþž¯ðßñ×”–ÒQªj§¦P3¨ÙÔRj9µ‘ÚA=@=L=M½@¤~Xþ%õ+ê#ª@W&:èNz^;²¾~‚~þ9ý ú=ú÷ô×°7 àÈɸ/“fV271аOËDkDûáù¡X.^#>,¿%þ„³¶“É>ÍŽ°Eà”ÃènàÒ‹>@qÏâ µVIãר£øü65ÂŒS*<€¯¡UÄÆ{ÐÇÔnÚ‹[諱 øøNÔEѰ‡*êQj P7ùÌ.Žö‰~Æð3 nÅ«@Þ¼ôÓ mnC'‘·øHåï/Gǰ 8jyñAà…¸ŸZIm¢þÄ|K«BO¿tó1ð~ß'~ -¤B@mÍh?HòàówhvPµh>z¾ 0íÙ^ͬ Ç¥GÐê>j7u´xšBès{ó™)1‚ܯFþ =k{“úµcÄø <ÖPIK€>~Œ<Ô£h9½3ÔNêoÌ{è}*EÍ§Ãø¯LM£™€§›Ðþ KÐ!|õ5v¢}x'¼ýGø3ê#´ý © z/µ ÿÿ©n££¨@ý_«ñ ?‹LXB5‰®>¦Ð+ðÃèg¢Ò¿ezèãˆÁ¯àê[ÚAµãº±8޼â¯ieáÅI¨*ïfäg`w6¡÷‹¯Ó5Ìfê7Ǿy‡2á»éu¢þâ_ ÛE7Q-h…èS¶m£&„xtÑaTÏPVØwJÒ°S&æ®o¾¡f¡*ê ü%ºïîðÀ›ôä8ŒVâg¡-ѯYÐÿ¤‚Ôì¡·‚œ9Ž^j¿d»ŽZ zfž(ÐŒ jø ³mËg&z´éAHÙEOñ­}|¶¥9Ó”N56$ñX]4R[U~Ÿ×ãv9œ½ªÒfµ˜MFƒ^§Õ¨+TJ…\&•°bCS…;Ü“‡9ßPŽñ¹;;kHÞ½ –\T0”s@ÑäKÛäCB3Ç¥-yh¹â_Zò¥–üù–XíÈ LMØÑáväÞnw;òxþ¬~HßÙîp䯅t¾KH+!ítBG‡yU»#‡‡¹ÉW®îj‡áŽÈe“Ü“–ËjÂèˆLI9¤r&÷Æ#ØÔ‚…eêH¡D ‹ÊYÝí9‹»¬ G{;–,ËÍœÕßÑns:jÂ9¿˜¬ÈÝTs,uÀJúÝð"$ZÞˆ†—6B3ø `è•[hX“NV§I9éŸyÕnÇð—ÐîÿüÒ’%å±Wý%"IBçé êÏ¥s¡P®ºšÐ;  klòÉšð•yêÏîjØ>4³º ¤#°çN'Áêíy]™ÜÎYý¥¼]fA|$4£†HÍ©s5†9¤f繚ó݇Ü@¾GûÞ“øÎÿU¨ºŽUé6þ/ÕËKõݽîîYóûÃCå½íî»$Wªo<_WNåt“úiUNQ6Z¨J\x¾1Éô+rŒþÄ%/˳ E¡;&çÔC¥x@ætþ¿ì”/~Az àB·ò2séÐ¥ù¦Kò—,O1LÂÕÝ7xXvIÝd;ÃÓݎÉÃCÃKòÅ—¹j÷ð °ñrÃ;†Îa4_û=ã÷ê¨úê©Já²$*W ¡"u)HdM3L‹Mts+xÈ*xKò„ñ}ß'>S ƒŒF“×ç3(”F$æó™:C8^åËÓû›~˅؃ÏàÓ ¾H¾øÛQ»6ÉÓµ¼ÒjUË õŸA­V¼Œ'FhptE¿à{ÎÀC;C¾xŠW¹½ dP¢ú.†¢#½IÃËÔ>¦o¹ªxj´6‘¨"mM>¢jgorÕ™*ª*Vo0êe±×Ì¡:C¶p0 :Í dI§Ñ˜¥Íå¼Á]‚årXˆu¥üS*Tþ ô|z64¸):;®žøjœL¢>Ä©íRÕ†TÛÕ¯‡ÌYyõÖ¤4Ú”&X}z©—dv©Ô¯¿1ˆB¡Á+0 ;ˆºsսݹ4ðè«(Yü9J@€{ï/~ÒŸ4ƒ˜fŽÉ5Ô7˜Ä%’hh³¥”¶Ð­©u±bÊ š%>ú¯i™D¡4ø[]w·„BFÃMëgLëZóê=›W4Ï2x~Äw®Øß^·ó`½{bþ¥T­ª«˜W­ ëfvl¯Û¶f?^²¦ŸzEefNadWûŒ'~ùû9ÓíÕÚíOÛƒE¼z Kd˜•ÎBóD/V2>²‘•ö3™í£›*¥t}I‚PŒÛåÇ‚\q»Ø$ (©×JÜ.1KÍøÑÐÞéëïÈþ´ëþý8êV›j ¡à²iý/ß¾ epÄ'Ú3ѳlêÝÛŸ(ü`dcÚf°*µ¬ïŸ_7Ü€c,\µÈ ìýZàûVò“oRe$ªEaò×ZP N‹Zü-;¨Û»ý©ïyŽq£5‡¬”•±ˆ¬~. ¾Å‡¯ñûŸvÒF®&û¦I À(àÇäþÀá )-š ÿjÂ?äcíXï²Tdå 8eä|}&!#‘ÜœH&ä|,ÙX2a“Yå«e«åÈ~'g 3 ‹ sâÌ…n®t¢>ÙeïjšS»+y~XÿáitçeǪŽ&F“ª>„}ÿ-‰fh*#í…Nͼ7ÙÌ»=¨Lêõ·ÇçÓ­•a™œÛ´kË><{Íœp/ôVƒJÃz'6óÓ C¯tÏÀ?$r—Þß¼oϸÀ×W¨å^³ÚìeD-¡´½’YR* ­ö6J›ìl—¤KÚ)[ ™§žã½‡ù.ó”n„9îUûɶ7û’RW¥&+qiåY‰T"ÙDjp a/‘µ(mU¶ˆ¶Ùän–ùårGºÂÀ(ƒÕº(ÂÖ& Tµ303«âa ý`qY|¡×Ìç4pÏ?Ʀ‰=¢T›Š †ÆËXBÂÖ%”€ìtµ ,EJŒF–•”!K TÑBò#K06¨;ÇϦa{VìTÕ—DîYöúù·ÜdÿÕÝ÷æ±ñž5+Úæ}ãë÷^{m²nÅGx[Ì9°½iyÕgù ûpãss›z§-mZ5Á†;ªï#„ û “éÓÀë“ðŠˆ†å̯ÉÒdusBY1oj5µ¥£íàÁ„›”[-îâ!ê–ïàÌTêD±,”É#bjR_?¯p2LG;vó0Ž;/çÕÇ÷5{jzŸÍ#­SpŒüeÔ¡ Ù¼ÈÛ6>ätùýMMjc܆£&ùÛÀöâüzЭÔÿ¢QudT2×ðsêútª.š§ #¦:ež¢yuTÇÃ>×Ι¸vYì7eþ;;81>1~žáÆKk€Å¨ÇÎY=˜Ø9€Ð]¯¿®z}—Hýº*3pžÏÊ&û ¡ˆ¥iƒãÊØ³ŸÑg]®šùY'‰:xÝ9cké`ÖMS¬À~ ósVP=à¶Açn(%Ê:·l(—Ùz²ÔRíÝ뻦®Þ¶pa¦š‹{m^ƒš•êB‹§:UÍÏ?¯êmk7ÕO}²sÚÂZç·J•–llRÒÖIoj+t>xìƒ9­KÀq:+±õ—/¯þŒzªÍÔ:puÛÀ@O;걨#+ $75ý‰œåO&3!àÏjFÓ°ŒOÝ=é íÝAã““ž›’Ó¾j‘$Ó®Q¯éÞ¦ÞÖýP÷¡n±¦¢‚k™ªoi™Z¡i™Ê´8;԰$OÇGÂ8íž‹¼÷„Ù¹B«ÑwRFâ‹Ö·8n¼é¬Ó¿LÇP%Š‚ÌÐu¼4¨H»×[Ó•/ÂAÚV'ƒ„4+|„:ˆß âà‰ž·¦‡‹X¶Ÿ‚iK¬ÛOÕ`Äœ ¡þ=;øÞM™Rçð_x÷X·KiÌVF=+Ô-j°ËXœ–™SÐÃ&“‘ ²–`P)_ß&Và^Ã[(,>‡|`j¿ U=£Û¸éGk’zOןHÄ·}zçu?íO…l××κiý ÿx§{¨¦g sÓ=‹&%—¶ ÎY½™¹Oï}«{mݽª>róÊ•rGX­Ñ;55¾D²cöm=MË’¡A»nŠ'˜_oØ3oχvÇ£3þáÚžËÒ+›ØêÝÒØjYÒãŸlT€ 9|dB=žÁ¯Óö±sƒOéÕâÕÒËíkýÛ¤Ûì×ú®õKzÑå>ª7Ilƒ¤ÆTu(F:}}Gíü@2Z߃Ý5¸!V¡àl½Íæ@aTæjjõ55µî:†­ ËÌr[CÀa«­Që‡u gG¬×‘Çž…×Fl˜¢GêVC¬^0v 1¥P™JÁ.`uB€¼6§rw©UÛ_G l»s1°ÙêÁf;âp5)ÉðRlV¤j!€ ñ»ã:}‹ÞU’kË O_ÐÉ*ª¤“u%©^"#–uã!Ë&©Âÿt0ÊW^cÒÈ•šT#çÚ6Ïå¸7-ú*oû€ù¶jîr‡8­× Úómk¶5´-* N“¨´Êðt]rG]ľßÕÒ›ÕWp¿™Üû6sõuÖ€˜ö—|îþâ'T­Èþ{{x¿i}:i¼2Ô†xm2Ä[l‰¶¸±Ñìp΢ÁÚ(ÎÓðVPT(‚œÝ©·Û6¹½:à´«MÃF@éÑ éFZ‘ÇSF衊ªpéSI^Y‘Hò†d’W'er™Â,·(f£[4O©ÙS69Ù4×ÄØ¼Ÿµ†.«fûÁ:pà€RÁ>=PÄ¢ñ„â€Ì%fÈf¿×hM)Á¦‰|'ÀÆûiŠa°N¯7ƒ òø53þ€_@vN©QE• FUÄ ¡<®ä aH½ÙÌy|zLJŒ¢²c¿^£ñc?L¬ðcpÂ`5qXNH †” q0 ³ï³ú]òPP­´&íÃ\Ÿ8nóäõc¾WèÐê(Nr¿8ûYP ¶D°$„,X+Á2U ªA–N-‰ I°ÀvÊb`lâã¯@LŒOW ¤²=ÄÉfÎ ‚’ PÒ çeQfT&¤Ç@SB¬>ÍJÔIf‰·Ë t%Ð+Æ ‚©íó¹Ý NV,°º‘(Œ ºßG³4°ÿ9⡦Æ®x±Q«p‡Ýr|LÖ½.¾Ü1×è¨×éôS¢É½nK´Úܽò<­Räu›b ‚K›fQJÕ2Ÿñûº«¦uÞðË@@ãëµìžçlÂ÷]Ux”ٺĢ3;dnáÍþ_´U…ƒüT)ÂZÄaŽ·&ûP_åî&FæGå¼|¦œ‘Wuæ*£U=Â-oÍi z­ÖP!×Ú­úBõ²“øEÒÃ+h¯iñ)í»ZJ›ÇM¼Ì.Õš´vÙUÓÊšèkÁ°ÒêÀë× !fÉjù€^Èz¥RÛ¥N(%ÇZ^m+ÕWXʽT&(U–Z3§´¼ñü™W™ÇÇÎ~>ø¯0~«ƒD †ð&AÂÈÉ<2aGÜ©²êÇÿ†íñyÌ-)°èT ÄRöÅ3›’¾¸W8}Sœ¤ùú ½&8—»5éK¸<é›5fŽõ ¸p?­[«—êào¶€Þh¬ÁÒŠÅÊyú…ƒéÁ¦E™9³WéVׄ·)¶¯ _ÙMß¾=³{Ò£ôê‡ëô >¨|¢áû‡S‡Ó‡›žÏh²ãXãñôñNïåõ«Ö´Ó³Ñ@ûìÙôîúÛÚè —§®©ßš¾¶ýÊÎ'Sâö¦üS"s6ô‰œ®ÞB7áé¾ÀìhoR¦YÜÕª”¥1êNÔi4­u,Ûûbõ ŒGeé4×Ô¢ojjA¨·“ëêÖwuuûä]MMiY°”GKSw—Ú5ì$:ߢ÷Fó„D,Þ ¯J?RÁ<•8¾!§qš˜ò†&Þlâm•‰ M¸i&¸ÿÞ–çšNâS¨“¢v?7ûtWÉ8€;)N£ÐIÈZJÙê°åM‘DbC×™.ªËÒ45™ºLÁ¾ öÂE:†ˆŠñ³gÇÕ`OŽn‚ò‹ì‡ón;<Ùó6„¨,'.2&ÆÀ³‡?"T˾<ü]¬|…O‰â4J° 2K‘š °ž¼AEªB°=SL  Rao ˜Ê‡Ë¥»˜Ú‰KI EÉø`µ ™!¦ÿf‡4\ìl¸ÏÛ%à¶ÐnÝ9±äÇ/Ý8¯yñüd:ÖfšòäݳfÔ6i×{¤b™Ì’Š9-;æûÜ‘àŽ¢åŠŠêÈðÕ3:î?XiT;½™—–E÷ž0³NÙ$¥wš÷ϼ®ÑÁÇêfpݵíÙ¶tkáÚ*•ŒÕ…; ;bQwô;¸uƒB§µ¨T¡Ýÿ95x™Óf5û‹hkCá—Ôm}:©Ñ­(ñŽtäsÀ;õxoÉ«)Ûbü#ecL1"e‹0³ØÙÒÙöYŽmøÚšÝö§ýß œ¤Núä ñÂÀ«˜ž/oŸïLß5ö’á+ž[=+¹Öœs©áìÞš’Ý j£šýn F.ƒØ‹ àªqá}8\3~kÂÿÆø%]˜´å©}#ÉÓ5ÄÝ Ê $.U -¢éÂes8\R„aAN‚Ñ|&ŒÃÄÿæp¨g|lìlè¿[ÄÿÆò½—‰W}‰Uü¿ÅäDc“ ýècÿþ7k©¤ÏÓPÚë·¼øã…±Öªk j©B“Ìrƒ½éZoصÅhÕUú§>>áb÷w¸­ »O •¦\[2³¬° K­Ò)«çênIùk|Ñ­øîîj½Å\óÎs–?E]±Édt2bؾäÜyhF‰,è9¾UBIi±Œþžîyóã¶íˆñ³xyÀr‹îó>ݣ槴l½.m™¢ë²Ì“ÌÕöéX™B¡ñÈYZ$2y¹ž"iÙݽ vç¤ä^v?K±«Šû…cmÄCâ'%ƒ`O’oÈEG"ôš­tÖT>'$ÇÇY=Ÿ‚»J„ ‰Jâ¶V8”?wF$¸–¥»-=º¿0vëîç¾m7ß|ðé÷ü}¨ëοS3ï+üúÐáÛïÁCÏO\ZXðîâ•øIÁ(Ú SéŸÀ>¸Q ÷òÝsðŠGÏ)^RŠR†n4Y5ÙÐY=G¼\µUµÍz(pBòRðDõi«j’k&š«¢£(á╞º˜J…ŒVSÔhPé£w‡-ŸáUWÔ݃<8âÃÈÉÓwò. ¤Bngµé­V›Ï#“C¯ +¶Æ6«:|Ü|Hº6ÉÊ–€_¼Á‘dy.9ƒÅ<;“ÝÈ>ΞbEìIº ì’ÐQ›Û·’“ÜXÒJ®ã¬‚‡X [UâŒÛ,q«É—åéô‘¹ç‡Èž_ó‰9¢Ÿ(Ñí¹›“MHp/rÊâ\8—ý7ö pB[¾K)a‹-Ÿê À™_àcœu6Ô×_ptä\€.ߪàu¬;80p}á¡?Çz¢]FS¢GZÊ[=&ÎQ•Xß²:±våìÖ®ºµ?«£w¼sÅ›~[H+ …i&#§ñz™ÆôÚ^½ÍÎú'tSÓWì{séÌ9_?]²ù|°M)Àwýƒo¥@N:!ÌÂsèEÒE²ÙÁô¡Š槬Ò[¬û¬Å½›y¡ì‡Q‡óO`õ`Jï 8 ;#J¬Ìãý¼Kï‹1ÀЈãN½Ãátp²€Ó¡ŽJyéL)-=IñôÂHð´ƒà£Ö”rð‰æ„ƒ'¼‚ ¸€¾²*9ö;^u¼ë8ã(:Ä o;r˜b‚Õx¶Œ P|<Áš» ¶JøbAá^,²v;áÁÄ*×yéó ‘ˆ"¿ÏÁ?'‰„¢•xà®Ã{gÅ>—¹Æäd(V"×TX“½KªíÕbǃ'z§¡‘žÕX°âÐUí~o[¦ÆÎéÄ‰Š¿ì‘¶Þ+L×SëÖÖjj©°ÿÅq°¹ÿûE/ðžÆ&—M•È™ ³ÜP‘ö‹rwŃ4ÁY</*^Vûв"OµäÁLÞ0›äUœFo`^+ÏÎÄŸV¥ßu|èøÂAïpì…<å`KÒ¾}ÖaËfA9$’f> ÁéJe¦Ì×ÕÄíx2‡Ô_6 Ç$g'€'Æ„³îÌØx)(š\/Ðn_ù8Ëd,ùÃÂ^¹uqcéTË_K _&’o þØì­êi骪»qÚs7w.rjkLÞf¯øŠ¥ÓÔ•£ñ;78¬ª•šPò·o½¦=êÌÔ﹋_õ„KQ‹Û¸~NKÀ•ùùšä’[E´?4<öps²cñ $5¿ ¬$ðÓ¿':C}£¢ç؆ÑW˜öT¥Ñ]á¨rP;€”(;RU`FIJ¨ªÒnÃÖÊ*»Yda°ä–ÅÂ0ô=èq ‹urPàœÑŒj1r‹QMuUÐMiL¯u ÃlŰê$ƈ#U¡5òõ©Ä)ã»FÊ(ø8œ¶…»ÄÇŽ,*ŒÄ§1’s #‘L‚;1ñÕ¸zŒÐôXIÞI#*)^Øó ÁÂÄÄ/G¥‹xŽE™ VŸ.Ù䈨Ù8ëþ·ÖM ešþ¨æ‘C•j¹%hîu.œÝ˜ 7:ž¹_¶þîùÌ …/²#‹+5Z·~¥åÖ_C¨~5Éo¿êT¾Ÿ}è5ƒïço–¤-iJ›¬›R×—YcÜf¸ÆxÈð#ôOƒtNm_Ó)ÝmèCó t=Ê(g ˜¢JqÊ— Ì,|iøÊøeŠÕ7e2:©ÌçoL¥&QÜÑùü¶æÚx¼l1…Ø #šæt½N—1«ä6]3ØLZ6,¢‰k`Ë<§MªãÍ–„Ž7$9Ý ÝbÝ^Ý~H^¯ˆ{m|-®õ:öim%›É&|]Â"ÜÖê %N·¸‰¨·=n£m–f©Í¤3Á¤²«J—ê—¸ä¨ÈÆ»µYaà<KÞañÆ…–äÄñœiE|…‹0›É^¸s(N‚ B‰ò(I©M‚_@ÈÆl0ËS†²WÐ! Ááü¦/ÜÃ;àüRKÌúë.5ÅZ¨†úõçýJ¹&ØkŸÑÛ÷‡•êî]Vˇç942CõT®»¯÷F‹üƒs͑ͭFzÓÄ¡[ÜZ ·Ö´½Év»§~]øôç|]÷Ã8¹Á¦Ð؇Œ[Boýí…—ovëLmøñûÓJº' ´4,|Çç¾õŒ¼:àTɪŸ>μïd‚•M•]Ýè© +”*Ö̲ØáIgÀ,çsÚˆ6«¥µ {^¨ð›‰mE„ÛHuRq6_òŒ¹h¦fÞ¼Ó|—ù³Èl pÃÔ%|ƒC¡Of}3|‹}¯úßK´›°1rb¨M8JãJ KàH(Y)ÜÕÖ'*yg2ZÉWά¤+O^Ãtã‘’Ê8Ómbb\ abPTâ=­eG^ˆË(3GÊg§r®Äaì³…«Ehð ðæQ°!ñÀG4)39-Ö¤¬®ÒiñÀ ðu§A\ö­Ë ±|iD°ÆÍ¥ûw¯Qg4óÙñüªfÓ`¬õSöyk~ßàm-, ³ž ·%^Uƒ¹ŒVÌà‡éÝÚŸŽ®Ž5R·×À…šã‰š¹·=Yø´‘::1 üûJ‡Iì™ôLáé›\ÔÓÄæx øîfÀÿd,á—*‰¹À"¶5ã=2‚ŸéÆSmsñnË“øû–ÕÏ6Ϊ;5Õ¦¥ÎÍÎÓ–·œ"©[Q=ÛM3«•ª®µð->àtQV+àõßR T“lžüÒ¯Òq†´L†Øä)m­OÎT[ZœÃû]ï¸(×i%5ÖqOA<8¾ÖĈ¬²ŒµðM݉¾*ÙÒ2Å¡ä•{•‡•ŒÒÚ³LÉc=AåtЕzˆ vÊÇã •ÇK·zÄî"õYá û¼ˆ=B[úΤ„7„‰n¼`–m@ñb%ê÷‘ËÛóW·¥£“úÀ\é˜eEìw/ó™«BñŠJœ³³eîlUi¨lð»³K|NCÛ#‹šS§9ìpx¬*….ò]K‹È4µÓd§w'žoŽÎSËj>•Eª®Lì+<;ƒ3ÕNÕ^9=œõã`á/ÓcUF¯3ì0©}ß6þMÕZOyJöäPa2}+à¶ëø×á:s:)µX-AK³åiê(uÒz4½A¿Á¼iyÓªì² ØVÛh¦.‰ˆªBvkUÄ•6‰³N$fAìÊ“n|CXÏéß^áÌãS|C†—kNCiŠ­&"ï2=n¢fšvšr&ÚaŠBmêJ7v½Ú€³ 37Ð yÚÍ+™êˆíSGlŸ:á0ì]uש£gÖí¬£uÑ:¾Ž®#â5uN¼–XwILþ1”øœHWÁ2*…ÎÖûˆy½ä+‡ðØXúªKIÐ^àB1bËߌ)™©å#±úÚW:êêvY•áÌ ³êäbU“?ê ·¬-üô7÷ßà"­>½R¢“ˆXqEC×Pm£ª±ÍP/¥w§—ß[Ðw>2í¦™µF®ÒÅÁX?ã­Â¯D8?/E$"™kêe-Ô5¶‹½¯?æ¦7!=ÞsD«Ìÿ‹×ºÒ aRÚ)¥Ø™¤óÅÏùjg²žz ¿C½Eÿšþ'-ÓMt—²_ѯ\M­ ¯¦®¤U<ª|Šz‚V–E—Rª7©)¡ åT¾ø!o‚4¥D´\F¾DH½«Ä‚G~kòöà¦+²oÆHÀ¥ë£´À0ŸK¢R}‡Jõ¹.ªWjU¢òØÂKÁþ3ZšS@nT&—+èæUÒ<…»Œú}´°~R¤PÈy›#‘•cù=ÂÇDZƒ¡Ì8¨Ì³âdd>ž.hrš¥¾2ªW” 0 ¸ó ïi^£/c†ëÕ¤oPcLÅC™TE¬l•ðÀó­qíøçHýe ”/ýÊW‰Z<š¯r·Ð¼Dú’×9 ØI¾—§IìN©ÜÏRׂˆõ®jŒTyçMl¥Ž>\ «l¨òÑ›,Qu¢½ðEõ®HoBÂ×ôiÅÛÓ»cÇWd¾”X$ÂO¶NøfÛ9H¾#Z/Úƒ($=ÿ«^€¬³ÐæI.ÿVômAò2#ö’_ßV‰S¸’®p‹ŸQP=¤;„¢êé;Q#@?@žJfPñ4äƒT õC™à Ñ‘›´z;]…ªéªâ8Ôõ‘2hÍEnúÎbÂB¨û1L—€g=F9üg꽞9 Z&¾†]/Y#ÍÈÖÈ£ŠÿGù‰jmÅ2µGý†æ:íwu‹ô‹ ÓŒa“Ux·*ôW”A«–­F4!æ&ÙkˆF”ðÖÚòˆ‡Ð´Ö¶Öþ¾PßêuË7O_~Õì ë–¬ŸÙ[ÓµeÉÚÕK{úJ÷רxæÀŠN´ìßþF¹J¸©*ý&¹u Éh êD]hªð›Äéhš‰f¡Ù¨V2ÍCýhÍG ÐB4xõOÑ/ŽvtÄø<ÀP­GÁØ ¡Âê‹ílÕÑ/¢ýCxìÄŠ~‘:ŒüˆƒÆ'FŒ6¡W~¤­­œ¨o,%F«kb´Êè<:¢óô (õ ÔÆ¾h•Cì ýÂh  Ž>Nß0’æ*ZMô(RÓ#Èa&„>„ †ÅŒ¢ œP„À -ýìÈíæ^¡÷ãËñC0Èè æÜf‡ˆÚAí ©Å/R9G§°iIJ"Fxo¹u,s'ÞL ^¦oÆ&2ñux¤.ÎçÔ `¶E€> :½%Xéàˆ»ÔÚü%Ø–„©ÃÇhž™/þu4ík޽DßH”– cï]'ß”Y¸ üyÔ['¬«_¡o€-b)‹ÄÔ¤nÖ‚˜‚Àé³b䋺£Szbäôud29ì»—ú¦Ä´ÞIýB£‘Xœô©ŽkIÓ†æ˜öE°Å‹gyƒ·9nö&ÄÔ^_"&öVÇ0¾Xà=Þš¸"‰Çôðžôžö2"o=ÔÆc–t0ݘ¦Í^ x4àmô2/Ñ7y%ˆWsY›36ü L…éäA>x±Z®GÄY1½Ÿ:L½J½C1ûéÃô«ô;4³ZíoŸŽÐYz½˜U´&©q@îbˆ÷Cø"g!lr‡†0š1Œ’ qVHe  5‹ÿ¥†ð¦Gèjž<0 omÀ(ŠyLB“b IÉ‚C«‘ð­rêZÊ 2O‰›…¸Aˆm¼5¡Ü›PÞœP®J(ʾ„²3¡ '”„²UM%‘))‰ñ·BüšÏâ0ou(¿p(_q(ïu(·9”kÊ%åb‡²Ý¡lUâ܈”`š“8*ÄU$ÆG+z*ôU[k@eñ%¸<¥ñeHFì/r­JŒì µ"!0eH#Ž!åÕ)€¿Ó.ÀçG|Õ\?Wɘ­òCTÒ ?…ìØ ð{è ÿ.ªàeøèˆ{-t{„€V)~t LÄ…I®ñÕBõÚ‘º+¸V ¾æ$Å«GhÖ$B`¶ÜÍ=bŒ{ ;‘"YtÔ·›€þÞîŸñ¼pÿð䩃#Ü'¾<†ÜGP÷Ð7V9^Îý¡nŒû¯ºÝÜúÀ9νë{›{Û›g á uBÃç} ‡ìPí«[ÄÝï{Œ»§4ö°GhtlæA^Çݯ´Õ=Æm„a–¹¯à•†t +˜ó±ë…õ˜ §ûÈÀ:nJÝJn²ï 7©îm®Å½ˆKsP~œKyƸ·0W­[è^m‡—ƒ•Ý9ÝAnNÃKø Äâa!¾–ÝÁnbW³+Øn–gÙz¶†u±NV/ÑJÔ•D!‘I$±„‘P$Ñ+/D´©^¬&@̘Òj ÿX@01(,¡@ætt7ÕÝÛ–kuçÙâì\c¨;'¹ ÿÆ{pwîÔRÔ}™#÷U¯;e³æçDî6œÓv£î¾634ÎQ·å1êëÏã"éq‹üttæo¹ÓFàÀ-w ã•YsVÛ¢IMnÿ7ÑP9¾èÛºôc®ÊÝ×ÝÛŸ;P5‹‘D±j ;7¥×†#µº¶£ýuý'ðdj{ÇlRŽ'·œou4¢¾®Ôl²“f@Ý;„f‹JÍ8è ͼfÏ"NhÆágI3 3ÒîÈA®£ýÇ m˜è Ðæ ³±ÔÆ+´ùø¢6"5úXhó±H-Lgšx<ФÎCšqy ÁK¨žu¡Ú]ªÞ^ªÞ.T¯¿P/U(U€êÐÿGŸåmÿ·«{Ûp÷Ìþ#Ô6æ´ê-hŽ5ï´Ä•ôûHÈÉÜm9¹» e³àdpdP¬È‰¡Œ…@š79Í×ÛN2¶œ4W@±²\UÓZÓJª€œI•Šüìº\e¾¾É “<[®RC±&:®íº¼¼#W=ÀÝ>€Ì«Ûᯠ6ÃgëÖ­›7oÙJ>ÐÁ×Ûk&ר>_GÎ2Ô>ê0¯nßò¿¼ùgoYÒ‰e;r> endobj 330 0 obj [ 250 778 778 778 778 778 778 778 778 778 778 778 250 333 250 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 778 500 500 444 500 444 278 500 500 278 778 444 278 722 500 500 500 778 389 389 278 500 444 667 444 444 389 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LABAXT+TimesNewRomanPS-ItalicMT /FontDescriptor 329 0 R /Widths 330 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 331 0 obj << /Length 332 0 R /Length1 4648 /Filter /FlateDecode >> stream xÚ­7{X×õçÜ™ÙY#»°ÂBÀÙuA»ˆ¢Dì"‚( Qˆ ² ŠFBÕD‚I4Š±ÚØ<š˜DÛ$M“4+ú-j›økšÆ|ñ×ÖÆ¦y؆Ä|MmÓFMe§g4±ŸôÎáÞsÏãž×½³s€hèÔÖŽ@$À"✠1¥µ§Ûõxqq ­ÿ À'-ëZÞ±éËdž;¾|õúeïôvïOý\{[`éÙââÏ"ûhO~;1¢Ûù Ñ!¢'µwt¯³ßÀd¢ß'Ú±º³5€Ýl!Ñ_QtÖuYg²}™h×m޶Ú]ßû@T²±¿«sm·¾6­Õu{[Wï›i›ˆ^ `9B<### L œ‘ÄapåáÌ™§ º UBÃÉ=qúÇ4ÎÑøs¸”ä$ ¿¬ÿŽ3¬ ƒ…‹ ! ’a#‚¹p ‡JxgC?̃èÀ›`þòÁOÂ+´c=t’n9|Ü´ë°þñòáÁEˆ€¸ ÈÊðCý8ì…Ïà‚¾Oÿ3äQÞ!8¥ÿ ‡à58MgõŒ ˆ6L ñüœ³³ ²ö+®“ëçöóÀïá?Š„ûÃφ‡õåúCú[ú?){"Õ>fÌ$ÅP  –R­W™÷ㇰ`ˆjw Þƒ`Â8òœ¥x nÀãq<_1ÆlL&Ÿì~öÁ1v‚â’¸.Ë嚸‡¹§¸çøÝÂRaðaÀò¹¸5Ü^î ß>ªWéè/êÇ(7EcœiÌ¡lk¡žNpl0kÝoÜ%Šç$8DQ£ô†Ÿ„?Âyºs—©fœT /`!QœeèÃ9X…ó±žÎg6`WâFìÅûpÁ¸ò$Â#øžÄw †ñ/_1‰ÌÉ–ÆTVE°ˆ ÀZY;[Á:Ø‚gÙ~6ÈBpE\9 иcÜ)î]î#î_|ßÍßÉÿœ?Á¿Çóÿà/ 6Á+Ü,,´8-–ËÓ–â*ñgâ{¤¿GàÛO+¬g³¯¡—ͦ÷ì—ôëô+VA'±àÓT©gèÞN#xŸ@%È%ˆ$¸‡jêä´ÔIÊD·Kž’|CR¢3!~¼#.Ön‹'EGEFXE‹Às !˯”7»´´fOS**² Z #ð-F³æ"Vùµ:š«ÙTs]«©’æ²ÿÐTG5Õ«šhsBav–˯¸´·}Š+„·Ô6Ðz‡OitiçÌuµ¹Þe®%Z»Ý´Áåw¶û\6»üZyO{¿¿ÙG憌ÓÈì,ºT‰(ðeíNB††_KR|~-Qñ™2.ÕXªÕÔ6ø}7¸ÝÙY–µ*-(¥ZLæØvcŸ‹TëÈwvÖ #~ؽTYº=¤BK³± |§Aãk6|Ø3µŧ%løÄù yeåà[B¥–ÚúË©4Û+FÉfƒ <@TÕ™e›4ÜÜ8„ûhmŠßà4¯tiJ©ÒÞ¿²™ju Á$5ɯ|Ô4ÕD“ÈÎröÎrSQ†²K²K <ËíìÅgïåÿúX”©wü ᪺«uAÓ2‡ÂÔ\­¦…biLm3¡¿u&©ÑÓˆ”å -¢¬¹ßv#íÒ„T›âê¿tPʹ¿\Ë Œq,©¶ `,ã¼z#H>¶¦ß(7}Å¡ïG¿eƒ ç–.T“çp)ðs8Ž%EXÄ9‰ÖˆÏÝåuÎÌÌyç «G çÙ.VÛF ¡¸p¤Ðvž¦\ožÝmŸLÃ-ô„.}-T}}0ÄýárªùÕm ïfB;ØÁ¯&GK<'Y£ãx>ZâìR\\BBÿ’µÂž¨î{GUœŸçoó} Åűh- oÚÞÌõÆÆåÏH°ˆ»-!6AL›ÌìM'û^ŠÛç_ŸS{&éÎç¸&÷µ¸ûÖÿ&¼/|ù§áӻݳ^Ä\f<ùÏlŠÇ•ª+‚aŒM´Ð#ÆXlvK\<Å䨈z)&q|¼SõÂјÎ\SBØÌàV`"…$NΟ‘o·Mf“gÄ'ÄÚÙìyUóï[4+î±Ù½7Öþ6éÉ­ÿ­á‹=½)î;6œÆV”!îv7à ¿H±½¯†¯Ò·/ ÒÔ8aJT”D±X§°Ähéu÷ºï•f,Šês¹^>mú´ü¼©ô#dQpBi™ÇSZâu¨Ôã)3ó¥Þ…Kš :ÕÄÇKsä;XôH‹õÌDî_-âÅqF ámÁ¸G{U»Í1Þ:^°ŠÑNòϸzFGK‰ Σ¸Üø Þ c÷.ÂX8…ÅTê ç.ã…ÌLªÉš[!~¼ÝŸ0Þ=½§Û§¥)-âôÔ<Ö‚u]#'ÖW:Ó“LÂÎh¡Qˆ¸4·z Ÿ<Á’ ÷¤wjŠ-ùŒõk0iÉ=_.‰)¼€h5écC—Ö_ÅîðnºÉíDF\Ñ7°Âf“~>ü¢xäªäÊ#o€›=M4ò©¼ŸÚ¾¾zéëwëÍ,!Cëèa`#˜LÝìg8D<4½ÄŽÙµÐ æ–Õ–U–fÖ¯èh[›]×Ù¸íJo©·A\ïhDQ?j‡ñN=ÆÔcñÉ |ªÕ /‘y¯9»ÌÙf΀—Ô(ƒµKÄ]ü¢d>ã‰ý7ÆÑ|Œ]®†:h´z•Yé ßO«ý´bð3†±º›B»›Ø ;i½“Ö}L l¥l;‰ÓIœNât‡‡%DÕ‡%¦ÅùD^ç›”—¨b¢¼&å!o¢<&%3k­êaü«±î`ŒüÚšqòQjª¡dÌ n™/¿‚Ï‚ $ÜiÎ÷¨ã\Ò‡.é=—´Ó%Ýí’^ÁíPC‚ÕæŒê¸étTV#×H7ÖHGpõ7rª#]z9] ¥K?I—îJ—zÒ¥ìtÚ=@-·„?1種Jé«Jé—•Ò£•ÒæJiC¥´¬RrWJ-ÉÒ¤dé†dzzÅ<³+"h9¸Kzpñ.ÈõÈ%!üò`žœ™•/‡p[°>‹Ð½Áúä’ñ¸ 2x¤Œú ƒø.ð™x=zM¼½¦ü»AOm[,z’К`Ñ0•cä˜Â•Á¼aâÎ Ö7É%˜7fs*ø¬Îí&ñ”`ÖÛr‰'C¦{ä™bòLõ‰cجO#uaÕ3BˆA9¼5Äð|ÉS'_Ì ñĹ²úcFˆ½”?ðRä?xšäßUÊÇÉÂëõÃò«žÕòá,sÃO}G ëðuƒ©Qò3žÝòÓžmòŠLñÞ<ÓÞÃõ&z(ƒ˜‡ämdfm}`‚òíy†‡(yY\™U%·û15FÎÉš!/ð‘k=·ËóG=Íñ™¨ÂsØLçKU*I‘K<)òMEo˳|”IP.0¶åi£Î§æ˜éåÍ•3)=þ<¥>WžH.QÍ–o^..ogˆÓE¯˜&¦ŠÄÑaµÚ¬ã¬ÑÖH«Õj±òVº·VGH?£f¯¸Ãb3…7fÞ\ÛŒýßH/#C+£«B}³†;â{ŠÅ±Eö‚rßu¦æ±9ózOŠöpÕ‚íù”Fmª±ÐS«´éFÃ2„gñ¿o?5P#Ñn<ë¯3ùn_c£³J›[ÓÂOý+B$XAý !ü”Ô÷B•¶Ð´Äò A½Èˇ Ã]Ù|SmÛ¨š‡¬šÏ@†Ú0xL56ÕÞ6Ô¶fø}¦Š[M•­BŽ¡BÜK[}©©¡×ŒÛ©™†RLCyy¤R”g¨ LÍ#…¼©¦Øó8kT\7*®3Å‹¿猊÷ŽŠ÷’8óô´•þwz?¾iÑA6+þ6ÍÚöj’ûZ\®Mµ–iÍ-­í´i+m>m“âs ,ÞsñC¼Xñ À}ÃÀµÍ\¬.6Ï[v¬ñ_ãkÛU_kv\ÇØÃØÃ×ÿuÄ~C¼Åðå7|ù _[Ô-¦/#7ÿŠ¥k¯ótßqGÓÚµMðoÄ ¦J endstream endobj 332 0 obj 3309 endobj 333 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -179 699 676 ] /FontName /LCQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 331 0 R >> endobj 334 0 obj [ 333 333 722 722 722 722 250 722 722 500 ] endobj 97 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Roman /FontDescriptor 333 0 R /Widths 334 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 335 0 obj << /Length 336 0 R /Length1 7480 /Filter /FlateDecode >> stream xÚ­9 xSUšÿ9÷ÞÜ<šô&i“4Mrs{“&4mZJß4múH -`©¥´`±¥€EœòPXF¨`Q¾ÎøvÄwÖTBetQ‡Õ®À>wôóµ3è¸jçµèèB“ýïmQÜÏÝoçûöžžóŸÿqÎùÏÿÿç¿ç¦@ vÑþu}`GÊi¬ƒýƒ7y_{gë}¤€«Y³ášuK_|Ghv0ñk®ßº¦é´ yú¬ ¬î[õûMÑç2Îâø²$˜^L«ÈÔ"îXwÓi,E<qïõëûûÒèn@|â–u}[6hcô!Ä{þ }ëVÿÓîŸ?‹øNÄýÖoº 6‘â!^¼aãê ¯ÿe3ø;ü2¤Pö£ìHk¶BR(|ûaàoyXµå¾ƒ£ÁŠ«s7a­'·¬Ì:p¤ÞÆú1Ö?'—¥’\ $ŸHýãBùŸÌÔéG‚'ànx¶Àvìß B4¡†ÁBè†s$Š; ð#؃r_€šá:ò®ñ$ ÀË(ç‡Ü6¤¯‚AŸ (ûð”ÃrØ ‡á$¼‰sçC;, :šzfÃýp–ü‚eR#8SÊ`ì†ý©ƒPœi'ÜFd²)5 =XÖ¡^?€¿‡×S¯â¾xЫ:V£äb\é0щ’!´† Ô§Úp¥Nq„hisj#޲B D¡æAê}3Ü¢f/ÂÛd½‰M5¦žKýZ‰Ÿ‹ZTB \á&\á>xÆá+ÒIM)_ê‘Ôxêxê(KÑ'nqLýÜ…š^ûqÞîø7ð6–sðI#sIi#Cä~rœ¼FcL³‡cNL} .´Lw“‡Z—Ã\Ôû*¸úpå;á`uü¾ â#%¤‘õû yš¨Ê´ž¾Ï„˜f=û {Ž‹%÷'ÿ’êJu§nLÅÝ¿‡k);Wì´V Æ«pïƒèíè;¥ì²~ ?ƒÇ1ÂÁó¸ò \ûexÞÅõ?…ÏP‡I8_ÂE˜B-Òˆ€%“¸°øIZ­½ÚF“A²ƒì$»Èn²u<@Ž£äWhÉfÚE{èvº—>K_¡¯ÑwèÇô3úWFǸ m|’mf—±9w5w3·“;¤)›:Ÿ,O.M®H&Ϥø”)•—LmO=œJ Wÿ¤ZR é`=B¯.À|´ãi1zw%ôø}³­yÚóG¸ÃÇá úéK¿Âݽ‚^>Âý.À$1!°hç,ŒçŒƒuôfº‡þÞC¤?¦?£?§qz„žBkü&cbüL9–³€YÄô172û™Ÿ2?cždN3g™Iæ"3ÅL±%l%{{3{7ûû6–?qf®«à–p«¸ë¸¸aîn”ãÞå.hÊ4q^æÛù[ù½ü}ü(< /ÁxÒ.žƒÌÿsnû.úŸô^ò+Œ¬Vè'‡À†¹Žr­àÆê`îÃs ©ßaÄúI²ó ò’Ï¥Þd<8ûÚÔ›ÜNôá0žx žˆ3ð1«#‹0\Í”`ü®ÂÌR-ž]T.ÈåÍ rý>9GòŠ·+Û™å°Û23¬³n2¦ô:-¯áX†ÈÉM½ÞxnoœÍ•çÍ+Pp¹ }—zã^$5}[&îíUżߖŒ¢äšÿ&–Œ~-Io5Tä{c²7~¦Qö&ȲÅ]Ø¿³QîöÆ'ÕþBµÏ檈IÂÞ˜c Ñ'½ÞX¼ip`8ÖÛˆóGFÿ𩾠ÆÍ¶È¨A™9 }Û‰XÜ)7ÆâYr£Êcü±¾Uñ¶Å]±ÆlIê.È“†~yeäúxzhf¸:sœoˆkpjïµÊ`Ÿ÷pþ±á;¬ì ¥­’Wõ]Õgúº•%Ì¡¸]nŒÛ·s|ƒ^êÅî˜a~ˆÌ8õ7õ­nBÓì›7ö*X߈µ^éÅ9éPwWœ áÄ^E]EõéM¬–c ¥w­7®“ëåáµ½hsçpÚ·JcNgt<…/¶˜w¸£K–âµÙrw_£ëp ·o}:+êÍú6§ ܱc®„&/¨+¨Sà\ɱcþ~×4ýÕcUnâ„­í_[(ŠÈóqqo¿è’q+J³º†û+P Ÿn‚F¸6®k誛r~AöèFyò³oSúf(¿ð9(]ÅÙ_ ò/õã¡Pœ&FI‚æE­ z #¥¥LŒc»uÉqr=8BÂùê©êEØ.œª†Úja QlfÉfÉÀjÕ”%.Tqÿy"Áœ¸Xê΄Yå8®U ¿î²YmÔn´›\î&Ërí*y«ö{ò ·ÿËKÆ—,oùÞò¢2­¥–ÌÌ‹¯Ø'—Ì)µ{-~Ÿ_öù1½0“É%2·;B$ÄÝ5³´ kV©OöXfÍ*õxê2¬¥sJJ-–ÒR¯…e96ä–ê뢅§CB5) U‡„c{LaGh»0ÁsÛ_Ÿ^Ÿpáu³¥²k%Öp8Œûœ²W«ÙbW(<'„-Ê;x6|©K³‹Þ¶Ê˰XkHiIn TÊÔ𞙣/#(.{¦T:Ce o"™vMó²ó²/Œó;iQ‡/â\oMn_4T:wg…*§$ýÁWNîÈÕ”ÏÜjehAöü$'i2*ét\šQ«ÓYYà,V ×Ìrz Nw¶Öj±x-œÍñn5 Ýzû²(<Ës!!¤„ÚTu­vJ[­D_eáÄZål¡32étœÏ:Î÷8#SN‡b5ÎHކX%&P^’"M£X%Sºy¹¿&‹ÌúìþÕò¶a™[²ccòœžÓµ\?—x«t[Ù|„'s“c\óŠž‹œä Ø«ñÖ§žWWêcæÞ Isô• ŸOð¹J„guµÚ{ìÛr¶ùnϹÝwÀý ô`΃¾ƒîƒÒÁœƒ¾£î£ÒÑœ£¾—m'í'§Ü§¤S9§|'ýoä½ú0ïÃÐW²W'—Ë]P ;f`8[ÌØšf`aºìsdgÉŽt»h§v³M¶k7 /k[$ÝèÊ>± ì2 ®"ûf§›¡ÝÒÃÙ˜òD NÎ6 ¬Ý»¦0z±<`PI³‹Ò…B¼¨œF›å(+RòX­Ù^¹‡ ‡L‡{´˜”Qœ€€ÐRi®¬ )ŸO†.’ÏA˜Äí™ÂÉ=˜&´8Zií¥.zêFL sˆ¾|i )¯!sìÌ×Ñl"œc}i79'7&žq‘(eætT®uë¶hè…ßþ$ÔL6·ìH^ÜÛ({$Û,1Ú_—×XiH=W±Ïé̺| •øtŽ:õ;ÇöûiLNÛõ~òÅïçe7g~ïúºÍá;–6&ïRýëO}¼ÁÜQbŽ>Æ<µÁ€¿ª2£lÖÚÈÇã“—æ¾x­ò͹él„­ ¸ÊªK#͵݆ÎÈfÏË]™C™®ÜAl6ð›ƒî|‰HÃz½lhMŸSìq‹¦Òg®LFRp~°Þ3§¸X´xÜžZ³%-¨Ge¹-¢‡| ù†F÷*÷n7ãöy=+=»=¬§¹Þí<žz= ~^]áài‡rXÍöB|MÜà‰ž=ޝÝ8yɇ—ÒºâÄAꥬV7­—škš ZÚfPù Y -Ô™™E²::—ž~s¢Gxýugä„Ã9}†Þ©¬|G%ÔžWÓ’–Àñ!!‚GzHO.ÚÐ&â{O1^¦+ tÕdå@ yER6ÓCC£e ‰" ¹<Ë«& ‡QŽJ ·´²(+Ía’y£6+»Â¿+lµzf™f9=ºõ¡ùμL¯-sYqA›/'37×cÈ08 \ÁOü¶ “Ý]Qá …—^Qì6 5gªëŠ¢vãu¯µ²LVëìçù“MÍzVÌM·d7WÌ)Ö[Šsr9ÎÀñÿnIôª¥RYõ"ó¢ò"Wô¯Éÿh* fºÕûNêËT7~C¯Ã¯ûCÑU6Ò•{mî–Üûs9Ÿ?”8ž'‡\Y¦4žñ騀ÕÎ]<Ë $i·øý¹~I$«.õ€ÏºMªsãc³xK› ò5  >ÂÂc¹­2ž/ ¾óʼnó““ÌP‹OõàT£Z8?‰jÐW*ïØ=Üö 5íYÔ”6ÝÃkËäg œ&ÂI奢ÃxŸñ’z5ÁðF·© \ò ’Ò–KŒnêPÔ±Uåd ‚+äôûn\Îwú¶Îm dç¸mtGòƘ[ŠÒ³d*j´ˆÑ6wP¯7ñs¢–Ëz}F£äÆ»)½P4_;©æ'õéaRýW§WNˆVÅ_Øz bÄwãí¿dAwI^HbG ÉŸ&jZ 4uçeßÊZöw©I®Lì¦Ô$» Ö3w‚‹ð3w¦Ž3îÔ—ÊožDOî &üúÿˆ}Š[4£ö¨¿GjpEK1ÿ1¹q¢JXf´Ð(ßÓËšÚZêC×®[½©`þM}×_Ûê/#ú3ÖÕ°ú;¿ä•m†¡Êa,†åÐð,}ˆ¤A5ˆôž±¶J1AŽhFxz`þè|:ºqt=°ñÀ>:*ŽVÑâ*:êm£¼Úh‚Ž<]U"f&è¾±f1#A‡Xôv–Ý‹Àœ { z‚ôB`JÐÝŒ º ^unE`HÐï#ÀûÎNºý;ÚÝ€OÐí4 z .AoFÀ&è6L‚nE€ÊlA€ß›@‚FÓB@G”´Ñº !7À0’µj»\m¯TÛ µÔ–=²Á¸~ƒ±NO~ ˆWÛ~µµFMÆ?Ï ÿeÀø<€…Èp«-ÍXh<³Ð_h^h¬^h,^hÌ[¨LõhAþ9µ•ÔÖµ·¿h1¾Ñb|¥Å8Úbìo1–´ý-ÆùרyÈøîññ!cîQ2º‡úÔ‘ôÖtÐ%OA+Npv¬-_|–¼^Ü¥HþyÌ{T¬Ë"Ç ŠUðçgà8ˆ*|ˆá!èPá“Ð*ôÞ±¶R1AVŒµE\5Ö¶ Á²±¶ºÇÚVâK¡MÒ1æ='Ö™I;¾”¡‹f–Xû¨ |á¼1ñÝ8Ö°R¬Ó‘:hPÅjpåN„.Eñ:#Éœ™Æ<£¡ «Â7ψ“U Ò9&~‚óøÇÄ;,ß$è“Qƒø^àœxºí.ñT[‚"ù…$‰¿ àgħćÅÇ*åÑ€:Éi±‡¼ -‚{§¥ï ªSÞLŸ8#îP–ÄÙ·ãÛ‚gÄÔµ×Mƒk‚8¹k‚çÄ•â÷Åö€:þ ¯Ê]С®=¿êŒØTçoBÈ3bÌ{F¬ª GE•Q;•OO[6ÍÕÙfïS‰…Ó;)À-æw¨º‡PM4]ô‰E©áq‰¨u#GÉ.üÀ!;¢•üÈù‘üÈ&~ä:~d-?ÒÉÌãG*ø‘0?’Ãxø ­E+hMÚ4­^«Õj´¬–â¹ÈH¤>ˆæ)Y&C#(@Ã*-«ö 3ÿÁD‰–BKƒƒ–îÅzÖÝXoźë¬·`݆u ÖA¬Ã©žVFÓazËaº{ Ý6CÜFo›éÝF·Ìô¶ÐAµ‡‡øieM„c- ’Š“;ãš½]q'û³ã€m·Ãf¬uÔZjÌ•MßÑôδ¡oÇß< tùCZÛ¶þÃôhz‘üRm?Ë/óâA^•h½FTU`Dy™™p¸ã÷¶^ÙÂÝ/V:)wwk<¬ü>6Nki$Ö8NkÐÝ5ïÑÚX»B‡÷»Ql™*†Y»Å J(FžQCežPÅú§Å¼´FkSŠÑÍàUżt³*vN;¼±*Öx¸ªJaŸƒªÈFö¹ËDö}[dŸ*²oF$[ P¤! ˆÎ  Àá@ŽÊö}Ãî˜f‡§Ùa•]þ ;8Ínžf7#;ôÿø¬®ÿ[¤c×^YoÃ+Cý’æÓâ¹>ÎËÿÓ›fìü šúš endstream endobj 336 0 obj 5424 endobj 337 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -28 -82 768 682 ] /FontName /ZFRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 335 0 R >> endobj 338 0 obj [ 667 556 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 444 611 389 ] endobj 26 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZFRCJB+Times-Italic /FontDescriptor 337 0 R /Widths 338 0 R /FirstChar 75 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 339 0 obj << /Length 340 0 R /Length1 5800 /Filter /FlateDecode >> stream xÚ­W tUšþï­ª®î$թΫ;¦ªSIºMçÁ#òè4„`À€ &„@@"1`xI…&Âé8(8"E›e:‹(#ì("êèx8¾v':®=àèHºö¯êaÎìžõœ­ê{¿ûßÿ¿ÿý·nß â`;0àkïjë†~Êà÷°L‡4n!$2] Çò)–¯Ã‹µ0Wùá§µÿ`2PþWÑy\ð4Ü/Á&Ø†í» È…Y¨õIh€%>˜ˆ= »Pî[p@-ÜB>Â9žNxå²Áû ûW@/ŽÏj”ýWxŠá&Ø Gà4¼ƒºó`,„StH{&ÁCpŽü†e´j*€iÐ;a¯vò¡5m‡»‰BÖkc°ß.´ëçðOðíMô‹‡ÃÆ2”œ3!2øH?FÕ "Ú3q¦E8b˜˜i­Öƒ£¡|P³¡íÞ ÷Â~´ì$œ'ËèfH«ÑŽk¿×׎ÏA+J0;×ClÀöÁQïÉ"jÕ²´Ç´íeí+#O8AÂ1åPz—Â*Ø‹zCèñ»pßQø„Ä‘¤Š4’~òy™¼EýL>³‹ ²"'ißAFÆÞä¢ÕÅ0í^7Cμþ†ÐÆÏà[â Y¤ˆÔǨ“^GWÒuôýŠeØAvTṵ̂„b&xŒäT´¼æâ»ã¶Т܇¹{-{NÀÌ̇0ßÃ%ž˜‰‡¢ö9hß»äj¥)T¡3里—©`Ö±o°£œ?¼7üÖ¬µh·iÇÐûp.Ýs=N7Á2´xúÞ‹ÙîÃÜéï|wãð<…+ì0¼€3¿‚s¿oÂû8ÿçðÚ0à;¸ãhEñM&øf“|ŒZfµ‘Ì'½¤l';ÈN²m<@†É1ò*F²–6Ó¥tÝMŸ§oзè{ôSúý+caœŒ c|š­e³‡8+w3·•ÛÎ6M¿.ß^î ŸÕxͪåj½Ú6í ¬þň¤âÁ fÄ‹Y‹_ê<\Oó1»Ë¡VÂ-˜›MÍ}χÑçàæé7¸–^EïÞÀ¬¿Ÿ g…`ÂøÑ³çT\Ϲd2zT‹5‘…¤™,!ËÈÍd%é$·‘-d+ú8ˆï^òsôò1r˜!'ÉgäùÓËÑ8j£2ÍÃÌÔÒ…ø¶á:è¢[é.ú úÝO¥OС*¦g0_Ò0ËX™l¦_?3—™Ç´1·1{™_3O0Ï0¯1ç˜1æ3ÎŒ³El {=»•½Ÿ}‰=ï_8WÈMçr+¸[¸[¹înˆ rïs?˜¦™T^áðwñ»ù}ü„ßÁ/ñK»ú9ÉÿçÝëax–ž¥~ø>Çì ÓñÛ™Dž…Fv1œÂÝ'ƒþ>H^Å•Uíä0¤à^G¹zpbq0ûð»íOXư|ž‰û òÂǵw˜ ¨}ö·s8€_|~gáSÖBæáþq3S„ëwî,|“'M,,ÈÏóæ^çqçdg)™.YšàÌHOKuØS’“lb¼Uˆ‹±˜yÇ2”@ž_™Õ*«9­*›£Ìž¯ÓJv´]ÕÑªÊØ5ëZUn5Ääk%}(¹òï$}IßI"ÊeP–Ÿ'ûY=[£È!²x~3¶÷Ô(-²:f´Œ6›c.ŽýŽÎY%­²_ÕÛ9ào­A}#åC_~“Ÿ#¶”ò¡X]³ ÕmÛ:º„_MSjüjªRcð˜lÛ µq~³¿&ÝåjÉÏSIu»²\e¦ï74«|µjªFÕòjÝ”ä¸7$ÂòVoÜ eEÛ’f•ikѧ°yU»R£Ú·Œ:~$/·ü÷F™#S¥Ù³Ú:fahgGÈVj»©údÔIû[šUÒŠeÝ\ÝôˆŠ_ïi]#«e¦Ò9°¦cž6 Â‚Í®`ZšoDÃ?6¿<ÐÔ¬¸ÔÊt¥¥­&ãH ,Øü\ªON½–“Ÿ7âè›áÂäWåWé8Ãåè‹àŸwDúß<kÈú±~Á•¨Ýez¡Êí2Ь +Óõªc: ´OG1|Zaµj©nKõ˜rÙ¢"\L£2öŵ=mÑS¶xô¦žì+ ù—۪׫ææbÎ1?˜&4­Â蘚Ÿ×«¦+Ý¢¬¦c¨ ãØÖRZˆqw¹ô” †|° uûüæ-Ãòô ø ½-*mÕ9'.s’êœí—9W†·*¸‡ƒO²jιò‹Sý¥*Iù_بþ½›<óèÿz3}–÷gòS¢¹¾D†ï'j¦ŒŸc[,á²^ñBÙxÙ<¬ÆË ²LG«I›ËæÆ’hšú¡”›þ·WBÌ+—¦ë;ѾÖÎ3c8W6ìôyÌVsŠ?ù©6%ÍîLI¶&9“Kzš•IöS¶%-=]Nkvˆ¼éK“R’©Å#Y¸rÚ—™*äx¬¢ äĬýÄáõŠe¤Ð[æOyÆG¡r Ûe-ðnO-¡¤Äk³—ØJ ŽñD¤ž4‘,†;’)9Éž2erñ´bü—œZ”ãžêJ¶ž1ñ&%3gjÑ´)}Shr²41UL"\\ÜŒåÔ¼ <í­¢«‡vûôëÆ§äš%«71Ñã¨e󖤻ó—+¶pé¸e¤ùàí¾¢RÌÀ:ÜMyô;úÒùŒYöE±‹ì»-÷Û·ÿ.ÃìwÝ7GãBtõpll]B 6|E>óã.‹…‹ÌK" \BbWËr1ÒœéæÄ„9K”XŽuz8‘e1œ…¯] Ç9žóŠÞ‚¨/«4›ËôH”ž:uŠˆç ÓÊÇÒÄÞs…Ž KÓÊÇÓzD0 ˆLïNt1îâ¢/!‰ä¤{²këMÙ©äº/êP²Õ‹³¸…}=áÑÎR·v\uñ‰®%lIí0Of„ƒ\í²¥—8WšÛ^†'ãÄž¡}ÊÆÿœBRë{#)+KÌÊ(‹2¸ÄŒzûRû–Ì-Y÷dÞ“uÀ¹ßµ?sÖ!ç!סÌCYÇœÇ\Ç2e½žrÚ~ÚqÆyÆu&óLÖéì·sßö~œû±÷{E¶($#ÙŸï-pD± ]mXZ£X¯d9ÒSG¼]²S»-E±›»I§‡WÌõ‰%KÊ/Ȱ‰ùDÉšoÅ b|A:~>R*(H·‰¬]‡ÝTè©ØktMš/âŸÞksbK°—èËÏ«•¸èvq^+®Â]æ‡Ñ zð§/Ë\“¸4‘•yqÌ{‰\Œ¬Í¥OïÍÛN™q´^‰æËMÌÔmxœŸY±üÔ R\A¦Ø™«0—YÔv+Áeì. nžÉ >ÊLi*Yã´l2ÑþóWÞZ²±®/|iw2Á•räk¯Ê­)±—»–.a[l–¼êâã9šsiQpo–#ŽÉÌd›? Ÿ¼37½6ùöµU î½±&|Ÿ‘_ã™7üñÍñe 1ô‰‘6_FmL;; ž:Àr嶦ß2!Œ 3„>dN3¥Úž«Î5,û'mŒÙ£}Í®‡uÌÐo^Ó HŠhVt^o&Xƒ…â­E„ÉxKü”<„41$¢³™ô3άš¦êº™Þ¦Õ]ëóçlh[»º=zSÔ¾ÆÒÿðtÅbÉÇ{Þ6Ÿ§8¼4Iô`c‰¢÷û¼ˆS€§æ Í¡C=Cƒô@ÏA:$ •ÒÒR:$5ÒòF¢çJ‹¤ä ÖJI!:€¢÷ $„èn[ˆîBCôn„øíG°†èN!Dw àVqBlˆÞ‰€ûÅvKˆþ Á¢}|ˆnC0…è\ˆnE`Ct ¢›ИM¸×oD€íõÅ#BÀBô¼ÙW•DËÉ­Ð Þàõú&£¾Á¨“ŒZ4jv¸[X×-TÅßã½P /u»Q'ú¬ÂWÂh§ðr§ðï ¤/Åq5çKjÎ6jƒ0Ð ”5“„Ü]Õ7xyȨQ»Œz‚Ï^'|['¼]'¼Q' Õ íuBQ]'„È}¶~áý~á©~!§_Púg?ö>;_–cx®Gç‚yÒóä$Èè¥D~”IU©ä”²:ýBG@2ð(T“lÄÃÐdà3à6ëý­ÁÆ©Rˆ, 6–#, 6.FXl\†Ðl\ŽSÜƦ <*UÙÈ •ó¢S4À Õq.â3ˆ³ƒÒ*]¬^.UYHTb8ó"Ä Ýð*$GÕØ¢Z±è|aX:+•†È¢ ôêÉJ7…X”>t‡è3¾Xé÷¨ôZã}Ò™ÆÅî—š°;(½èÆ!G¥g¥ƒÒ“n£çq·¡ä@Dì9dFx0"ý€ÇPy¿'Dö•~á>+õéS¢öm¨`‹ç¬tkµ1wWVyp4rWzF¥åÒÒ·1þzÙàÎm2æžSzVªõúg¡ ä¨ä—ÏJ3=ÆÄ>É`TF¨âˆÚijŠdh›4htF<ÉGóš Û½hf¶/^Ê’z$Wõ*i¡d‘,cdv¤ÏWÂåÛùÀz>p XÃñÙ|`:(à™|`ŸdN0‹xV‰3ǘÍf“™5Sü.’BÚG¾\}wI2‰:˜X½f¶HõšF¶'JÌêªtÌt7–»±ìÄr–íXú°Üe –MXz± h=§¡ôŽa1Ò¼ƒn‰vn¡wG[wÓMÑÖ&Úk´ð#~NŸ1X"Z¿Jö¨¦ÝxUÉÞt¸{[))½•ŽÊ„ [ɬšPµFkïã'ð^ýúÆÍ/â2ýC/‘úÈQ^z—ñ†Dý (0†@@¼Î¢§ú`ý ÍêÓÎu²ÞМ-õj~W¡•´Ü_3B+thih¥ÞÔ´ ØbC wíJƒRPŒ< ’.†Æú`à¿w”£‘ endstream endobj 340 0 obj 4102 endobj 341 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /FDTCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 339 0 R >> endobj 342 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 ] endobj 112 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Times-Italic /FontDescriptor 341 0 R /Widths 342 0 R /FirstChar 74 /LastChar 107 /Encoding /MacRomanEncoding >> endobj 343 0 obj << /Length 344 0 R /Length1 3708 /Filter /FlateDecode >> stream xÚÕ—{P”ׯŸó]vƒ° (¤ˆ²A$DQ.5„¨­Uk¬Z‹Æñ‚N*BFSQ$Æ"I¬¥–Ò$M¬1©n‰QcS+#Æ66šSmê]Z¥©ËÄe·ïyXÓ™Nûogú1ç÷½—syÏ{ÎwÎ •0‘;»¤¨Läbi‘Òkö’ŠÄ…“«,‘¯FLqÙ¼’¢Ø2·È~±ÕÎ[°¬8+¶±0׋ óç͹²&7°EǃóÅ~T½Yô¾óK*–ÆœQOˆ.ýÁ½ tv‘ªÀvÑ;DïVR´´Ìuzpè1•̽Ð{‰!z_Ñû”•–Wñ‚èù¢?P¶hnYá™[E/\ábSÐóÑ3r@â„WæeJh m8Ž!Xk¬ÃpLE Õu4ª¨QiX'Þ!G#IÉFfš[¤Ž'±'8&Z12Œ{å=S¤V½a XŒ&µ MF„1\½…£^­Ä˘Ž>VŠÔ¼…s'JelE¡õ„QíÊW±X¹QŽBc„1!Ì@uÙöhÌÀ{ða‹Yb\u"_uHïóqç1ØÈÆ,Ô³$Ò}ê¤Ú¥N«‹Æ$| (¿:ná_±Ì7mvvñx»DÇpÓ ùÇè"Uâ×¥Xm´©™ÿD™}2°ľYêùaÖ!Í”ÈÑŠ±ò—jÖ‰%Ë®ù€¬À$û$¦«z,v<#¹Ÿ¹K5"ˬ³«Ô!êu2Z”ºìH@Žå5R…X‹VÛg 3Nã)T·¥æN|f×[$Qv½Q¥fuåìI¨±k#™ñÊ{†¬Hû&©½FÜæµínnì#ÆU#Ü1sìëªMu89’U£Ý!›¦J59c˜ò;²Ô>GŽ#BZTI÷-¯^Äj¤ç:¶e Ý>#ùës|¹ß,H<<Í›6àßÔD·3ч‰¾îË÷ƒ ¬x{šÏîå3“]>+9éüsžO0nbAâå•êvÔÌ|1N.Qkbû¨ü4½k 6YÅök²gˆÍ ³àP.Û°0¨ålKܧZNµ¤G{¼žd¯Ç[lÁ_nÆû/69#:n.r¤‚_ÀØÀh{¬d+crS#=®hg8”}AŸ^÷\Œ9×#Úæ’ùQÝc¢âܧšO5{bsd”K·š/¹ßoóäDåäxrið?ï?S¹#p;ò¨¹ÁJ"1¨+ÜH•yF續õ¨± , AF÷_OWÞÁ^+Ü?ÞÜ©jdNf°°NÙ÷3/ ¨ÈK…­\:9PR ùÖ£äB7\R'^¤n°TœR Åk”¼£å'm"+؈“šÝÑÛýñsCÛ‡ºîÚ;Û1¨ó£ƒRn¸Ïu¶wfHPÙ^SJ´#)7¼‰±Î~I÷¡G ²2³­”;5éVùú;­éV웿 ®Ö¨*NÅ5§ïn¿دr¯|Ñh[ص0ðÐK].µ¢¹ô``ÿqéZ;–è¬þ™Gm×SÓÏþwï,»û6†VW½ÐYÇ6v}g½œSÛîœu­úÒs÷±¬ã(¶wb¬5Òz–ØîCÖ«»ãZxZJ¼äEg3Wò ç59U(ª¨PŸÉFçO9vDÿÉËJf•.Ðû–Oà-}6ÿ‡Çú—˜4*•Le‘&ž” MÉÙIúÉ;ädùò6ÙNÞ"ÿNÞ$ÿF~Nþ•l#o×É¿è†?Sn•oŽìVjZ6q•òò2y‰¼H^ Ï“Ÿ‘$Ï’ ?%ÏŸ§É±Fö¤-ï$Ñ>¤íC‘-üžò‰µåÊ¿#[Èc8,«$gÅ³ŠžUØ/žJ¬”QmzL¡ÎðJ|CŦ=¦PgD[ôת[® —Ë™¡k-ïÒ8ÎÓ¬µŒ–¥äSäÎzq^×w]ŽE%-Ë»4¶ÔS~·”qõŸ¤§ ¥\ý2®~c+ÅBô[)W¿”±i‹‰ï²Í|r9—œM>N’ß!gÉï5ý­?Fm:ãœF¹€ü69•ü9…œÌ•šDy"ù(9ü9žGŽ þI"ýûMK>¿è‘”Gyd.g3œò#ä0r(9„|˜Ì‘Ö¦ì9-g“_%³ÈL2Cl&Ò)"’iäŒö§ü™JÞÖ·ÖR¸CûQN&û"R˜$7†)7É&¡—öDÉ‘)¿3uýÞ´$PîEÆçu탯÷rì8ÖŠ%{’=BtKvbà‘myk[´ÜCãD‹æˆQ!_¿F-›Ò&@ê¶‘üº"héN†“÷ÝÈ0ÒE:1XèÓÕï(ðŽâ=¤ÿ‹H uÏŠñÏ”ÙÏk¥ôþ¢”—¥ø¤ì—â”_&ã«kUyÿÿɃþÿwOÂ?y( endstream endobj 344 0 obj 2123 endobj 345 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 4 /FontBBox [ -39 -216 662 745 ] /FontName /FDTCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 343 0 R >> endobj 346 0 obj [ 744 549 713 ] endobj 121 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 345 0 R /Widths 346 0 R /FirstChar 33 /LastChar 35 >> endobj 347 0 obj << /Length 348 0 R /Length1 5684 /Filter /FlateDecode >> stream xÚ­W tTEšþ«î½}»“t÷í¼ºIÒ}oçvÒm:!!!NÒM !b€B ¢‘™ð6 L”Ó3¾ÑqgÇõAäÒ²Lç Ê ;‚€ãct¯Ý‰ÎxÄÑúîo7¨{f÷윳·ºê«¿þ¿þúëÿ«ª«€@ žþî0öœÁìêÚ ½ùÞæ±þW³f`mÿ²ãbC!£¬½ióšw³ïØ`z€Íéëí^ýLJ똿Á>e}Ø`9žR`™Ž´§¯æ”[ évmÔ›Ö÷t“|Dº ic÷¦c€>‚tÒÒÍÝý½‡w>Ez7ÒyëoÝ >‡‘Vö öüîË<Òïð˱€6mFHE¼ØD ÅlÀ<²¸%ÆôC€ú.æs˜ÿ[®Æ¸R(Š=­þ“ƒò¿Häøç†§á>x 6Á6¬ßQðAÌC¯= -Ð “$ÓqŒŸÃ.”ûÐ7’pŒg ^E¹<Áƒ‰í«aûçCÊþ ¼åp-l†ƒp ÞFÝ…ÐKàW߀ð¼F~Í2j5CôÃNØ£î‡"¨FMÃp'‘É­ê¬ÀÔvýþ~§¾óâ!I·± %ãH‰‰¸H€Œ g,  =Ó¡GZŠ=#mT±W”Bê`>t Ý[ánØ‹–‡wÉJºWƒêQõ·Z,±>ZQMp5 ÂáAŒÌ|K–R‹êQW'Ô—Õ/tÏsàûTC3ê]kaêâŒßw1MÂ'$…Ì%u¤•Œ‡ÈËäMbŠ˜]L„8QýrÐ3^œMZ]sÑîëàzèÆ‘ï‚q´ñ<|MÄCJIrˆ!¯ 'i]A·ÑÝôyú:}“¾GÏÑÏè_ãdÜèãSl#»œÝÏY¸ë¹­Ü0wÀPvé«XylYlel(vVåU‹Z ©ÛÔGÕ(FõOº'`;È?Fu!,ÂÔŠ+m¬‚Xƒ;ow˸*öâ®x ç·ãôk\K¯àì^Ǩ¿ŸàÌþßÁ%ˆáÆeÑÏÓp=™8£FœQ;YB:Èud%¹ž¬!}ä²…lÅ9ŽaÚC~г|œ Éqrž|E¾Æðr4…Ú¨D 12t ¦n\ýt+ÝEFï§{écô úÏT¡‡èiôÆç4Æ$3&)Çb2‹˜næfóKæ ææ ó3Å\d.1—ØR¶‚½šÝÊÞǾľ‹éOœ+áæpK¸ÕÜÜÍÜ(w?7ÎE¸÷¹ï e…—ù6þ~7ÿ ?ÂoàaÜi?üŽBü_¿ŸÃ³ô, ÁGð)z`ƒ{gyZÙåpOŸúWúyWV3ô‰gåšÁ‰ÙÁ<ˆûÔ?`žÂ|>Vç òbGÕ·j_§¾Í c GqǧâŽ8 çXY„çÇõL)®ßÕx²à ˜9czIqQ¡¿à*Ÿ7?Ï#çº%ÑåÌÉΚæ°gf¤§¥Ú«Åœ’œd2òŽe(Â<¯KRò»6_ž?¿H£ånlèþAC—"aÓ¼Ë(R—.&ýX2€’kþ›d .¸"I© ªŠ ¥,)gƒ²%Ëw`ýž Ü))Sz½E¯³ù:aFÂíÆRÈÑ”Ò%…”yC}£¡® ꛨÿüÓ¤¢B˜°eV'kšhèÞÖç@Ð$BJ– )Óä ÎcòBÝ«•ÖÅ¡`¶ÛÝYT¨†y•r½bõ'ºëš¾A14 jém0&,<6zwT€U]þ”Õòêîë:¦»SÂæWìrP±o™t|O^®…îN0?F¦Bóæu÷ŽÎC׌͓]Õ}7RÍ×H¨“Žtv(dKš¹šéñIôÊ!­¥k¤˜äz¹ot]úûqKw¢Å'\­ªûÊ‚Aþåºâ÷+sŒO/† M«Ñf)Ùò€ )Ùè*hE?vwV– ßÝn-dcѬBB^ܧ%X•@‰¿S¡]çØeNÆ3|™s¥{—Œ«ñ~yÉPŒùW~V!3-ÔW©Ìÿ…Ý«ójûÝ ãGû׫˜X>œ!DI”Ò’ |ˆÀ4#eBÛiŠM›ÀᾪºTµË–KUP[%\B‹Óe›ÛæÅœf(‹~WÉÍùëÉ(sòâÐo^9ê9æž;%¤1ðzºÇ#xrJ…Ò.-§Ù¾Â¾%w‹ç®Ü»<ûœ{Ý{s÷zö;÷»÷çî÷qqÉ=ây5ó”ý”ã´ó´ûtîiÏ©¼· Þò\ð±ÿ[Y2É$'ÇYTä/v$°8[lX–XXb•=Žìi²ÃjíÔnË”íÆÒçãec³™X͟싊slBN‘=3¬6AhK-¬ÅÙèB1gÛÖn‡ÝPâƒ$±Ü›¬7͘nJðà;Sâ¯"¶T{ÔNÕú5¿ÔÚ컸b¿e›pb—±Ø¡WP¤¢€˜Za«¨ðk .Lù/’ LáØŠ8§v Æm'ŒØ[+ãåêŒéä¼ÒÍÂÿöÙ¥ùüìR^CfÙôÎvgX—š9kfyY¹ÝBäÜ|o1ñòL PfV{Å:§i“~÷Ÿ¿ð7’MÛcwe—;ó*1ÐSW¬°W»W\Ç5ÙL…©ÔÍ[9š•tqidÇ‘Âäæ²ÆŽß^ݘñ“›ê6ß½,»Wožzžy‹¹ Äx’óºj}޼ʊô²«ÖU?ì}Ê;á=åýÍÜß{߬x{®•­fk¼9eU³«k;“—VotíJ½7#9¹ÌTî ™ÕlÀ+ù}ÎÂdRíNM^Ÿ$'7[gÍt9Iª¡Âc«°ú^·o¯Þ5kæL1ÕåtÕÚR¯ô¤¢<ÓÊ0Bž†Âä sµs§“qz\A×*×Nëj¬wº—«>‰P?¿®dèŒç¡Šl+Á¥}Bà†N®8¹Âq%ŒS—cxâÄ. F1Ä¡’¬ê3Ž,-|ZÔõ’ BÖIá èìê,dOŸTš9× «–dÚ™²ò²Y3µ¿EÏXHF:† £eà ®Ù¥eå—{ðÞBø¼ñLÞ==Ån©+—ž3Б-máÁB©:ɸƒM²YÁgÛô¶æÜZŽÝžÄÛ̓ ¡ÙÕõtÝ"wšÓÍÐܤ$ÞËr±¶#×>ns/u”ºbn«ßduT¯ÎZ_tuÑ\[¾…|⛕ìw/Xö«ß'^E0¼ì'Ë®·V] ĨÓÇ&¾Û|Õ)õžx“Óey Óžkûel¿1Ë”ª÷üà®Â°P§˜{ ‡Å7›öÄ7žEïÏà+Áë0S|0_mçÈCH]sjbƒv_i«_ÔÐTïo¿¡¿÷Ö¢ºoº¡'ñŽSÿŒ¹zÿæM‰Á¼?O!)øøéý‘Ö 1Jï øÆ0O÷-_@ÇÇÇè¾Á}ct\¯¤ûÄ}•t\o¥û¤}­4JÃÏU–ŠQ:iÓ£t!-JïBHÒݶ(Ý… DéÖ(A°DéNs”î@H‰Ò;’£ôv„¤(F0Eé? £t;¥Û Qz¥[Ø(Ý‚ÀDéf4fžÙ J‡VDB˜ˆv7êÒi5¹ðõNÖéåµzy^¦ë¥ —ì¡óús]ù-¾ïÌäe½ìÑË´€¥ÏüEŸy²ÏürŸùßúÌ/>|Üš‰S/¹@z‹ùl‹Yi1¶˜«ZÌ3[Ì-šª/ñh&“zéÖKWÀÞdþºÉüV“ùõ&óx“¹§É\ÚdÎk2GÉ¿l#æ÷GÌO˜óGÌòˆÙ9‚­Ï²6[Átï´Í¨àµHk¡ø<9ÎR$ÿ‘ŽˆuÓÈ1¨d5ú…N€¨ãah yˆ ]ÇgÀkÔÚ»"­³Å(Yi­F¸.Òºay¤u%Bg¤u± Zõ.íiR¬³‘6t•‹C´ÀÕp!â3ˆó#âZìŒ4¬ëL¤t±y)bŽfx™d$ÔØZ0k|ó!ñ¬8U%K#âyÔ“?n²$"~èÒgÉâÞIñLë½âéÖ(Åæ—Ú±9"¾èÅ.‡ÅgÅGÅ'½z˯¼º’}q±G¤¨á¸ôý>]å}¾(Ù{Xü™÷¬¸]µoC[|gÅ›ô±ûã°Ö‡½‘»Æ7)®oÛ¼zÿ«%»°]{AåY±Ñ§ëŸ‡&ÃbH:+Öûô¢Î¨Såqµeqj–¨k›1¦7–ÄgR„S,l×m÷£™y«èEwÃZq‰hMá#d^ZÂd{ ‚?Ƈ‡ùð­|øF>¼Ž/åÃóùð>\̇sù°‹O7¦£Å˜bL2#k¤¸/Ò£êGídI7X­dõº@µ’Æ4JŒšêtŒt7æ;1ïÄ|æaÌÛ1߆y æM˜‡0ª=§õž £ô¶CB¼zÝ’hÜBïLÔµMtH¯á&~N1Ò%êˆBîQ »ñ*©=Ù ^T÷t:23‡jµ©5¶ŠyÁ¿Qt%Jÿ÷ŸãïîàÿáGš[7¿ˆËôst½H^Ô˃‡yñU^ÜÏëÍ× @XëaM ü*N8œÊÍ×t(O;;•™ZEuv6+ÅÚ›c‚ÖÒêPp‚ÖhÐÙ1ÐÚP›Ö;Ql¹.†§v-ŠA¥(FžQCcžÖÅzâb­ÑÄZ5@1º$]L¢u±IMìà`e(x°²Ra .2ÈýÈØEÆt‘±„H¶.âõ¢HƒW9˜ëEƒÞ\íùžÝgÇÙÅ:»ü{¶/ÎnŒ³‘íÿüzëÿéÐ ×ÔgBm-ÞˆªH Ÿ¢ðeÊËÿ“Ž[Vþ ÷¯”¡ endstream endobj 348 0 obj 4048 endobj 349 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -12 768 682 ] /FontName /RBNCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 347 0 R >> endobj 350 0 obj [ 444 611 611 500 ] endobj 82 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Italic /FontDescriptor 349 0 R /Widths 350 0 R /FirstChar 107 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 351 0 obj << /Length 352 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚÍW}XSWšßss“$!Dð&„&„(*Û€ QëGµ„¢‚ˆ¢ˆ€2(®Zµõ ZÔqZ]§£<ŽíÚe­áÊhÛ©íØuÛÚm­3µ;n}F;ÕNmg\ûiåî{o¨û¸ì{ßœó;ï9ï9ï×¹çž@ ¬¼uMµ- …Ôs†Š¹®½ÍúÊÏþñj_àS¶,jÚð_{ÔÔÅN-ZÚ±ðÚ•åÚSÄg5Ô×.øìxñxÝ$0¦:bö©žˆN'>½¡©mU @)ñ4´K›ëj1ò‰ŸF¼º©vU‹6Ÿ!¾’xë²Ú¦úâíÏÍ!~ñö–æmÒGÐEü Äg´,¯o¼aþ+ñ¤?êmêCý‘=RSX)÷ð BE b掀@:Oå²\«¤Û|Øß•.p£iw¤Ð“Kài PlÎ/‚%è§þS6™ ó°üX zZµþ†ÃB8 _AÓAxIÚ y´^ Ì‚Ó`ƒÅÒ  :¡ÑØtè–>.‘¶Ñ¤­6ÃvAíÃ0q©t(eÐ çñaéœÒ4Qå"+ƃ&ÁZ¹ æÁZñüÎb‡´Y:MjHß(( »^‚cäÁ-Ìî„ÛK#%DÂ1K¤™ÒQémÒ“…´Vž!Ú{à ‡ë0ˆœŽ‡¥Fi¹t¤«6ÀVØ ¿‚ßÃ÷èB7ËeÍrÖÈK‘¼öl²æ²ç\@Æàl\†Øß² wLj‘ö£µrIc/¼oÂÛp®‘¤S°›ð4;ÌÅs»¸}|;ÿŠd—®’}a¬ mƒ#$ÿ1\„Ëð-|G>˜Ñ‚ŽÂ|,À ¬"z 0Žmb/±Ãì:§å~ޥм,ý§ô E%\ãZÑ~˜L>Ë\N´›bõ¼A¹z›"öGøѧð%ª0IÓpÒcÃt‰eDäW%.ÇDŸà5FN1Æú¹·SªM|>ß!¥IùÒX¢'8Š|E©&ÀÃJæª)š ÐHšŸ‚M°…âÚ û)‹ýðYðünÀM¸?"‡4“mtŽl‡]D»‰öS,ÿ‰vò1ÚG')ǧ‰Þ%:ÿAQý„²w…说Ǯ“ß‘:Šq„äŒZ”ŒâÃè#ïfUâBÚ-¸×uã^ÜO‘?ˆ‡hgõ“÷Òûx‰è/x•¼¾‰·Èïæ!š¬øü{’­'ÚÄž§r˜½Eô-7ŒËåfqOpÜî÷2÷.÷9åq¡ªSµOõ;ÕYx/çëø~ ÿKþ†?Ç_S§«k¶kvi®QVfSn áþ'žvX¼ ¬õÓ‰0Tô®Á6øiÉ«•O¹î èyè­ŸƒëÀÀF±_`6åè×|·›öÄstVŒ¥7ö"½[:¡sá<”â)6®B*dñÒu0KŸóm|%·R©˜ifüÐ9wÊçƒ%tŠÓØàkÒGܲl#Œòff8Òíi6«0"5e¸%Ùœ”8,!Þd4ÄÅêc¢uQZšWq !Ûo/­±†2jBª {y¹[æíµÔQ{OGMÈJ]¥÷Ë„¬5Š˜õ~I/I.ü’Þˆ¤÷Ž$¬EPäζúíÖÐ{>»5ŒUÓ+©ý¬Ï´†®+í)J{‡ÒÖSÛf£ V¿¹Ág aÕ*moèô×øh¹/¹­sgS Á ÑòÂ!˜X»¶ÁL KøC»ÏJ¶û”1Îá¯]š6½Òïn³ÝÙ!œXgŸ{I(Î54]žg%Ñ•¤Û½X¶ºbØt…½0¿FnÕVW†¸Ú`ˆÕÈ:Œ®P’ÝJZý©ù.ûSËÿÌ=ƒ!æ(­­ï,¥Ðt•GØ™«}†¸Š™VZ–m V†pS0b„b{Ä‹z»_î©Yb EÙKì Kj(æ0£R´x-~{­/‚i•b²7YaÜÙæuãm”w±»XÆñ6óº~öT¤ÿÓъܩK„3îÄeMö™²Ö)Jìdë8¹ªuãHŒž ’—‹CQk: Ѭï0Ø­_%Ê~ý‹û{j‡zÔÃ× 7åtÞÙ4>ÔV¾% Ž¥ï»|Â{Sxµ@[V¥8Ðñ*ã˜%J­’µQa–sÔ¶hšÙåšz³hÊí¢©†oЦnÁ#E·‹ä2zTžÑf̤â௾õ"ßðÞÓÜ…3è.a“.ó{鑇ÉÞhÂxÞ¢K‹µ›L¦øaÉ–4‹=idrN†3ÓS¨5ÎRª-µ<¦Uå^”Ü‘³5y‹skÎóÃ_Ö¾l9f:oMQe$³(®Ìävg»²³Ý:çð””2SÖÈ,KrùÁdLvšü.ΩՔ÷jPCœ'ÇãÑh£t®ìdË𔬘4ħ9øÜF;ËS»G:¹œh¯ÛSžS–“§3:mYé#½P2²¼Å¸ÞxÎÈËŒyéyùžýÃ)caûÏs{¡å‹ÇT8ÁrÑXh*4·{Ú '\´˜á‘¤"úÝN*2%jxC»kN»¡Hc(ú©1Áe6i EV¤™` †§Ðaë‹Ã“âóâó32s0³Àv·ça, N¥GƒvŽe ¼jÏVGí‰Þd6¤ºñ“ì®!f§Ê‰Wâà›ž÷£¾Ï<›‘îäŽärIö˜Ä¤Áfœ®i–Ëçæ2“%.Ó6¸·èLZ—E•›«q<ôãÖt{œW Íåv¨<7Šió⊾FÔ*üÉ[w2¬ì$„¨ŸäeTà|e…Á®ùæÎÈOS‚ƒ—oxto¤;mD£[…šî,jjˆ24WñâQ‘0 ­£#À´`ñÄI%®Ç7Õ¯p—4/] ÏWi•|ç}À#Wüf‡z‡† ³.±LH³N‚ø0ÛF` ³­Æ0ÛB`³Íqa¶‰ 6Ìž&ЇÙS1a¶‘ :Ì6èÂl=½,OhÃl&ÌÖ¨Ãl fÿ@  ³Õ\˜u°0[E€ˆó+> àû´:Ñ:wqG:n/ö°òÞ@µÍ'Oö³:â%¶€ê¯”úEâ}VOõ묖ê#J‘Ü®ÔÍl!ÕRûQ¶ˆVi-Që-ŽfùxZA§”ºW©5Þ„Vý™Výo[õ/µê×·êÇ·êÇ´ê‹ux–¾±zìSêz¥ÎðFÕ«o«·•E>£Ë¢')uŠR'y‚ú+AýAýþ ¾&¨ŸÔ§õʼnØIWj=>¥Ô•zµR7(õ ¥v*µÑkÌÒœ¥ß—¥ÿe–~~–~\–þÆÑ5P:ol¿þr¿>³_?¢_ß?\ÿ[ÚAq+ÆAÔ¾ƒ4:bø2!Œß‹Õf‚›¸!V§|%V;¾«3„âdü Tk)>ø)TãlÂ?CJæ/b#“ñOبðÀ‰ÂEç š~>EࢳŠàÑ™EðžèL#x7ÿ&:G¼%¬oˆ ‚“b ‡àu1à!8!æ„ÅÀ‚ã8*º—ˆ¢{ƒð*†ÀÍzIýz±:™zŸ«SÖŠÕcÖˆÕã„b7®„ÅÆ¶!V¿—°•Pö­º•ñfèVÆ—a£Â7ÊãK°Q‰ÅbúŸ&Ï[D>ËX':'‘š¹¢3› (FTŠB±gA@Yì1(΄€2išèî%±GE÷²Êý“E÷{BqV€åYp(Òå¢cIÊŠg(î!\d¹Œ#Á«d%œŠRY(ËÙ#yH»l¢³ŒÀ*:G¤F`ŽD>Q ȾÄËÑ} àVæG{HÿÕ‚ð}uºð]Ïá[*7äM w†ÑáMþæ¼"|éÌ®;G _8u§n»p¾û„l œ# ë0áœÓ(|0 ï9®§h¿ý¾zŸpÒ9_x6ÈoX…Þ8á°3_ø—@ŒÐX*¼ûâ…hÎÞÀ.á4ïYçR¡Óéßèµh“¬¤u–»S„w÷šÝB“‡š¢Ðè ㎠K»„GXKæÖu‡z£…'È–ª@¶0+ ó:A£v sÊçÔŠÈÁ¶% µ &›Y'hÙV*›©k_×Á ”‡»ì¾>8謲Þ'vy»”9G§˜¼ó>]Ûîèš|à‹›,뚺óÃ;åᩲ®²®²®©Þ©Š.ÿâ™%+îy~ÖÖi<8 +è]ÿo^Œzµ endstream endobj 352 0 obj 3786 endobj 353 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 351 0 R >> endobj 354 0 obj [ 722 ] endobj 104 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 353 0 R /Widths 354 0 R /FirstChar 119 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 355 0 obj << /Length 356 0 R /Length1 6104 /Filter /FlateDecode >> stream xÚ­7 tTE–·ê½×¯»“ît:I§ÓI÷{M'é–Î’OçÓ‚!BL¢Á„ÿ0ü$ÃLÓŽü¡ëºº¢Dm†éü°’TP”wäøÛèxÐèèGÒoï{öŒ{vÎÙW]uë~êÖýTUW€hØ ø:Ö´wCü)§±¶uônÏ}¸y?ÉàJ—u/_só‰Op„f5#-_½yYÓüžoô)Èïîêl_úç‡Ëý1{q|~Œ'¢KE<µk͆MñŸÁ#ˆxüêuít;ñËŠkÚ7uk+èc&-ââÚö5#»A܃xZ÷ºõäw`ñzÄ3º{:»ÿÝFñ;ø¤PüQ<ÒÀB„56I¹þ£ðËó t–Û€^ηâ˜5`ÏcE_äoÃ-r˜ËƒÌðsò2 ø§ÉùœðܯÁ&؆ýL…Ù8׳PÍ0F|0 ­zv£Ü÷`…jXE>Å9ž‡.xåÒÀûÁ‚ô¥Ð‹ãÓ¡e BÜ›á¼ï£î h€E0J‡ä÷`:<gÉïXF ¦,ȇ5° öɇ JPÓv¸‹¸ÈzyZ±¬A»î…†ßËï¡_<èU‹QrÎt„舃øH?FÖ&´gÔãL8b˜hiµÜƒ£â |Ps  íÞ {1ÛGàœ'‹éfH®’_Æ âZÀñéhE!fèFè 8Ã~8 #ð#i¤F9U~R‘OÊߨ¹âÀŽ)ZÔÛ Ëaê ¡Ç„óXÆàsMf‘rROúÉCä$9GýL&³› ²&Nÿ )7z3­.€Yh÷­p´ãÌ÷À¿ÀÚx¾'V’JòHy’Úé t]GGé7,òcòÕŠ™à1’3ÐòR˜‡eÆm#  E¸s÷ Zö,‡·03ŸàZý.ŽðDK<$µÏEûþH>¦Fj¡.ZA?a¼L)³Ž}—ãüá}áïä&¹Y¾]>†ÞŒs)ž+qº£ÅKÑ÷^ÌvæN);±ì'à8ˆ+ì0¼‚3ŸÂ¹ß†÷à#œÿKø m‡‹ðW¸ hE41aI )XÒH&F­³ZO^ÒG¶“dÙ‡6 Ãäy#YM›h+ÝF÷Зè»ôý~A¿¢?0:ÆÎ81Æo°Õl {ˆ3r·q[¹íÜaMþÄÅpAøæðâpoøŒÌËFyªÜ+o“—C˜Õ¿¨‘ÔB $‚ 3âŬ΃ùXêq¥µÂè€e° s³ £¹ãù(zxaž~‡kéMôî]ÌúGð9zöüÆÏbœ“p=O%9èQ5z´,"MäV²˜ÜF–‘.r;ÙB¶¢ƒXö‘{ÑË'Éar„œ ÈEò=¦—£Ñ4–Š43SMaiÇu°†n¥»éoèôú}†þ+•è0} £ñ5 3QŒ‘Ic °ø™yÌ|¦¹ÙÇ<Å<Ã<ÏœfÎ2ãÌef‚™`óØBöFv+{?û{Ë_¸X.››É-â–r«¸µÜ÷7ŸŸ4ù‰wñ ü~¿Ÿ‚ÇáuxwÚµßËÿ×ïQxž¡~ø¾Äì¤3qïL'/@=Û£xú¤Ð¿ÑÉ›¸²j¡ƒ žu”«;V+³÷5ÈŠg¯|!\ç òÂ/Ëï3Ô¾R~ŸÛŽ9ÀoÆq¾`ud>ž·1y¸~—âÉ2 À—3}ZvVf†wê wzZªkŠSö”d[’5Ñ’gŽ5Å ÑQz–×p,C dø]³ÛD)½MbÓ]sæd*¸« í×Ú$I³¯—‘Ä6UL¼^Ò‡’Ëþ‡¤/"é»*ILb1gfˆ~—(©r‰!Ò²  û÷T¹šEi\íש}6]E ˆ88Bô[»ªD‰´‰~ivo×€¿­ õ” }ý¥>3Fb-%CQŠf *Û·uY(~ÉæªòKI®*•ǤùÛ—Jõ šüUÉNgsf†D*;\K$pUH1ÞÉáªf‰¯”4•¨Z\¡8ƒâ‘Œã{C&XÒæ^êZÚ~k“Ä´7+SÄz¥DW•”¸eÌú3z¥çß;Éü ™M›ÝÞ90C38'‚¶)Xû^ÄjoQ'íon’H?*sÓ#Ntºü ¥m¥(é\®®•msÛ€ ›A›Í7"ã›_XØärJeÉ®æöª”#ñ0аùÅ$Ÿ˜t='3cÄÚ7ˉ!É,Ï,Wà,§µ/ÿ¼3Bïx”*7ú)ÂÚ†«Q#Š!®¹è…$vˆh@“ ]™©43a c&Šá×L0+$]eÛ€©H‰)—fr‰—ÓèÿêzJû$E“fºJWIöÕƒü+}É땦NÅœc~:1MhZ©J˜‘™Ñ+%»ºM¢”Œ¡‚zŒc{sQ6ÆÝéTR6òÁD¤í š"¸K’ƒàËö6K´Má¿ÂIX¤p¶_á\ÞæÂÕ8¬^~$múÕ_ŒÉçï*’ˆåawª| Ê~׸ðΣüëUøt,ïNã§$D§úâôÞO IK?Ç6ëÂ#d5X½¦‹ÅÅó±­›(†²bÓ¢ØLŸæŠuƺ±ÆiòC?q3ÿv*ÄœºøzŠÖgxÚ¹*z0šF‡èŠá¨¨³;¾<Ÿöi§NÇE´:] œ9ÎÌU³œž‚Íž¬3›E3'šY޵{8ËÚõ{öé«á8Ës^“7+ Ê&ŠË´Úb%…Ù£££Ät6ÛV2n³^4õžÍ¶^lµ•LجJD0 ˆ)ÞçdÜyé^B0 ñ–ÄçÖ[ÒJ“È _=ÔéZÄV¶¤r‹úzÂczNW³zBròqÎ[ÙÂêažÌ ¹êÅ­—9§ÍXŒ7õ6à‘¿`Þà¶â/ó¥Vg7f/ÏÞ”¾!ûîÔ´=éϦ8¢øôéÕéLvBª¾B$Î7ãsékcR½9ñ“äÉDˆé0§¦âíÂ[™Äç¸Å(OQJj®‡ÅH›RSsõy¹WÃЪ,‹÷Ç•51^vÍ’ð*ÁP*.ŠKãÞËä"Ó§A+i\YÄ=£””’ÜKÏ``”N¼²,ÜélA> ¹¦0JlrI‹†3XygXëãW%r:z²¥líkû?8÷_Ëyrò‘Á†Ò'îíËÉg[\ц$žRÆÅiõĪÕ&¢·uÞ»êÇÎee&WþΡù­á±žrg+¯4ùóænð‘Xß³œÛQæq§Æçß°²äa÷A÷ˆû ÷ë³>pŸ+|V [–ºSò‹g”T—5G5–ltì6ß—•¯+°K ës‹žj=#Š”8ÍQëô®¨Ú˜Ü‡˜5…©±…1ŸÛé™ë©päæäf‡ÝQköù3ÚQX`‰á}ЧVfDUÙ—ÚwÙ{ª£Ê±Ä±ËÁ:ª+ì“ÃQ¡'&¨˜SžÝ{Úª,BÀ,lËÆãbÔÄõžj=ÕjU2áUŽŒñÝ\–׈éżX•ÄÌA/®ÌÓV›’ŸXsb$=ä’ÉvÊtTv‰ ÙÓ¦“ÛñA“§æÊ… sUF,‰‘<)W ω’œœü‚Ä«»¹àÊ^Ãã6O²ðÎiщÆòñE íßÒèÉKôÚ¬Þh²UÕÙ¦5ÔN)ãØ>=Ÿh¯í©ôÏ(© +ç;ãìN†NÑëy7Ë…ŽÝòd¬³Ñšç;c¼ºkÉRÛºÌ3gŦÉçžÜ(«kςþàÊKuʼn½ä¶˜âK„hUüøÈO›¯@y\>'òVÜ3º«/[åEaìh!üTøÖ¦Jå{®¹ÿqìŸäqæù[v=¬cp;à9‹otâ›ä, ©º8|…i`%VŠ/<îEà¿ !NÔYÌ“3j”ûà¼Ê•5Þ…+Öt®Ïœ»¡}õŠŽÉ—µü-ÖNèü»7Qk&¾Áü°à%ú‰Æ¦@Ö !z¿Ï‹0  ðôÀÜ¡¹t¨ghè90H‡„¡"z@8PD‡Ä¡zz@DÄ…èÝÌ!ºAlˆîF` ѻĄh?cˆîB`ÑðXÝ *DÏÖít!ú+ÚíCÀ‡è6š½¢[°!º¢› 1›àÿâF¢½¾„„Ðå±£õ•ÇÓ²ºÁ@Vªí-j{“ÚÆ«­ImÙánúnC¹ž¼ƒoh9©¶jç3v¾é2ŒuNvþ½Ëð é‚:dØÕ–óÅ×ÎÔ¤:Ã@¡¸ÎSg˜Z§¨úÚ2¦¶Nµuøk ß×þPcx·Æ0Tcè¨1äÕÒj !ò¾Ø~ÃGý†ƒý†ô~ƒ«ß`ïGê Ã1µ1 ;†ï†ZTp6XŸ!¼DN€ˆ^ äß‚â1¡<‰‡"VÁ_™„# ¨ð(T’4„‡a¡ Ÿ·V¡·ëg!²8X_‚àÖ`} ‚–`ýbÍÁú%8ÅÍP¯YÇ„òXÒ¢ªrþäu0H8áóç…å8º*X¹D(בr¨TÅJqæF„)Šáå’0©&vÒB#V…oÎãE!Ò. ž´ ðÙÂK‚Â'î}Þ%|ìN×ß'¼U¢H~m!’ƒÂ«nrTxAx\xÖ­Ržv«JDÄCZF¤ð¨*ï÷„È#G…߸Ï}Ê”¨}*Øâ9#¬­Tç^Ë=8¹Ë®jF±U Oí2ƒ" yE yN눈‰´T«WŠÑ ªb"ݨŠ)bGzŠüUGŠŠTöeèQEzØ—¯¼^dPœIVEÜn©t+"G¦¸Qàˆ{ŠÊNý™½0ÂΊ°³TvÁÏlO„]aW#ÛûÿøuVü#Òþ7UX ¬Ìª^WùhIƒ¯ÞõK:ÖO~Øøo°ái endstream endobj 356 0 obj 4373 endobj 357 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 686 ] /FontName /LCQCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 355 0 R >> endobj 358 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 500 611 611 611 611 611 611 611 611 611 611 611 500 ] endobj 19 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Italic /FontDescriptor 357 0 R /Widths 358 0 R /FirstChar 74 /LastChar 110 /Encoding /MacRomanEncoding >> endobj 359 0 obj << /Length 360 0 R /Length1 3700 /Filter /FlateDecode >> stream xÚÕ–mt”GÇÿ3³Ï³K a“PB )ÙB€)„ˆ”ʆ"TÆbJ „%dK€’bå%â[ bĈm­H"§])RJ+’ƒ ”`‘ ¨¶X( 1Öšb”°ñÎ?[> Ïñƒçøì™ßÜ{gæÎ÷…‡µ0.¬( a6ö‹¥YÒS W.O[:»Æ¨ù€îWZ\Q’òf¹”×.^R]¶¿êLÀcë„Ê•”¾398plùGËÅ÷šú…è{ER^±|U¿«êˆè§E°¤ra‰š¡¤­sEôøŠ’U!_µQôNÑÓ––T,zëÎñ€;@ôA¡ÊªåÝÉxCô{D¿;´lQ¨¸aÌÑË_œØìxìˆ\l´>p_Ìrë§ñŸ?ƒÿþ“QÁ‘ÔŽS˜€Mz3&¡M(Vmا¶!¬2±YJ'àyìÃ1Iã‰ùf·ÔéB ¢EÏÃIÑÊ¥ï|æH­z­u*V Ií@“Ž×“Ô^ìÒõj žFy†IÍšý¨@¶ÞƒbÏgõ/P¥ŸÅ åGŠõd=«—FçÆ9Ó0¯"‚ݦB_öcŠêïåø .`¬‡¨Õ $ÒêEPçÕÛ:¯«£ªKr¦óW&£LF»Ó„:à€è)˜d<±òéví!ñÛT¦¶9'Õ.žŒ¾Y؉­bß)õ"È2uÈ49®b†ü2LX²‘â ä;-(RõXá>.s%eæ€Ú‡lSçÔ¨cÔ뤷DuÉMÅxO@s‹± Wˆž¨ÏãQÔèkRs?Þtjõn™D§^ר=s‚YN>ÂN-úÉÌ$Ÿ'+2Èé@¾:¤3á7»UãsãœÐ—uœ; ¥N›jWî(7]ís:e[Õ¨&w,&ª.7[vÇ»ñÒ¢Fæñðê kº±£ƒ^×ñ­02ÍÑé/?Y˜v|n sä-jšß›A^¤OuÚÁîî¼BOŠ37â Œ˜t_Ä“>øÂ¿+¼9rf^aÚAå:%ævêü)bœ](¢ÕÄ,ö©S2{ÎBYt‡§ÌyNv¼ÉÁ^¸ÊçhF5·6gÁ¶ùló褄@Bz !PæAW•IéºÝáï|o™›ž¼"Ùôqæz#=˜t[؇-®{Toƒ8oï^Nœ¿5§­+§- £ºr$­·'ƲuµÚ­G—¨íaŽ.P»Â²I[¡JöÄëcìãnñ`‹ûŸd鲓 ¾Â:µ,ÝB†¹¦_fÍä—0ܲû]‰m-É ±½³AΗ¡lä•YÏñÔ°F ×m=dzNæ¯UJÖ±dŽHÉZ¬‘^–¡á5ørÄfKŒÐΈµØÓj[~ž\-÷†­µºGc?±V5-«ÈGÉ•õŠÜžs]…e˜*-«z4¶´#ÿB\ýGXB%W?ÄÕ1¶J,ÅP±Urõ+›µ|ŽmÊÉÅä"r!ù0YL~†œG>$/–=ëQ+bœs)’Ÿ& ÈO‘sÈÙ\©|Êyäƒä,òääLrz÷[éÇè-Sx¢ï§<™Ì%ƒÍ$Ê÷‘Éry/9^ZÙsVG~„Ì&ÇYb3Myy7™IŽÄtáÊ&3Èá&}8’[mwèPÊéäô–WÃÈ{²C =MæÈÈÿ<[ÿNZR)$Sr{öÁ‡È;Ø÷ÖJ&û“·Çè—Ùé‡éÑ‘ÜÚ’ä-š)Z{LŒ•%ò4ZÙH›(iÛöå銧¥Gö&o#{‘>Ò‹±BWnW¾QàÅwÈÈK—JZÏŠñÏ—ÑÏëZñþ¤¤§%E$‘ä…Rl¨UU#þ'Füß}©ÿù5 endstream endobj 360 0 obj 2004 endobj 361 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /VPRCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 359 0 R >> endobj 362 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 17 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Symbol /FontDescriptor 361 0 R /Widths 362 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 363 0 obj << /Length 364 0 R /Length1 3476 /Filter /FlateDecode >> stream xÚÕ–TÕåÇßÏó|¿÷¢ ^Т†(wD„ʉ9 ™ÓF Cb$ˆÈÙDn¢&¹&ÊÈÜ•~YŒ9rÕ3ëÔ92לÛ´ÄÕÂå~°•537ÆZ3Ç™tÙçysëÚÎþÛ9ûÞó¼žÏçÇçù}¡Ä  y+ë*˜Šõbé•T²rãúäµKš@%zbM`u]eBÀ˜kÅߺzMcMÊ¢‹RÖÑûE¿ª¶ný¦ñª+WTøÖÔ¯¬Äýˆ.mbl]å¦@T´ºSôI¢'¯­¬[õÆäZôѧêÖ‡…‡D/}j`ݪ@Åc³ö‰~#6;;" m˜±|ôÓøïŸ‘4ˆ“˜‹ízr± =¨PèR»TØ!Þ¹x]8&i62°ÂtJ™aôá út9NˆVƒL}¥äEX*¥:´ÖIØ€Õ†«sÕØ£;Ô<Œ2LqҤ䔚¨C–Þ‡ ç+ºÅ 4èG±AùЀ =_Ñhw.b¶[ˆr<‡:M>ç­@’Ökñ{œA¶ž*´ê*‰ô°êSÝê´zS—à%uT «“îBþjd” t{Эq+ºEOD®q"þ…vî‘.ñÛT£v¹'Ô±Œ~™Øûľ[Ê…iÚ‘a$rœÇ"ù¥›v±d¹Í"Å=(qûP¦:°Ás‡Ì•øL·êB–iw›Õ1êíÒ[¼:ëIÂǯÓ<ØŽónHÏÓ§qšõE)y¯¹­ºSæ#ÞíÐͪjtNPä– è¶b¢ÌŒ_òrY‘)C:>Ó©ö07î úœŽñ¢ÚPƒjÈ3ÓªºÜ!ÙͪǓyjØ“¥{æxb¥F³ÌãáÍ-[F° 3ó¼×1Zaz²/¤S?WÊûBiòñåþŒéQ“}ÞäŠC㓎Œ—:‰îò;)dR£BNjÊ™ÿä<“1}qqiòAå]PivÁŠ1.)Ñjbû‚‚ŒÑ½\nsjܽ²c½HÈãÀ£¢\í`Foo&|§zOõΜçKõÇùk 7˜Äá³á6oìлë<éàÉ)“scŽ!©yÆ£°Ó£ƒŽŠ6ˆñFqc|ý9Ã9™˜1œ#ùLå¿Ì—çÏöÇeéFµ+\ ¯Quz0\¥öe“0¶R•àÄêc›”7γÓÁNŒràª(ß©œÞYàð@¿m0›?'vx‘é¶I%›ƒà –”ÿøÝ·ŒÏyO©(Ï#Ï^jü0/Ìääpâ%w;Þï»aYxÿ¥þ¨­» ç$jìUàT£LR©ˆŸ”_‘½•XÚÁí’e>äÉà}[μŠDiÓƒq@aÁÒÍŸ¶¤±®ª~͇wLø ÙùÿîsxÇÄÊ-…üݤ\„a”CÜ!Ô” KŒaò}r˜¼Dþ“"ÿA^$ß#/'ß%ÿF¾Cþ•$ÿBf”¢|o£Z®ïóÔ¬lpŽò[äYòä›ääò5òd?ù;ò·äoÈ_“§ÉWñ $Io¯"E´Wh{Ed¿¤ür„Öòå_½ä ¾Hùò8yŒü9cÿåçÉ£dùSò0ùò9òÇä!<‹›$®C£ÚÈËÒ¿µ¹õŸ‘õt%¿œZ“xž‘Õ#6ë1Â<±Y‹Á0Kx@î“?‚§åÈ’rO˽e„¶\{ø!c á)éÑ•ÜÚž’=¸Q4k³šíéÉH Öc„¶…DZXäý¬ó¹üÛìÄuÂïSÞKû÷Øû£´<iïyû¬fÛ³ƒï²Þä ’51è`íï°·Ý”¿M¶Û}Œoá3Â6Z$` »è½Ÿ¼}ÞKï=²“ îf™Vzw’A®é7Yfy®±yGbÛNËdKdï´àzѬlä߯ñ4³D3×mdzUæ¯_<[éÙŠ#âiÂéÕ¥Çí oÁב#6ë1B;#ÖbO«­ù5r³Ü¶ÔæQýÜÎR´l"o#7rÔòGÏuÖaÔlÕXÓZŒ¼Ë®þ­ôPÏÕpõŒ­kqµØê¹úõŒÍZ ¾Ê:µäjr¹’¼…¬ ¿L–“7Ë‹`ÏúÍÔÊçrÊ¥ä—ÈeäÉ¥ä®T åbò&²ˆü> endobj 366 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 99 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Symbol /FontDescriptor 365 0 R /Widths 366 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 367 0 obj << /Length 368 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚ­W tÇ™þ«º{zF¨¥]3è {Ô’FÖèà !ŽA !<€ÀæqÈÈÀŠËl` x;ÞÄŽ È4KZc³†9vìÍó3Çn䄇-;ñ'hzÿîò²û’÷¶kª¾úëÿë¯ÿ¨®©‘° ð6·5µƒ ^‘sX'4w¬’?þ|íÀ•,l_ÔöÈ©«8ÃRÀ¨‹–­]¸`Ë?ˆ`‘ö·¶4-øÃOÊ&ȇ1­8u*²éH§µ¶­ZÙkVU—-on\Aúm¤­mMkÚ­^Šë §‘–kjk9¶å é>¤ÓÛ—¯\¥?G¢"‘Îl_ÑÒþ›oWóHçð³pŒ€áᑊëÀ98ò>=]…u,$r3 –iƒDý3¬×±þ)4KqùÚ¯ÿ“Œò?¬áÇûa7¼‡>nÀþS A&dÁŒîP ÐG¼0×x¶¡Üwh],%×pÐ P.|°p|tàü ¨@كϡ…µpÎÀ§¨;¦Á 8M{ô`¼É/YF ¦\m°vé!Æ£¦M°•(d¥Þs°´¡]?†…ßè¡_ø=‰$ãHñ“NòyŸ|L}L³ ²"'édŒŒ½ÉB« `Ú=æA®¼~=hã øŽ8IÉ'•äUšB¢ érzš~Ã2l7Û§ß0-¡˜ #9-/ÉXf`ÜVCZ€g1wÏ£eoÀI8‹™¹ ýð=Ü!ቕd’<Ô> íû-¹B£hUh9½Êx˜f9{‰íã|¡]¡oõz½A\?ŽÞ_Áµ Ï8= sÑâè{f{#æÎ(›±l‡WàuxwØ!xWþ×¾Áe\ÿKø m臛ð¸hE$±Ä“d,é$£V‚Yõ“©¤ƒl$›Èf²…ìB÷‘£ä8ù#YEëéºn§oÓKôcú9½N¿¢flL ãŸa«ØYìA.Š›Ç­ç6q‡,cn† B„æ†:Bçu^Ò³ô}ƒþ²®aVÿhFÒ Ñà3âÁ¬N†)Xü¸ÓæÀ|h†…°s³£¹ãù"zø&Ä<ý÷Ò‡èÝ%Ìúeø=zög¸ œÅ8ÅýœEF¢GUèQ™AêÉl2—Ì# I+yœ¬#ëÑÇn,»ÈÑËWÉ!r˜œ"7ÈMò¦—£‘ÔNe𙩢3°4á>h£ëé6ú }Žî¥¯Ð×é/¨JÒ³¯iˆÂD1éL3™™Â413»˜Ÿ1¯3˜sÌE¦Ÿ¹Ã 0l>[È>Ì®gw³ï±Ÿaù#gçò¸±Ü n·”{Œëâžãz¸ w™»mcQy…ŸÆ?Åoç÷ð=ð2ü ~‚oÚýÏ ˆÿ‡O¯á-zžúà|‰ØLÇâ»3‚¼~vœÆÓ'™þ•>O>ÄUÍä$àYG¹HÁêdöà{ úï°öc½*Çsy¡ú§Ì0Ô¾Dÿ”Û„9ìÂ7>߈ópµ‘)x~Ìcòqÿ.À“e8€wäˆáy¹9Ùž¬‡2ÝéiJªK–†¥$'%u:âãbcìbt”9$Âfå-ËPÙ>eB£¬f4ªl†2qbŽA+M8Ðtß@£*ãЄeT¹Ñ“”ô¢ä¿‘ô†%½÷$‰(CqN¶ìSdõ|¥"kdÖÔzìï¬Tdµßìך}6Ã$$\.œ!ûœ­•²JeŸ:¡£µË×X‰úzÇ÷|ýeDN6ôÚÆ÷ 14«PÑ´¡Õ‰`HøÔD¥Ò§U*M“îkZ ú§Öû*“\®†œl•T4+óUPÊÕhÏàtS³ÊW¨– T-/6€nùpöÉ®šó=‘ ”M³ëU¦©ÁXÂîQJ¥êX×çü¼Ûóíd~L•¦Ohj隀¡éž& ªiR5ÓeÔI;êUÒ‰ŠeÃ\Ãô°-ŠÏi\"«6¥\iíZÒˆ1OìRaÚZW01ÑÛ«ã›OW\ji’ÒÐT™|8º¦­=2Ô+}““ÝëÜ8Î…!ëÍ)Ë)3pœË¹1ŒØÿèäSîô5Äši÷¢F C”Iè…*7Ëh@½‚®Œ5š–±ÐÕ<Åði „Ū­¢±K,2bÊ¥‹ŠÜu 0JÿWŽ4 ŽXÒÅ[`tdßÛ0È¿ÛW=5+ sŽùiÁ4¡i%æÀèœì5Iie5 C~ŒcSCQÆÝå2RÖ­ya>ꦩõaZ†ùIAðæyTÚhpNÞåÄÏ08›îrîMoTp75/9ñª5ãÞ/ZLˆõµ©$áÿ`·˜| ÆûnQðÎcüë•{m,ïÎâ£D£YÞX† ï#0ÔJÇ6ØB½d8=âÍââ)ØÖCi±8€$6#†+v—Ý5Ö2F»]ÄýëóÁ±`ÞЖã©ÂãZÉð²7‰Ožà˜9d¦c»m·ã5ǯ’­^á5×ÒÈîH©ÑÅG‡ ©Ž‰ÀŽ7ßk}Íe³q‘‚Õf‹e‹‰áªX.‚BbJ’56&FŽábå–cS29‘eS"†¥äóˆÅ$ÏSì/òœGôäæBé@q©uÀZl),,Ì;}ú4/æ%ŽïOtÞ;.æ9oÎI?è1œÌ)ƒ…¤Zxw¬‹qägx±ð–ø¸G¼ký£é%CÉC_½Ð¢Ì`+f¥q36®õEp¶êeª‹uÍf «Žòd\(ÈUÍs‡s%ºÅøOjÆ Y¿Î³7Ty/Å¥¥‰iÉùb~2›\ã˜ãX—º.íéÔ§Óö¥ìuíMÝ›v0å ë`êÁ´ã)Ç]ÇS§]H8ã8ã<›rÖu6õlÚ™ôO²>ñ|‘õ…ç{E¶)$99%'Ç“ëÄÜ$Q´c›5ˆyÑJš3i¨âŒvHê°'(k;iÍäk@¢g¦’&åä&ÛÅ䢤ˆ¶‹â´˜\1:7 ·‘ƒ r“ì"ëÀé°äeB„Tàb-æáácNì1ŽB(í/õ{£Ôî(ÜÆåz¢6ˆ§·Ysf‡IÀ ÆÚ =Æ€Ä[ýž;äˆýD<9' â™m¢uÃi+Î6Ñz·‹™z¯µ£ð~3:?ƒ]B JÈ(c’îÑ®ø(ÂÅ$Œ‰¹tD%5ÃKÜ<“L¼”UW¸$ŶÆBoÿ÷O=UduõÆÐí•Ê0WÂC’·¹,«²Ð1Þ5g6{Âf·eÇPÍÑĈ;3ƒ»Òœ‘Lj*[5têɬ¤ªøYV¶:wÇ#•¡gÍüšÏÒ'·^ž]|‹«IŸì½½ö.êýúu|ãðßl÷¾PŒ/+ŸBúYè 5Ñ ”ê;ïûgØßéýìJXÎìãëc ~?½aÎgðfm%X)ÞÚE‰_D×É HSsÌà*ã?~Zù”ŠêrOÝâ¶–•9“V5-[Ü<øí£ÿ k ´üÝÛƒµ¦¼M_"‘øÁ Ñç‚þBI£»½Ä€%ÀÓ}“z&Ñž=Ýtߊ}Ý´Gê)¢û¤}E´GîñÓ}ò>?ÕhàHQ¾¯Ñî`•§Ñ.„X>£ÑívnC5º!Z£QÝ‚ ht3O! Ñè“xFlB°iôGVnDà5ºÁ¢Ñ'8®G`5ºÑèZ4f žs«@£ÞhDB؈qyµzËâèxò´ƒ@–˜í£f;ÝlãÌV4[öh»°¼](‹ ¿Æo"¼o¶Ífëj¾iúZ…÷[…ÿhÞ!­øA(³å¼qµÂùZA­ºj…âZad­Uk¨ú?œÒg¶.³æuT ßU ŸT —ª…žj¡¹ZȯÒ«ü§×Þ)\îÞì2:¥SHéÄÑ·ŽF×Dƒí8ÞkPÁÅ ?[z›œ½”È¿åãRÙPrŠXƒ~g{A2ñTtÄCPgâp[ñÆ ´¤‘¹Aÿx„ÙAÿ,„YAÿ\„† >.ñøÍ)uA¹O*³“i ›*§ .Q ÝÔÀɈ'¥E8»2X1_*³‘2¨0ÅJp噈Ɇáe‰Tc´0 «ÁŽJç¥þ"Ì J7POzPú¢NcIPºêÖèï銻O:çV:ë×(¿W‡ÃAé]7N9&½%½,½á6G^s›Jö…Å^’5+Âóaéç2M•»35²÷˜ôŒû¼´ÑXµo@ë2ÏKU˜k·…aQ&ÎFîÂÌ>i¾ô¤4ÍmÎX6¹“ë̵'—ª2MýÐrLòÉç¥òLsa¯d2JÃTAXí˜05J2µè6óž䠋Ùu¦í43Ý-¥I+$WÅ"i†d“lãd3þÑÈFo!x…lâ+ùÀR>°„ÌäùÀX>ËRùÀ0>Îc­QÖHk„ÕjµXY+Å÷"NÓ¯y³Œ“%Î"`a–5û"5Z>Ò(±R¨.sÒ.°ÒíX·bÝ‚õ)¬›°nÄúÖuX×`íÀÚ¥_;bÌî¥]ô‰£b¸û]78¸Žnìm¥k{kh‡Ù×øˆ±&b°ð€Ô;U²SµlÇë—Jv%©x¹ÛÕàLHè(u–Æ”Ø 'Tþ¦q°õüð8ÿé žûRã_û.nÓ¯1ôy×l㥠¼t7%j¦£@À˜C p 8SÔçk¦×«ûSÔ‘FGOi¨Qs{z/-¥ã}•½´Ä€†ú^¸BK}ÓŒq¸RÙ€b³L1<µKQ Š @1²$C ÙoŠ5‡ÅdZbˆù @1ºdSL¦«M±>CìðŠ"_åá¢"S„=+L‘ì‰ûDºé6EºE’L·E*܆ÈáT7 v§šì´Øuavn˜k² ~`g†ÙUav²=ÿOKù?#í[<½<JKæí“T-ø5Ç+ÿ›Ž•ƒvþ_Ol½ endstream endobj 368 0 obj 3885 endobj 369 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -12 768 682 ] /FontName /RBNCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 367 0 R >> endobj 370 0 obj [ 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 ] endobj 65 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Times-Italic /FontDescriptor 369 0 R /Widths 370 0 R /FirstChar 84 /LastChar 107 /Encoding /MacRomanEncoding >> endobj 371 0 obj << /Length 372 0 R /Length1 6080 /Filter /FlateDecode >> stream xÚµ8kxSU¶kïsNNÚæ´II›4M{N’&mIÛ¤-éBs I)-…Rª´0`K)°@;àÈKG,¯‘Añ‰ Ž:^u†4Çñ=ÈÐõ°ÿ  ÏC:¯§wý†¼Ûé|¤ë‘.¸iuW§ö÷šãH¯A:³·sÃíTú¤–Vuöv×?ppé§”ñkV¯[M¤ie}kÖv¯Ùü¯®m@sy4pB™ÚÆ9×~(¾ °ÿƒ”ƒÿGü5ùZµOB³ërƒ¯™¹&Ä?ÄwßOcÓP޲Øsñ7™\Ô?ª¼4ðƒ ¬° îG6Á{àÀ‡¤é£ð¼³` CKñCñO¡î@sñ¿‚3i7FÕNœs¬!Åt}üN¨A{÷㎼G2ã5“ÀA¸z VÁ/Qöœƒ·ˆ½)/Ú©ƒù° î†û ¯‘ü‚<Ì&Å{â+àz\Á ·½y>†/ˆ¼@ÎÄ­ñ£ñ8Úv@LSåàa8)žÀl#0Jæ‘ùŒƒ™âeñ+¨Ÿ†Q“¡~†#záVôä~x^Ãö>Z- ä:²†l%;É:™ÀòÜìømên¹p•Sa®®t/ìÇ>¿Ãöü#ŸD´–n¥_1Ffçrýñ-ñÃñçãÄá ã߈m¬Ç37;p½ûà8¼oã^ý ÆOôÄ„k8JΓÏ(P-ÄÙþÀ¬fv2‡Y`°ç¹îÎØ“±‘øñýñ×âÿ‰ÞSÌ.'î|%¶*´€¹0Úa)Æz¥šÀa„!ŒÝ9xÎÃÄH.úYI¦‘äò2LÎ’¯)¥z*¢ÍBz'}Ûiz–žc,LSÀ”2‹™{™G™§Ø»¹¥\w7¨ùŒˆuÅ–Æúc·ÆNÅã÷ÅŸŸÆÕØp5ÊžÖÃLôv.´â.ƒ[ÔXïTr ×sŽa;Ž«: §ðöy>€¯0ç®b’Ô8˜1^RMü¤×9ÉLÒHæVÜŸù¤t’dÙL~I`{˜B?Žb"'Ékä ò¶ò9¶¯)Gyj¦ê¢2mÄ6['í¢=t9í¥{°=IÓ£4ÊSÃÔ1ØÂÌiæóó>ó ka׳¿`ÿ…=˾ΰg/szÎË]Ç]¯1kª5ýšÇ5Gø•üïøw ‚1þ=œüÉ9ï‚ô^ú-l¦3𜽊—Ðh=îÄ&r„<Ž‘zóv¶w±ÉØJ±%c» cr¾Ë™ç°Û$17ÇšmÉ2›23ŒÒ ú´TA—’œ¤å5ËPE!G]‡vu„Y—£¾¾X¡Èèü£#,!«î§:a©CU“~ª)£æ²ÿ¦)'4åï5‰^òƒ¿¸H 9¤ðëA‡% æ¶!¾'èh—£*Þ¤â{U\@ÜfÃRÈÜ”¤C …ëú{v†:‚8ÝŒK..ÂÄÀH¤(‡azç¦3E#¶8‚¡p–#¨Êg¨si¸yn[(˜m³µ…Éô.Ç’08¦…ÓÜãÕqª¶´¡íâ¢åÊúa—n©c鮨 K:¬ógma¦³=L;wØä†M·\4ÿ@~‡…vÿH¦ÎºÎîuš]õ ²C¡:w#Õ8OÂiéímarG{bêÚ^t;B §c…NrLsôì\Ñ1‡–¶ˆE¶„Áö04·E²ä,•(.2ožbà ××*pŠÍ¼9?¾=ÁÿÓéUoøÂÆ–ïãBKŽ™¸Ì°Ô¥qàZ«”®» vvU¡>í½\NšÞ±S?G…9§Þ!í¼¸QŽÑÏÊéçhœúK  Êv~Ÿ(ÇñŽ²á¯Ø}ø;Æàý0ý(%39M”\/[åg2̱3†Z’4üLYÚ¤Ïlu-f·{öWþ¦1ÿlýe“~Ìÿ˜_ÿv¥ÞrƒÍ¯ë^ù–küöX”ùËU§úEðnüòÞç)à’'pSR“É¢H³tÂK¶ ¿Rçm›ê~¦ÑR/ëòMª(/Ã¥qÜiÓ=žiµ^³¦y<ÓÕ¯†ôø(3Èuà-ž ûdû³ä3ÝE#ó2¼ )W-0³´šƒ¹\êÁL¤G©öˆ”<`‰R~P=g¿Õ_…ÀhíMß(WAŽÎev]Z§Õ¥w².Á”ìÈ >Âç Æ¥!–’•ê2»¤l0ìÜø¨Ýø³ô-‚Eyé†IùÔag4FSfyºrIðÔfÏwô•åtÓ*[ÍÓOlv9üá–îš›c^Þ2°ðq'^­¥_þš¤Æ>½çïĸ)_¼4v&;väROè‰1%žø-Â8¹Å «å¬~ãv#u+ŒT7¶D{ÁÎ|³„¿à0^¢dUdÂc”l– ‚Ž¡¬6ƒÓò:3Æž2Qâ=¦Ó Y&ó)²lä ²Æ÷7v|+ütSuӥѫä’Û]êt,3Ã`Ì4eØ|5Äg˜ärØ5¼ÏYN—–5cg76˜ ,óòÈj×Î%]™Õ4‘µæj*0xËrô֓ʾM…/ØŒEÍ»’cšÒ4žðQ¢“ L)åŽb¶í¶5gfxF›Æá.4«¼ìŒ+—Ùä+—ɦݻÉûw«9–Ž1¹ˆßm^8.g†2É7&’d²˜¨E«÷ˆ^êXÅ(¹"O±3°z¥# òk2x¯GÌMÎsx²0sàx™>ßía1|ñÁ²RL"ÿØ.Q= ~?&SzuµƒF éÕ08LE æ˜ÞéÊ4»2ór‰Éì4åç7ÑûÝÛ¶a`I_å"ZCÄd¨ÀD)3ýcÄÇé-å9U)BѶ¬(m[öØ©tVlÎü²Ú³÷Mº.6Ú2esºÊÇÐ<Á©ÍåǬ·ûêoŽõ¬“­VÝäUd?~ñbÖT鬉¯ñìR1Ž)ø ³Hv9tiÕ)å9$É,é›MVó>«$êÓX«S»Ÿ‚•wæ%çcdäd)e?—/JçõiC$.r/à!SóOµ½ý%·oŒôïN¸ÝåcTçòÞW*ŽçöSþ"÷Ô©î"ÿÖ•UIiÞ”Œ2÷áUK+;c®¢fª*½bHöÝLÎ×f²©bjuŽŽ×Ž•­¬U}Âû+>J§°‡Àóå‰I’m§FZk×È)¶ä|MZŠœlKÉ“sm`§c¶Y6qËϾkyÕòîÔa³~lø,¢ú7±ƒÀXÿ¿Y̯ZgÇü¸Í˜—°ˆd8圗UTšøTâÀsî38J^c¸¯•e™9„&¥‚¹.Ïg·dNZ_Ñ?ÑÔËqIæÐÔ>c¬;=+?dwfæÖM^^ÝM3.9ÅX=ã~V¸¬ø01þ9÷+æL&Zy»‹wy«3ª³«m“íš$^›ªMÓ“¼f{¡ýçÆ;Iù4ŸÉg+i%SÉjÊ|¯·:½Ø›mͶú,Æ ^ÃkµÕéFÓÌK/Ëö¡Fqñ¼t»Ýf/öúʲQÁh³ffƒ³  R9ƒur¾^#šSüF-ÍÐ{õôD%c²0#CƒØj‹×B, ŽTMª]V{1µ¹lÈ96Cr×Ï+}ýWÍJœ×¿»¨¬/÷_]”ÀÞTòÄï3ùŠçô˜$¼~xØ­æ×óZdh C®Ü±$•d`Ždã÷¨o’+ßWž‘ŠŸì}W>“¤„äûlŠžIQ¬D5•ÅDý“…”㵤(–%åÄN³Žþ5ö å9+•5‘VªsGq¡ñÂ(!16¥ä¸xÅÓ"^.‰²È¹TÕ"ø 0JŸ‰ˆç=d“øÏbñßkÄaœá¥ÖñÏMâ‰"uÀ?O)³ÃSX ?(§ˆOxî÷ì«QÅËÕùîmUÁþBdwà4ëJðã:"®-W,¤ˆ+qÆEb²”ÓÄ’¢Jqžç¤8׳Vœ“°43¨‚zÏ Õ/e¡6G¬õäˆSk^§Ñ“ˆX­ ˆ“ÆËJT÷Jkf‰nt=.Nl-íh’ÈÅâu7ò7ð×ñ•¼÷ò.ÞÉçò9¼Q›®Õ㯇N›¬Õj5ZV‹y«5Fãd·rܽ4¬Ò³*®§JO÷%ZŠ©…_Cw„ÉžÌþ€9^c¨® ^£ëïÝ×zrÂ÷6Îk ?Ó.SxN{cاkCäcr1") iù8Ô¢òmÁövscxVs[”|ZEÁr¬…áGÈÀšÃ׫ó@!²‚CЪœ‡V@¡2¦l…ª¶#¡æÁYP-¨Em<ªš‡Ž¨j¯+jƒ…¡à`a¡ªÂ•À€ª2À•(*ðÄʽ848èñ¨ZÉaâU×íM«å¨•—£JM¹¢2XVŽ ƒåeªØóƒ¸(!nIˆ[TñÂÄ% ñÁ„ø ŠÝÿGO÷´ÿÞ‘…m; TÏŽP7¾á]ý=æðÖ%’4¸í¡ñ²ÚÕ±¤«GÝá‡ÝÁð6GP\xàâŠx¡#8B­mƒäî`d¡¼P-ºlßÓú‰­ßÛêÛsÉö(“õ)¶¶‡®!)â튭b+¤ØÚ.oWm)¾…–Ï›¶îÏú›o^¼nÝbø/ÒX­– endstream endobj 372 0 obj 4373 endobj 373 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 8 -12 699 682 ] /FontName /NTHLZO+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 371 0 R >> endobj 374 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 722 722 250 722 500 500 722 722 722 722 722 722 722 722 722 722 722 564 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 500 278 722 722 722 722 722 722 722 722 722 722 278 722 722 722 ] endobj 122 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NTHLZO+Times-Roman /FontDescriptor 373 0 R /Widths 374 0 R /FirstChar 32 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 375 0 obj << /Length 376 0 R /Length1 6744 /Filter /FlateDecode >> stream xÚ­X xו>÷ÎŒF²^#ÙzX–<’G²„eI`¿å‡0Ø11›`bcL @j^’€±ŸÛöö$´B'L¢×g£¥ß…}(÷9Ø¡ n&ïcÏ@?¼Šr>ˆÁƒ`ÅúÕ0ˆíó¡e¿†2¸¶Á18o¡îBh‡¥pŠŽ¥^‡9ð\ ?b™Ô(j C)l€½p0uBû&œ w‰Ü–š‚.|7 ]ß‚€_¤^Çqñ¡ØX…’‹±§cDCrI” ¡·  =³¡ {Z†-Ž5mJ `«L((ÔÁè@»wÀ=p-{ Þ&+éff,Õ˜z!õsy~`û|´¢£v- ÀfìáAx&à/d5¤¼©GS©WR¿WâÇ DlS -¨· n‚ƒ¨7#þ%¼ï$|Ht¤’Ô‘62D"¯7hŒ 1û˜qVàÄÔŸÁ‰žñãh Ðê2¨D»WÀЃ=€ÀÚø1|NìÄKJH#y”ºè,º†n¤§èïY†a'S+–PŒžœ‹–×À5ø.E¿ma´hîÅØ=€–= 'á,Fæ=œ¿Ë„#}¿ ¯Ã;Øÿ'ð)Ú0áÏp¦Ñ ðµ'¾>B¯Õ`TÛÈb2Hv‘ÝdÙK¢‡Éqr‚ü =ÙD;hÝI÷ÓÓ×èô×ô#ú)ý£a\Œ}|†mb—³G8w#·ƒÛÍU•N_L–%¯O®L&ϧø”!ULíL=’J`Tÿ xR F°„ bT¯Eø¶áLë‚UЋëùfŒÍVôæƒèÏï⟂#§á\úŽî5Œú;ð!ŽìOðLC7ýœó¹€ሚpDKÈRÒAV•äF²†ô“[Év²Ç8‚ïAò-å£ä(9F^"“‹äs /GuÔDÝ´#ÓD—âÛƒó`ÝA÷ÑoÓûé!ú=úýG§ÇéYôÆïh’Ñ2ÆÇ”ác®a1=Ì­ÌAæ1æ ææs™b.3ÓÌ4[–³×²;ØûØŸ²oãûÎÄE¸yÜRn5w3w 7ÌÝÏqãÜ;ܪRUœ—øvþN~?ÿ ?ÀËð\i_}^ËÿyWû.b5dî72%8Wã΂§F´hÎìH8T,˜ðçû¼RžÇ-溜9Žl»ÍjÉÊ4›£A¯ÓfhÔ¼ŠcJ 0&ÍïvÇó»ãl¾´`AH¦¥¬èùJEwÜUó¿.ww+bî¯KFQrÍ‘Œ¦%£W%‰à®‚ªP¡;&¹ãç%w‚,_ÜåR§;>¥”[•2›¯z$<láŽÙûÝqÒíŽÅçöǺQßDõØï>É„ÉZ=¦•5Ç¡¡gg¿A–ˆÅRc,ž-5*<ÆëYo[ÜkÌñx:C…qÒÐ+­ŠƒT7gš+šã|C\Õ€ªÝkåÀˆûXáÉá{¬êêVK«{VtÄ™žN¹ S0n“ã¶í“ö/É+¥Ø=3̧¾ù=}ÃóÑ5# Òd·Lõ܃TËunÔI‡:;âd»eseÓÓƒè“brM÷:w\#ÕKýÃëºÑçŽá8´oóŒ;щl1÷ð’ɯ͑:{Dz`¸}ÛsÙQwö×9¡Â û®Jºl"Tª“±Òcß•ÆßîI׿~R«Èz±¥ýª×ˆlˆ´Gw÷ºÑ€ ‡2OÎúæÁpï<ç“ ÖÆ5 ÝÃB…ìSÎ'HîáK€a”¦>ýzMÏLÊ'\¹(ûê„Aþ•r<Œ`Ì1>}&4­F©˜*ŒçH›w<]mèǞΊúÝã‘C6’ˆÂ*$â»w¤i7¬Ê‡h$اÝ2çäŽe©ÌÙ}…sµy·„³ñ¸òAd‰«ó¯þŒ‚53Ö_'Öÿ…ݧðÊë]%á7|êÕG5,N£$A ¢™ *>F [M™Çvj’d=؃ÂŪéªE˜·NWAm•0$fsfK&É)SU𸢂›÷×Ó æôeùƒHê³ÔÛÌö僽рڠ¶Æ,OYY«Ãæ²Z Y.‹^“ã00–Qù4Žœ·Y¯7øäõ¨C´Z¨& j¸jº+/[Ÿ0z}~ÆúíÁ PE"Áª p’,ºØ:= µShÐÔ>C8¸S8&syyÐd+7•ÛA˜"ÂÉt>g6é*ÅIeɲY‹‹ÊJËð”œ[’ïŸë±Ϩx•”—?·¤´xW1µXÄÙÙBátºÊUTÝ^íx£¤ríño~cÞ¬éâµhffìMÌ£Áò!ãñh#]Óš‰ŽG¾-©ÀlÄÝ”Çq;á‘hïœo[¦]fÛ¯¹Ïö¸íe§:ªÜs³nDGu ºö¸VÛlÎÀB´$ª~Ü£Ñp:½Z£Éd3gš¹&–Ë àpå¨3Íf·™Ët›YŽu8e]¹®È¹«î¸ÀsA!CítU­zZ]%{¢uØ®ˆüÉÓÒŒs§&R83/M/“Ké¹Ù•áÌ>A½ó”[Ë™ ¾RÄHÝŠŸóÅéËÏ­!e5¤ØÆ|esæô¤¶Nc˜øyÆI¢”)^R¾Î¥Ùª¢_üû÷ƒMdKó®äåýR®Ç:KŒöÖ4–Ûª=]+Ø4&M¡™zx#G——ôÚuL^Ûñ^ò¥; rš,ßX_·%|ÏõÉ{•øúR3o2wC”˜¢OrþÜÚ€ßWQžU:k]õwüOù'ügü/WþÊÿFù[•F¶š­ñ;K«æV7Õvj—UoÉÝg¾×¢Õ–jÊìÄZÍFýî@SÀU¨%Õ³vc†¤m1庈YUî5•Q¿'°0PŸ[\T$šs]¹µ&s4*â=•”—Y|#äm(Ô6ºV»öº—7·1wUîÞ\6·©Þ•+äæÖgêÔEÏÙåŸhvFp[;%pƒ§»NwÙ¯†qêJ OÂ-Åœ â ® sv‡>9êJÉ%ÁqZ8 »ÚìÙsÒ‘ÊTB#áÂÂ`Õ«Á…V\$©xÆ@pa´®î:eWZð*·#ߘ•÷ÌÖÙ ueîçTth{ûè@¡»:C½‡Í0ŽÆVWûìö–¼ZŽÝ•ÁÛ\- ±¹ÕõtÝ"O¦ËÃмŒ ÞÏrÉö7Gr¶¸y†-d¢A­V£³ ¬ÉÕÌV©¢:Éäs=>Ÿ3Z­wÖ×Eν%¼u]qœGˆÈYØqÞ!/©pX&Ò¡©½4]‹L𜀯Æ\”ãÇ•w?ÀX¡¿ÓAð3×N„âÒ “«‘+Ê´ÚpÙYm™¥fy»Ä(EH˜È'E‘ÕÂE‡Ú—tÈÖª¸Êd£á TÇyK¤Vg×Ïj ­Ì“2änV§Ö¨HkÉÔFQŸ)…}ôÄpë-·Þò¬¹„nœîP¡çþtݱº¶êâ… {ò7¿B7¨µ:ÝtHC4êõ•ù^C¶Á¥-Ù%•Ê›¾ ûtOÝh¬ºDˆZ¡ON|±í ¦¦Roã‰_ÿ ¹úoŠü/$± †äcÉ#j‡(MøÊýBÅþ&5ÅH}ÆÞ™àd|Ü2w÷R'%ÔËè˜flPám_ë0Qð-à?"!M óLÏ*ùÞ±¬­½¡¹>¸d톾ÛB 7÷¬_Û;ó¯Nê3L}Ð÷7o<*L!¼ë/Â;år€Ó‡‰ª@¤÷·•‹ z_4ˆ8ªåéá…c éØÀØ=A÷ à~'‚6Aï@Às|7‚&A¿‰ NÐ]|‚îDP%èí\‚î@`t;“ ÛИ­ø ¶t0jD$„€†Èku´.‹V“[`èÉ:%¿AɯSò,%”œ=¾I¿q“¾.ƒüú‘~EÉ{•<3jè×ÿ¾_?Ù¯¥_ÿ/ýúI?´"Ã¥ä\4«U¾UoÕ·ê«ZõE­ú‚VYÕ¡ù“JîQòܨ­Yÿy³þÍfýkÍú±f}o³¾¤YïkÖ'È¿FMCúw†ôO éó‡ôÒÞ5„µÏ7¶Asï¨-¨àÂx[¡øcò¸q”"ùçq÷ ±.›œ„ V¦_œÁ |ˆñ(,Qðð«åúîñ¶¹b‚¬o«FX1Þ¶aùxÛJ„Îñ¶UØÅõЦ4Y2îžëL¤ÜŠÊE3]´Â•ñÄgŒ‹7aëÆñ†Ub†ÔAƒ"Vƒ=/Ctʆ×é‰eFiÆB&™¯?.ž§*dÙ¸ø1êñ‹,I°d\|ÏŸ ÏDµâ»þIñ\Û½âÙ¶ÅêŸ.Áêqñ'~lò¼ø¬øˆø¤_©yܯ(9œ{ØP#<–¾? ¨¼/ ‡ž¿í?/î’»Dí;QÁöÀyñ–¥ï i¸)€­‘»&0)®ïÛýJûkÝ ÷š%Jß +΋MEÿ|4KmV x‡Ð©3ÔjµJͪ)®‹¬Dêýh¼Ãd©T¬œ³JY rNÓ[%j Íuv: jºÓ]˜öbºÓnL»0ÝŽi;¦­˜1 §ÞNn=A‡éíÇ…tñvº}¦r;½k¦tÝ:SÚJ•.âçä>Ç›$5'âªýx5Œ“ƒ9q¼xì´[­ƒµöZs©|~ãßȺgòà—ýïnüêCZÚ¶ý§éïÐõ"ù‰’{ž_åÅ#¼"Ñr Œ*£ŠÀ¨,0ú*?:#`wÅh¹®#þ´«3^$R®Î–xXþa‚ÖÒêXã­‘¡³cÞ¥µ±v¹ÞmìD±åŠîÚµ(2 yDY yZëM‹¹i,Ö&ŠÑ-àVÄÜt‹"6)‹¨ˆ5«¨PDØ`@`_øŠÈÈ×EF‘‘‘EÄïG‘¿,r,ÏÇüy Ûû%{IšN³Ã »ìKv ÍnJ³›ü|úêÿéØÚëê­P[kWnˆ¼.®’êã¼ô?é¸mæÁ"ÀÿÒR endstream endobj 376 0 obj 4870 endobj 377 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /VPRCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 375 0 R >> endobj 378 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 667 ] endobj 61 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Italic /FontDescriptor 377 0 R /Widths 378 0 R /FirstChar 74 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 379 0 obj << /Length 380 0 R /Length1 3580 /Filter /FlateDecode >> stream xÚÕ–}x•eÇ¿÷}?ÏsnŒ³L‚¹a"Á‚1!CÎ`!ј07ƒ«;2@&ˈ&-R2BâÒ"Ùb(#L¸ —‘ R‹È(gýîïŽþauõ_×Õóœûóü^î—ßý~ $£¡Uåa ƃbi“4kÁÊåYKg68€Êt¯Êð¢ªòôp0#Ä߸hImey~K’è¯Kž¢Å Ë+Þ¸~ñz±’ßT'E‰>`qÕòU=ÿ®V‰^!z¯%Õ Êñ´J}•¢ª|UØŸ¬ýѳ––W-¡Í·‡-|Ÿ±Fñ’´èÊ×Ú^’5¸R4k³šméÅD Öc„¶†ïaŠÈ»Xær'ù]Ö¹w ¿CùyÚ¿ÍÖ·Óò\¢¾ç䎵š­ÏZ ¾ÅrÛP(ü¦Ì‰A3Kƒ­m¥ü Ùd×1¾ŽÏ·Ðò5r3kØDïÓäSlóIzŸ•lðUæi¤w#áœ>Î<ÈÇp‡eçe‰m=-’ëkgîÍÊFn‹µìOs4pÞÖ²?õ2~íâ©§§ÅS‡5ÒªKÚ^ƒ¯ @lÖc„vD¬ÅîV[ò!rµœ6×ê.í<È\µ´¬" W²×+ »öu –a‚”¬éÒXÒZŒÜÿaÎþýô„QÍÙsöÃŒ­Kq»Øª9ûÕŒÍZ ¾Ì2‹ÉEäBryYJÎ#ç’÷ÊÍc÷ú½ÔJçÊÅäÉÙäÈYäLÎÔ ÊÓÉ»ÉiäçÉ©ärRçï$Òϲþ‰´qG§<Ž,$CìÍXÊw‘cÈr4y'9JJYsVIŽ óÈád®Ø †QJ~ŠÌ!‡ÈÿT#ÿº­üIryJ®|­6+ôvÊÙäôö—ÃÈ=²E¤=KÆÈÈÿ5›ÿVZ2(÷#ûv­ƒO}Øö-Ì•Nö&oN0 £Ó ©Ò¢+_kë)÷ÐÑz²Å´„/»ÑÊFÊÄI[¶wW -ÝÉd2‰¼‰ìFúIò…žœ®¼£À;Š÷‘[.ƒ´5+Æ_&½/kÔþ¤¤g%E%”äƒRS×5ªšÁÿ“ƒÿèÀè= endstream endobj 380 0 obj 1970 endobj 381 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 379 0 R >> endobj 382 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 549 ] endobj 108 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 381 0 R /Widths 382 0 R /FirstChar 32 /LastChar 62 /Encoding /MacRomanEncoding >> endobj 383 0 obj << /Length 384 0 R /Length1 6316 /Filter /FlateDecode >> stream xÚ­X tTE–¾Uï½~ÝIºûu'én’î¼î¼$ݤóŸŸÎOH† A‚ !þ$&ü …&ÂéñEÑqgu‰<"2ƒ(+Y!þîèñow¢ãA£3.8ãHº÷¾—€ºÇÝ3sξꪯnÝ[·nÝ[UïU€(è|íëÛº NbËÌËÛ{69ßú`ë’À•®ìZµ~ñ™±‡¦ €‘W­ÛºòÞäûïˆpb›¯³£mÅ7—a¡ûçwbƒáLT)Ò"Ô¹~Ó–˜nèDú¤cÖmhocæ°!¤/*V¬oÛÒ¥­  ýÒÎ[ÚÖw ï~hé«H'wmظ)ü)1˜’Nëêîèzû›Í<Òõül# ÌG™‘!6BÊTËßûPµd~–Ç¢6až qÜBˆfÖC@ø}ÌŸcþshI8ÄåAzèpø?;Êÿz*O>.8 ÷Á˰v`ý‚Ra6ŽõÔA3ŒdáøÃ”ûlP kÉ'8Æ3è³×Q.üp,ؾz° T¢ìóðÀM°ŽÁ9xu§A,„:~²áA¸H~Ë2ájÊ€|X»aø¤C jê…;‰D6†Ç¡Óz´ëWðOðvøMœªÅ(¹G:Ft$øHz×Ú“õ8Ò"ìqœhiu¸{ECø æ@Ú½hÙxŸ,£›˜ÁpUøTøwÊzÀþ)hE!ÔÀ Ð ›p„p†á;²ˆÂIáÇÃÃáWÃ_«QáÀ"ö)ZÔÛ«`?ê âŒïcƒÏH™EÊI=é#’WÉ[ÔϤ3{˜!VàÄð_ÁŽžqãlRÑꘅv/…›¡ GÞÿ ƒhã%ø–ØHÉ#Uäqê ÓéJºŽÐ¯Y†`Ç—TK(F‚GOÎ@ËKa¦…è·ÍÐà^ŒÝhÙSpÎcd>†qø®ŽðDK<$µÏEû~O>¢j¡­ 3^¦”ÙÀ¾ÁŽqþÐþÐ7á¦psøÖðIœýG8–2sÅO7Á2´xν£½c§¤]˜öÂcð$<+ì(¼ˆ#ŸÅ±_‡7áCÿ øm‡ËðW¸ hE0Å;¦d’Ž^+Ũ֓¤‡ì$½dÙMö£‡Èqr’¼†ž¬¦M´…î {é ô úý€~N¿¤atŒƒq¡Ï±Õìögànæ¶s½ÜQMþÄåPAhqhY¨'4æÃ†pj¸'¼#üh8ˆQý“êI-Á FÄ‹Qó1ÕãJkåÐ+a-Æf zóúóaœáÓpãô[\K¯áìÞÀ¨ŸáÌþßÄpó³èçi¸žSIΨgÔH’&²”,#7“•¤“ÜJ¶‘í8ÇLûɯp–“£ä9C.‘Ëä[ /G£¨‰:iF¦š.ÄÔ†ë`=ÝN÷Ð{èýô }Œ>Iÿ…Êô8=ÞøŠ†˜HÆÀ$3˜üÌÓÆÜÊìg~Ã<É<Ã\`.2ãÌUf‚™`óØBöv;{û2û>¦?q&.“›É-äVpk¹[¸~î~nâ>ä¾×äkd^âø;ø½ü~…Wà!Üi?~NAìß}²= ÏÒQê‡Oà ôÀ.:÷N6yêÙ%0‚§þ>@^ÕU íä(Xð¬£\-80Û˜¸¯!üÌã˜/…*ðD^èTø]&µ¯ ¿Ëõb ûqÇ›qGŒÂ笎ÌÇóãf&×ï TìTÌULŸœD‡äWZZ×8eT!uö¯iEŸÇõËаÕ5çã‹Íïìol’\rY¼ÔÜVe?ý [Ÿ›æsNû)'=mضs– ]6œ^ž^®à,—mç$þq×dû›§#U¹‘Ok®{(†Hsq²³Ý‰4I8•™JÑ1úÛg¢>ͰZÖU¶ö EŠO¹dArö_ £4þåO[Ú¦Z4ÉÂPªJ°¯/ä_«Ë^¯œšŠ1Çøt`˜Ð´RµaFzZ/u N9]õèǶæ¢Lô»Ë¥„l èƒåHȽ š&i',_¦·Y¦­ çô5NìB…Ó{s½{«„«ñ¸ú+kS®ÿŒ‚%ÚßY$ËÿÁîPù@•ý®‘ð›GyëUøt,ïNã§$HS}Ñ ÞO`š–2~ŽmÖ…†É:°y…ËÅÅ󱬛(†²baI,²³$“Ë䯭É~_ÄÍüÛÙ söêLP¿Þ6à©ÂãXvxÔÏÛg[E.²îÕÝg}ÂúŠ]ëÓ?áZ5E£‚tõñÈÈsV|y>í.Ž‹Òkuºh8s´™«f¹ qŽxm´Ùì4sÑN3˱'°¬#"Á‘yÁ+“Lo±W¸Ès^Á›‘eÅeÚ m±É\XX˜922B„‹™q%ãq¶ËBÏÅLÛå–¸’‰8[vi)ÈÇD5¼;ÚŸ òR¼„hxMlŒÅëÚ~Sré42ýË;¤…lå’$náÎîÐX§«Y7!»øh×R¶°ú8Of…†¸êe-W9WœÛZŒoRÕöðçÌQ<{3Iµï˜¤$!Éž'äÙ¹h{­µÅº-q[Ò]‰w%rtL<˜tÄqÄu$ñHÒIÇI×ÉÄ“I¯[ÎYÏÙÎ;λÎ'žO:—üNê;ÞOS?õ~'9u±ÛééÞ ÛfÄ ‚ ËLÃf¥$[ü4Éf´ŠVj5Y$«¶‹tzxI[«'F½Í#%‰év“`O'RR¶Ñ$ æ Á˜ËH4£‚Œx“ÀZõ`³j2=!¸#Õ¦ì,£‰‡ÿô91™­…P6^æUÖF™ÉZ¸‡Ëðv#{´6µB” àÍ…¦ÂB¯Ò`áʸ÷*¹Â8N·L‚pn Ý1¢ÅÞJ!h¯U1R·âgm.~ßÌÈKág”’‚R’keTÒ=Ãk œÙ’›ƒ±´ˆ”˜âÎ nž±er ×8t[4ôûÿüµ·šl®Ùºº·JJpY¦‹¾öòÔªBk‰«e){JgÒ¥™©‹7r4.âꢡýI¶(&1‘mú8tæöÔøêØ_¬+ßœq÷âªÐ½j|“טw˜»ÀGL¾§8wB™Ç\T“?}MÉCî§ÝÃîsîWf½ç~«ðÝYF¶„-uÛó‹g”T—5G.*Ùœ°Ç|oldd¾®ÀF,%¬ÏíôT{i‘¤ÄeŽÜ!EÖssĬ)L2=>·Ë3×S‘›“#š e&³Ï'šÑŽÂ‹‘÷a„’*Ó"«+»Œ#)¡*ayÂî6¡ºÂ‘ $$TD*æ”gö\°)›pÓìÈÄí="p=g[ζخ‡qüZ GFö0ŠSAìÁtÁ§„O‰ºArEˆ;+\•]‡ì¬ìÉHE«¡‘pca°ÊˆÅÊàFËÍQ> 4ïöyu­ú®x{NVŽ‹xÑlÍFƒÑh°gåp±ÔËÇJ–ZOƒ¤ÄgÑä#'ÞîÈÊá3,…–"—'cVQæïŽ¢#'·ÉÄXÙå‰2¥.ð¯W‹ ž×ÆÆ)çEçXD¼•åæ˜gäQ\¿ªï’ ò­ØŒ¾Cßd’ t‘"ƒ^šrÝ OÊ´”XƒÆ¨Ë~¯VÊ^pƒÆ!Sì´jŸàYÝe1 ^'§ôK6 ¬xlõô²ÐÛÑæŽ#̬™dNïñ^†uåQfl´å+yÙpÉ¥Ó¦%‹©³ª×Ž?øíÏçxÕõ®>ÿµÕwìfcñB´*}zøû­×Pñ ¾aðkt×oëÊ¿ ŠB¿ ÑÆiÒð¾}ÏrìÂãìFØÀì;^Í“™}áóÊÿ$OÑãTuqx«ÔÀÌo¬ä📑&ê(æ©5Ê÷í¼Ê•5ÞÆÕë;6¦ÏÝÔ¶nuûÔá?cŸý²æ0àÝe,}>B¢ðÂ,Òû‡ê Å ½ÏçE h<=4wp.ì ‡º ÐAq°ˆÑAç`==äCîFÐé.|=Þ¤·#à;²A¤¿DÐéN>Hw h‚ô6.H·#°Aº Ò­hÌ|ÏoF€ íñ ! #ÊåMë+¡%äè=Y£–7©åj£–‚Z²Ç»ôºôåäwЉô«jÙ®–Ñ>C§þëNýX§þÕNý¿uê_$P‡ ‡Zr¾˜:ýh^®Ó÷×é‹ëô9uúÔ:EÕ7Pƒü1µt©e‚ÏZ£ÿ¶FÿNþý`¾½FŸW£O®ÑÉ¿ûL}úûôO÷éSúôRŸÞч­Ï7ÖAwïAµ¨àâP}šø9Nœ¥HþuÈyR,ŸFNC«Ð/Ná0ˆ*ž€J’ŒxU|ÜZ¥½u¨~†$ˆêK–Õ/AX2T¿ ¡y¨~9±êÕ.CÎ1±ÜDÀ©ªœ?5D Pç!>ƒ8gH\…½«†*—‹å:R•ªX)޼Ñ®^®'±SjLS0+|ýqqT/ ’ECâ%Ô“<$~ÚdÉø±;HŸñEйÇÄ õ÷Šç냛_nÄæ!ñ%7v9!>+>*>åV[žp«JMŠ=â j˜”¾ß£ª¼Ï$Oˆ÷¸GÅʨ}*Øæo©TÇ^? «<ع+=cârñv±Á­ö¿Á©rç5ªcÏ-«=ªþÙh9!ú£b…GØ'ªŒ²Iª`Rmþ$•+ªÚ²ÔÆÌÉ™¤ãÓUÛ½hf²Ï(&‰Ý¢«r•¸PÔ‰ºÀI² ?td§¯<ÆzùÀF>°–¬á‹øÀ>0“dðD>ÀÇhÍZAkÐFi#´Z­FËj)`ø_ªrºÄh4¬R²j] JI'8J´jÊm´´t/æ;1ïÆ|æ^Ì;1߆yæ-˜{0÷‡?yNé=LûémÇ…ÉêmtÛTã6zçTíNºeª¶…ö¨5ÜÄÏ)c"Õ”á>™ì“5{ñú!“ýñ2^nö7Û,–ž2[™¹ÔT8»êgŠÖ©ÒûÃcû‡;xüÚú­/á2ý ]/’—ÔòØ ^|ðªDí(Pª@@¼Î¦lùÚ›äÃŽf9G©„͵r†rO¦e´Ä_5LKhn†h™¿Ai‡ªšQl‰*†§vŠA‘(Fƒ¨ˆ¡1‡U±öI1'-UÄê@1ºœª˜“nVÅÆ±cÝEþªcEEª{ ºU‘nöÔD~*2 Š L‰Ä«"n7ŠTº‘c‰n8æNTÙI?°'Ù“ì •]ðÛ3É®ždW#ÛûÿøtTü#ÒþÕ7VX ¬Ì¦Þ¾ø(Y#Uȼô¿éØ8õ`à¿xLQ endstream endobj 384 0 obj 4541 endobj 385 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -26 -208 768 682 ] /FontName /LCQCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 383 0 R >> endobj 386 0 obj [ 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 611 611 500 611 611 611 611 611 611 611 611 611 611 444 ] endobj 88 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Times-Italic /FontDescriptor 385 0 R /Widths 386 0 R /FirstChar 84 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 387 0 obj << /Length 388 0 R /Length1 5800 /Filter /FlateDecode >> stream xÚ­W tUšþï­ª®î$թΫ;¦ªSIºMçÁ#òè4„`À€ &„@@"1`xI…&Âé8(8"E›e:‹(#ì("êèx8¾v':®=àèHºö¯êaÎìžõœ­ê{¿ûßÿ¿ÿý·nß â`;0àkïjë†~Êà÷°L‡4n!$2] Çò)–¯Ã‹µ0Wùá§µÿ`2PþWÑy\ð4Ü/Á&Ø†í» È…Y¨õIh€%>˜ˆ= »Pî[p@-ÜB>Â9žNxå²Áû ûW@/ŽÏj”ýWxŠá&Ø Gà4¼ƒºó`,„StH{&ÁCpŽü†e´j*€iÐ;a¯vò¡5m‡»‰BÖkc°ß.´ëçðOðíMô‹‡ÃÆ2”œ3!2øH?FÕ "Ú3q¦E8b˜˜i­Öƒ£¡|P³¡íÞ ÷Â~´ì$œ'ËèfH«ÑŽk¿×׎ÏA+J0;×ClÀöÁQïÉ"jÕ²´Ç´íeí+#O8AÂ1åPz—Â*Ø‹zCèñ»pßQø„Ä‘¤Š4’~òy™¼EýL>³‹ ²"'ißAFÆÞä¢ÕÅ0í^7Cμþ†ÐÆÏà[â Y¤ˆÔǨ“^GWÒuôýŠeØAvTṵ̂„b&xŒäT´¼æâ»ã¶Т܇¹{-{NÀÌ̇0ßÃ%ž˜‰‡¢ö9hß»äj¥)T¡3里—©`Ö±o°£œ?¼7üÖ¬µh·iÇÐûp.Ýs=N7Á2´xúÞ‹ÙîÃÜéï|wãð<…+ì0¼€3¿‚s¿oÂû8ÿçðÚ0à;¸ãhEñM&øf“|ŒZfµ‘Ì'½¤l';ÈN²m<@†É1ò*F²–6Ó¥tÝMŸ§oзè{ôSúý+caœŒ c|š­e³‡8+w3·•ÛÎ6M¿.ß^î ŸÕxͪåj½Ú6í ¬þň¤âÁ fÄ‹Y‹_ê<\Oó1»Ë¡VÂ-˜›MÍ}χÑçàæé7¸–^EïÞÀ¬¿Ÿ g…`ÂøÑ³çT\Ϲd2zT‹5‘…¤™,!ËÈÍd%é$·‘-d+ú8ˆï^òsôò1r˜!'ÉgäùÓËÑ8j£2ÍÃÌÔÒ…ø¶á:è¢[é.ú úÝO¥OС*¦g0_Ò0ËX™l¦_?3—™Ç´1·1{™_3O0Ï0¯1ç˜1æ3ÎŒ³El {=»•½Ÿ}‰=ï_8WÈMçr+¸[¸[¹înˆ rïs?˜¦™T^áðwñ»ù}ü„ßÁ/ñK»ú9ÉÿçÝëax–ž¥~ø>Çì ÓñÛ™Dž…Fv1œÂÝ'ƒþ>H^Å•Uíä0¤à^G¹zpbq0ûð»íOXư|ž‰û òÂǵw˜ ¨}ö·s8€_|~gáSÖBæáþq3S„ëwî,|“'M,,ÈÏóæ^çqçdg)™.YšàÌHOKuØS’“lb¼Uˆ‹±˜yÇ2”@ž_™Õ*«9­*›£Ìž¯ÓJv´]ÕÑªÊØ5ëZUn5Ääk%}(¹òï$}IßI"ÊeP–Ÿ'ûY=[£È!²x~3¶÷Ô(-²:f´Œ6›c.ŽýŽÎY%­²_ÕÛ9ào­A}#åC_~“Ÿ#¶”ò¡X]³ ÕmÛ:º„_MSjüjªRcð˜lÛ µq~³¿&ÝåjÉÏSIu»²\e¦ï74«|µjªFÕòjÝ”ä¸7$ÂòVoÜ eEÛ’f•ikѧ°yU»R£Ú·Œ:~$/·ü÷F™#S¥Ù³Ú:fahgGÈVj»©údÔIû[šUÒŠeÝ\ÝôˆŠ_ïi]#«e¦Ò9°¦cž6 Â‚Í®`ZšoDÃ?6¿<ÐÔ¬¸ÔÊt¥¥­&ãH ,Øü\ªON½–“Ÿ7âè›áÂäWåWé8Ãåè‹àŸwDúß<kÈú±~Á•¨Ýez¡Êí2Ь +Óõªc: ´OG1|Zaµj©nKõ˜rÙ¢"\L£2öŵ=mÑS¶xô¦žì+ ù—۪׫ææbÎ1?˜&4­Â蘚Ÿ×«¦+Ý¢¬¦c¨ ãØÖRZˆqw¹ô” †|° uûüæ-Ãòô ø ½-*mÕ9'.s’êœí—9W†·*¸‡ƒO²jιò‹Sý¥*Iù_بþ½›<óèÿz3}–÷gòS¢¹¾D†ï'j¦ŒŸc[,á²^ñBÙxÙ<¬ÆË ²LG«I›ËæÆ’hšú¡”›þ·WBÌ+—¦ë;ѾÖÎ3c8W6ìôyÌVsŠ?ù©6%ÍîLI¶&9“Kzš•IöS¶%-=]Nkvˆ¼éK“R’©Å#Y¸rÚ—™*äx¬¢ äĬýÄáõŠe¤Ð[æOyÆG¡r Ûe-ðnO-¡¤Äk³—ØJ ŽñD¤ž4‘,†;’)9Éž2erñ´bü—œZ”ãžêJ¶ž1ñ&%3gjÑ´)}Shr²41UL"\\ÜŒåÔ¼ <í­¢«‡vûôëÆ§äš%«71Ñã¨e󖤻ó—+¶pé¸e¤ùàí¾¢RÌÀ:ÜMyô;úÒùŒYöE±‹ì»-÷Û·ÿ.ÃìwÝ7GãBtõpll]B 6|E>óã.‹…‹ÌK" \BbWËr1ÒœéæÄ„9K”XŽuz8‘e1œ…¯] Ç9žóŠÞ‚¨/«4›ËôH”ž:uŠˆç ÓÊÇÒÄÞs…Ž KÓÊÇÓzD0 ˆLïNt1îâ¢/!‰ä¤{²këMÙ©äº/êP²Õ‹³¸…}=áÑÎR·v\uñ‰®%lIí0Of„ƒ\í²¥—8WšÛ^†'ãÄž¡}ÊÆÿœBRë{#)+KÌÊ(‹2¸ÄŒzûRû–Ì-Y÷dÞ“uÀ¹ßµ?sÖ!ç!סÌCYÇœÇ\Ç2e½žrÚ~ÚqÆyÆu&óLÖéì·sßö~œû±÷{E¶($#ÙŸï-pD± ]mXZ£X¯d9ÒSG¼]²S»-E±›»I§‡WÌõ‰%KÊ/Ȱ‰ùDÉšoÅ b|A:~>R*(H·‰¬]‡ÝTè©ØktMš/âŸÞksbK°—èËÏ«•¸èvq^+®Â]æ‡Ñ zð§/Ë\“¸4‘•yqÌ{‰\Œ¬Í¥OïÍÛN™q´^‰æËMÌÔmxœŸY±üÔ R\A¦Ø™«0—YÔv+Áeì. nžÉ >ÊLi*Yã´l2ÑþóWÞZ²±®/|iw2Á•räk¯Ê­)±—»–.a[l–¼êâã9šsiQpo–#ŽÉÌd›? Ÿ¼37½6ùöµU î½±&|Ÿ‘_ã™7üñÍñe 1ô‰‘6_FmL;; ž:Àr嶦ß2!Œ 3„>dN3¥Úž«Î5,û'mŒÙ£}Í®‡uÌÐo^Ó HŠhVt^o&Xƒ…â­E„ÉxKü”<„41$¢³™ô3άš¦êº™Þ¦Õ]ëóçlh[»º=zSÔ¾ÆÒÿðtÅbÉÇ{Þ6Ÿ§8¼4Iô`c‰¢÷û¼ˆS€§æ Í¡C=Cƒô@ÏA:$ •ÒÒR:$5ÒòF¢çJ‹¤ä ÖJI!:€¢÷ $„èn[ˆîBCôn„øíG°†èN!Dw àVqBlˆÞ‰€ûÅvKˆþ Á¢}|ˆnC0…è\ˆnE`Ct ¢›ИM¸×oD€íõÅ#BÀBô¼ÙW•DËÉ­Ð Þàõú&£¾Á¨“ŒZ4jv¸[X×-TÅßã½P /u»Q'ú¬ÂWÂh§ðr§ðï ¤/Åq5çKjÎ6jƒ0Ð ”5“„Ü]Õ7xyȨQ»Œz‚Ï^'|['¼]'¼Q' Õ íuBQ]'„È}¶~áý~á©~!§_Púg?ö>;_–cx®Gç‚yÒóä$Èè¥D~”IU©ä”²:ýBG@2ð(T“lÄÃÐdà3à6ëý­ÁÆ©Rˆ, 6–#, 6.FXl\†Ðl\ŽSÜƦ <*UÙÈ •ó¢S4À Õq.â3ˆ³ƒÒ*]¬^.UYHTb8ó"Ä Ýð*$GÕØ¢Z±è|aX:+•†È¢ ôêÉJ7…X”>t‡è3¾Xé÷¨ôZã}Ò™ÆÅî—š°;(½èÆ!G¥g¥ƒÒ“n£çq·¡ä@Dì9dFx0"ý€ÇPy¿'Dö•~á>+õéS¢öm¨`‹ç¬tkµ1wWVyp4rWzF¥åÒÒ·1þzÙàÎm2æžSzVªõúg¡ ä¨ä—ÏJ3=ÆÄ>É`TF¨âˆÚijŠdh›4htF<ÉGóš Û½hf¶/^Ê’z$Wõ*i¡d‘,cdv¤ÏWÂåÛùÀz>p XÃñÙ|`:(à™|`ŸdN0‹xV‰3ǘÍf“™5Sü.’BÚG¾\}wI2‰:˜X½f¶HõšF¶'JÌêªtÌt7–»±ìÄr–íXú°Üe –MXz± h=§¡ôŽa1Ò¼ƒn‰vn¡wG[wÓMÑÖ&Úk´ð#~NŸ1X"Z¿Jö¨¦ÝxUÉÞt¸{[))½•ŽÊ„ [ɬšPµFkïã'ð^ýúÆÍ/â2ýC/‘úÈQ^z—ñ†Dý (0†@@¼Î¢§ú`ý ÍêÓÎu²ÞМ-õj~W¡•´Ü_3B+thih¥ÞÔ´ ØbC wíJƒRPŒ< ’.†Æú`à¿w”£‘ endstream endobj 388 0 obj 4102 endobj 389 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 96 /FontBBox [ -10 -19 768 682 ] /FontName /FDTCJB+Times-Italic /ItalicAngle -15 /StemV 0 /MaxWidth 1000 /FontFile2 387 0 R >> endobj 390 0 obj [ 444 611 611 611 611 611 611 611 611 611 556 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 611 444 ] endobj 129 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FDTCJB+Times-Italic /FontDescriptor 389 0 R /Widths 390 0 R /FirstChar 74 /LastChar 107 /Encoding /MacRomanEncoding >> endobj 391 0 obj << /Length 392 0 R /Length1 5096 /Filter /FlateDecode >> stream xÚÝ7kte–÷~UÕUyTÒ ytbBu§I“GwhˆÄ¤’tGHx„ ‘Ò €†Á,(ï0TtgÔqÁ*Màt…QœÏpÆÃè2ŠÌòУ“³3#à"¤koU"ÊÎÙý±¿ö»§¾ûüî½ßý¾ª¾ Ѱ8P[Ú(ÙHrã[ºVØ_(+‹%úŸº°sQû†¯Ÿïn°“‹^µpÚÌ Né×ÙÖXpå–ê&‡òQÔF‚è6¾ø6âGµµ¯X™´Œ¿ø´‡;Zl÷Sâ_'ÞÚXÙ)ÝË~I|ˆxûÒ@{댛Ïÿ±±¾³cù }Î'žâƒ§ó‘Öε¿wms,GI†`ìÇØ þÇ? •€àÿÁøáÆ…À„H§ÇÆ= #ô‹ô Ðóe¸‚ô¤ ¿©ÿ™IÆ}ÆÃÂe%à‚4XÏQIÖÀy(„dÈ‚‹XJ|œÏ` <'¡öãýÐÓ Úñ>…‚"ðÃKð­Xd[?­:¢¿M²"Ø!¸÷AyÙ?×OÂ^ø®é/ë_‚6‘ÅYýßÁM·rK*d’Ï%Љyl…þ”R¼çàœÇ$½a”€A´ÃRø éÞ„³ð¦ÑnòÀCqª`l…§àYÐàw¨àãø"¡·éK`6e°„Öí¤ÝœÏá‡Çñ”ž¦÷é:Åv¨0õ»áEx~aìN\‚œ‰s8'7N—õ±úM²¥ª©P?¢í°švò¼ ï|FQ³°ga'®Ç<Å*¸¼(LÓ7R–Õû>‚é”ÿrÊtâ>ãnð©ü þqþ·üiþ‰ÿ']° a–0Ûb³[º,¯XЉ¿ÏAjü8zǫޫØ.ö-¬e÷Ó{ö}ÅþÀ&ÑI¬Áƒø UêUº·ã>!P " 6R AíÊåÌpØ•‘éi÷¤¦Ø’“FÄÇYccäè¨ÈI´<ÇrýΪ&»æjÒx—sÒ¤<ƒwHø I³“¨êNÍÞdšÙï´TÉrá³T‡,ÕÛ–hµ—@I^®Ýï´køœö>0£èí>g£]0é©&½Ã¤e¢Z`÷ÛÚ|v ›ì~­ª«­Çßä#wý*,2/—.U"Êp¬Ae`M›aá×R>¿–âô™:.ÓX ÕÎhðûîq8ór5¬lq6kà¬Ðbs†—ëìdZ×@±órùÃÖèÎ[C*47TàG hÔX“#.GKvú´äÇ.Û¾g¿£üÛ~ ÔXfU µ§ŠJ³uÒÛdpmÄÕÌ´“[¶©±AÃMCI˜¹í¢Õé7$MKìZ„³ÂÙÖ³¤‰ju ÁT5Õï ø5¨m¦¨)&“—Ûo[;ÑAEéÏ+Ï+7ðD‡míþüÇCò?ˆ2íN^ \Sw».hDrN¦45{‹ÄI¹N0¦Ö ÐÓ2Ìh4"ír±QÙÔc½—ViB¦Õiï¹tPοÝ) K,™Ök`ÆqÞ¾¤¦éå _±géwŒ£ïCeÃÉ‚%„³Õ4àÅÉD üdŽc©q2BŠñ•£ªÎ–“3íjÉÔÁ’iÖë%S­ƒ%PV2Xb½JSÇçˆMCè ÝüV¨ùöPˆûË­L³]ø(ü ^§/ʨV]ïñÈ1‰cœEfœdÝ%F%&'§î± %gÄI9%!ñ¤cål3ÔÔÁÕئù[}W lê@±×‹qñÉÅ`ý}ä-âèR,çrŠ®ÂqEÞ±I‰x}gýˆ¦Éñ‘•cªî­([PûWVÑÚ11’8~\Ö”–Êåý }uÀz}ÊÊ(^å*u¤G»l™ .)3ÍeÍä]rrd!@"+D1(!–¨¨”˜BÀ4EÜc)D.ަæ4<6à²áÁQñqãF3ggILHNòÆ,‘92F»â¬ã‹¼lÍRGé¾}eŽ U»¸®µôÑð…w×uÏ}\ϤÏ|Á×?Øð—OÿóbwX˜øwOiáCã$dG³¥¾ˆËæAt¨)] ›˜+¡(E6K2¸ÍâgÂ9„Kƒ#šB¸V“£9ÆK‰‚$FÛ¨öŒ ¡çPt´œ’l;†+Á¯âƒ0|×è’ EIýÔk·ðZNNhcI‰q IɉŽBºqt2,ba¦—5c]çàéUÕ¶¬Ô™£°#Zh"nN™:†Oi)z€{É36ÝšF?L?Ïícó„jýD(WmôÝf(Pk€§xŽd¢Aù‰”Ÿ|ˆÞª9¶œiVºÅfJnºçKJJŠÍ[YàáЋÎÑbrÂz„ûoܸÁÇà¬ðþ?\ð]Ë,º\0?¶ä¢dò'úo®úëçßÐÙBlÄí¾4l6;á}á7Ä£w4߯…Sà`æ5„ô<ÁÄÓs‘í£Î‘þO¬†×pnĹZ„ùät%aV‚Ñ$úûI†fÄøá¢À7gFeuENýâöÖåyuí¥F cè­Ðz×FZ¤‡£®.ŽÞ÷øXøc=ÆÖcÙ™lÜSj¹Œ7)„Çœíæl5gÀ›j”!Ú!â þ½|:ãIüŒ£ù3þ¥h¨ƒFÔq&QŒD ŠÁf<µŽÒ[Ç ,Á“D?Iôz&–(³’t¤ƒ$$áa>qµa¾éq:qFÔé&ç!®Œ8ɹ)š›8·É)L ¢¤ÁË8ëÅ*o/‹QŽQC4šAÁ‚àæéÊ[øØAÆ'Íy£c—ÏÛåsvùI»¼Î.¿…[¡–›3ª1µòǵre­\V+ß[+ʼnԷÉÈ© Yò›Yr(KþU–¼:KîÊ’ó²hu/ý•ñWæü´j¯–¿©–ß«–Ÿ«–7UËUË «eGµÜœ&J“ïI£wpíáØ±;b!‚ȾòÎ$»v°À­”‡ðëC^%'·H á–`}.¡ë÷+剸²y¤­‡lfàÕà3ñ*ô˜x%zLý¿ÝÙ´ly°ô%BË‚¥—¨A¾©\ô^"é„`ý<¥<½Ã>Ç‚O2p^°ô)R æ~ ”ÇáhÈÇL¯©v‚×4ÏÆ–`½‹Ì…>JTÏ!•pwˆáa妻N¹žâIr-?$úkvˆí*Ÿº ©ÉÊ_Üó”+­VN’‡wê/)ÇÝ+GrÍÿê;fx‡×©Ë}^R^u?¥¼âÞ¢ü¢ÔTïõšþvÕ›è™lV¶›åùôÃTñ¢”‡Èã’Ü¥…ÄÏ«±J~îxe¦û¨2Ãýˆ2}(ÒdŸ‰&¹˜ÛùZ•ËÓ•rwºr_éÊDí$¨˃ʸ¡àcóÍí”NQrh{üaeL}’A!QÍSf-狳Äñb¡è]b¦8RL¤xÉ*ÅHÑR¤$I‰—èÞJ !ý‚šc¼æ «,¼1ó&meÆÌ†¾; %FW+„ú& ·'u•ÙÊâK㊫|w™š†çœ»tmWÍÌm_z£6Ö ôôÆ­ÐhÄúñs¼ì÷õã5ïÀÏýu¦Üákl´ÕhSjBxÅ¿8DŠÅÔçÊ+$ ~Ž j´Ù¦È&‘¯ê D~Xd~èÊ™f[†ÌÜä…Ì|2Ì.Û4s³K¦Ù†Yow¶ß×›mšùÐmšt ù† |(s-õõºÝ¦U¤†3oO¤f:J7y½dRê5LzÇzÉ ×;ÖT»¿Wç©ë†Ôu¦zî÷êü!õÞ!õ^RçüÖŠÿÝÁ¹/lØmtÆMN+=MÚÖ.jþ×7Ûí½^n™]MÍ-m´j/8[}Ú§ÏÞ;w÷]Ô» õ\§¯vûëzw«­¾à\u®ÙPܼ}™ÿŽX[nÇZ¶ý.ζΖ±6ûï¢öêÍF,¿ËoÄÚ¬n6c{ó/žY±ü.cÅ£Î[¾|üu×' endstream endobj 392 0 obj 3501 endobj 393 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ -17 -143 699 674 ] /FontName /DWQCJB+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 391 0 R >> endobj 394 0 obj [ 250 722 722 722 722 722 722 722 722 722 722 722 250 722 250 722 500 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 333 ] endobj 127 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DWQCJB+Times-Roman /FontDescriptor 393 0 R /Widths 394 0 R /FirstChar 32 /LastChar 246 /Encoding /MacRomanEncoding >> endobj 395 0 obj << /Length 396 0 R /Length1 4800 /Filter /FlateDecode >> stream xÚ­7kxU–çܪîê<ŠtçÙ‰ ÕM“wwèˆÄ¤’t‡<„!‘!¤Œ ‚Y@ˆA!ÈPÄQÇQ*Màë*£ìª#~ÃŽÃÊ2>˜5Šß8ìή€3bºöTu@ÙûcêäÞsÏãž×½Õu‘ÐÈm¾n°Â✥‘ÙÖ³Ú¶¿¤$ŠÖà“–t/íÜøÍ¾aC,;³ôþµK’ò÷\.pùí¾Å—KJ¾ˆˆ¤=Ĉìàí!zbGçê51w±CDwm½¿«ÍÇe²b¢ûˆ×é[Óm*d¿ z€hÛ¾Îöú½­hû»»V­V÷ãDÿèÜîÛ»{ßKÛH ðÆ“ÄCÐòÑ22ÂxÂéN¦ó8¼¾2Ðßj`†H¡aåö@ €ú9+4þ,#9É‚¯«ÿÆiV†´Á‚%Eɰö’­ ð)Lòð9=çà3˜ ÷Á¨†WqôÃ,(„N¼&âð,¼A;ÖBéVÀÏÀN»N¨o¯^…\‡0H{ ‘¬< O«gà9ø ®©‡Ô?ƒ6‘Æyõ?ÀI§õ$唩ds9tc[­>Åäo/œ€O1^-†8ȇ"ðÀRè€Nx'Ùëp>ÂdÊ&\ä§æÃ6Ø{@A Ægø0µC]ó(‚å´o'es.ãßÄwÔduHUÉ·¦A™.?ÏÀ!x^ËÞ!+8çs._ÕÉê Ò¢ªÉP?¡°ž2Ù ÿ ï|F^Ó±ïÅnìÃ~|‡•q1¼`˜¥Ò)ƒ‰ê}ÁlŠE:OQ _†_¼ RåÃÐÁJY»ÊY8™ŸcèQQ¨o¨¿£1À8ª ÁLX k` l¥xwÂqx .ÐYýFQ@3&P Cø ~Í€YXYû-×ÅõsGxà🊠O_ ލKÕ§Ô÷Õ¿Qö ª}:L%˜F>J`Ì…&XLµ^¡ß§á Â0Õî<\„O`‚8žòœŠex®Ã_à<‹ß2ÆÌL"Ÿì và4;ËÎsI\ —ÎåqÍÜnî ÷2¿Ë°Ø°ÒðsàñkaK°-¸8Ø\<¥Ö¨{Ô×ÔÓ¢Ñδª(Û9Ð@'¸Öéµî×îÅsާ¨NÂ)zÃÏÁŸà*ݹï©az¬T bSœåèÁ*¬ÁÙØ@ç3чËqöâãx€àµ±¶Œu²í/±#lˆ8àŠ¹ ÎG p§¹óÜGÜgÜßù$~5ÿ0ÿþ,‘áÿ‡¿n0\†{ óŒVc¡±Çø‚ñ¨°BøµpüTãÃp~ü´ÁZ¶›}½l½gïÒ¯ÕoY%Ä<Š/P¥^¤{›Oð1LGNð(ÕäIi©ì6i|Jò]I‰Ö„ø¸Ø˜h‹9jœfŒžcÙ^GE‹MIkQø4GeeŽF;|ÄðýˆÑ¢ØˆUq»ŽbkÑÕl·kʤ¹äÿhÊ!Mù–&šmEP”“mó:lʇ-€÷Íi¤õv£É¦\Ñ×µúz@_‹´¶ÛiƒÍkíðØl±y•ŠžŽ~o‹‡Ì ËT°ðœlºT‰Ͱå¾ VBš†WIrx¼J¢Ã£Ë¸T¯o±R7§Ñë¹ËnoÊÉV°¼ÍѪ€£L‰ÊÛ®í³‘j}#ùÎÉ^¦ÅÛ";o ÈÐÚ¢­|?iT8_“ÂZ4–,%ÁáQÖ}aý¼¹ò>ù#¡ÂR+|íýTšm•!²E£|OU3×FfÙ¦¦F75…‚ÐceÑîðjœ–å6%ÌQæèè_ÞB5‡úF’œäuø ~Œ×é×7†bK{—GŽ™8ÆEƙ̻…ˆ8Šì Y1gÄÄØ¸3ö5c‘®¿ò u,¸Ú+…n÷Íèò\¸§¸ŠqJ~šC˜6%¿À=9>¯ïlˆi©Š/Ϭ¸»¬dqÝá´ô‚ÞÌq&aj~ú̶FŠåcõ+|“¾Ã&Ç2#"DònÊd‰‘âÛö5?s|Ëiž‹¿i<ÖèÀñeåNgY©Ëª¡2§³\¯=õQ\ª¡â¡KNì‰ÝËÒb bYäh«éÒîï­Â%Gì%1€øcZcØ+[ÄHŽñ¦8ƒIˆ´’ÆÐu,2RLL°žÂ5`Çq!ŒÝMº”cá•Púµ×®|ײ²è|V.„ø8Kl|Bœ} •ÂBµ˜`¦¤ºY+Öwž][mMOš;»" M†°3k3ùäñÆ‚û¸g]“SÌÉ'a¬w„M '¬\Ut Ѥӧ‡o¬½…íÁ]ôViýkØM} !¨7,ÁW‚¯ 'oIn>FÃ;`g¯@3jG¥ñ5£Ÿk}2ôÂYŒ¦¯î¾-2¶ˆÆzo˜ &Q‡ýuè1ûFZÁ¼ºúò견†eí«rê»:}Œõ» ¶C;Üé1Òˆ 9ŠÞWêä娰ß5`T–œËÀƒ (—Šxƒ\¸ôÙ¦Ïf}¼!Gh¬Œø×ÒÙŒ'ö1ŽæÓLë¾TA¡Õ›ÌD¿_`-Ö‹’ÞZ9N:E M-´‚„yþͳ¥7ð%°ˆ;ôùQyœMüÔ&^´‰;lâ#6ñ Üu$¸_ŸQW'^¨ËëÄ’:ñî:ñ$N§¾KDNŽM_Oéâ/ÓÅõébOº˜“N»é_©Ï?—mÕâ·Õâ»ÕâÞjqSµ¸®Z\R-Ú«ÅÖdqb²xW2½½Ç£vF DA-‡ÄÄ»v4Ï)•ð›cn)+»@ àVC6¡Çü ¯J¥q¸2x¤Œú ƒix=xt¼]:^ƒ.]þO~gm[å/~–ÐJñ•cäêÂå~÷q§ùš¥Ò0tÙœ “†süÅ»HœéÏþ@*µà$ÈÅTbO·.v€[WŸ0†þ†4R7 Q jFÑ/·—n8ë¥ë¹ž8×r&BʰWýÒ'NBr‚ôGg³ôïÅÕÒ²ðvÈô¦ó~éD¶¾áWžSšux™ºÔ}r„ô¢s—ô‚s«ô|±.~έÛÛÝ £§2ˆy\ÚJfVåÒ‡Ï/=èÖ> endobj 398 0 obj [ 333 333 722 722 250 722 250 722 722 500 ] endobj 138 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Times-Roman /FontDescriptor 397 0 R /Widths 398 0 R /FirstChar 40 /LastChar 49 /Encoding /MacRomanEncoding >> endobj 399 0 obj << /Length 400 0 R /Length1 3700 /Filter /FlateDecode >> stream xÚÕ–mt”GÇÿ3³Ï³K a“PB )ÙB€)„ˆ”ʆ"TÆbJ „%dK€’bå%â[ bĈm­H"§])RJ+’ƒ ”`‘ ¨¶X( 1Öšb”°ñÎ?[> Ïñƒçøì™ßÜ{gæÎ÷…‡µ0.¬( a6ö‹¥YÒS W.O[:»Æ¨ù€îWZ\Q’òf¹”×.^R]¶¿êLÀcë„Ê•”¾398plùGËÅ÷šú…è{ER^±|U¿«êˆè§E°¤ra‰š¡¤­sEôøŠ’U!_µQôNÑÓ––T,zëÎñ€;@ôA¡ÊªåÝÉxCô{D¿;´lQ¨¸aÌÑË_œØìxìˆ\l´>p_Ìrë§ñŸ?ƒÿþ“QÁ‘ÔŽS˜€Mz3&¡M(Vmا¶!¬2±YJ'àyìÃ1Iã‰ùf·ÔéB ¢EÏÃIÑÊ¥ï|æH­z­u*V Ií@“Ž×“Ô^ìÒõj žFy†IÍšý¨@¶ÞƒbÏgõ/P¥ŸÅ åGŠõd=«—FçÆ9Ó0¯"‚ݦB_öcŠêïåø .`¬‡¨Õ $ÒêEPçÕÛ:¯«£ªKr¦óW&£LF»Ó„:à€è)˜d<±òéví!ñÛT¦¶9'Õ.žŒ¾Y؉­bß)õ"È2uÈ49®b†ü2LX²‘â ä;-(RõXá>.s%eæ€Ú‡lSçÔ¨cÔ뤷DuÉMÅxO@s‹± Wˆž¨ÏãQÔèkRs?Þtjõn™D§^ר=s‚YN>ÂN-úÉÌ$Ÿ'+2Èé@¾:¤3á7»UãsãœÐ—uœ; ¥N›jWî(7]ís:e[Õ¨&w,&ª.7[vÇ»ñÒ¢Fæñðê kº±£ƒ^×ñ­02ÍÑé/?Y˜v|n sä-jšß›A^¤OuÚÁîî¼BOŠ37â Œ˜t_Ä“>øÂ¿+¼9rf^aÚAå:%ævêü)bœ](¢ÕÄ,ö©S2{ÎBYt‡§ÌyNv¼ÉÁ^¸ÊçhF5·6gÁ¶ùló褄@Bz !PæAW•IéºÝáï|o™›ž¼"Ùôqæz#=˜t[؇-®{Toƒ8oï^Nœ¿5§­+§- £ºr$­·'ƲuµÚ­G—¨íaŽ.P»Â²I[¡JöÄëcìãnñ`‹ûŸd鲓 ¾Â:µ,ÝB†¹¦_fÍä—0ܲû]‰m-É ±½³AΗ¡lä•YÏñÔ°F ×m=dzNæ¯UJÖ±dŽHÉZ¬‘^–¡á5ørÄfKŒÐΈµØÓj[~ž\-÷†­µºGc?±V5-«ÈGÉ•õŠÜžs]…e˜*-«z4¶´#ÿB\ýGXB%W?ÄÕ1¶J,ÅP±Urõ+›µ|ŽmÊÉÅä"r!ù0YL~†œG>$/–=ëQ+bœs)’Ÿ& ÈO‘sÈÙ\©|Êyäƒä,òääLrz÷[éÇè-Sx¢ï§<™Ì%ƒÍ$Ê÷‘Éry/9^ZÙsVG~„Ì&ÇYb3Myy7™IŽÄtáÊ&3Èá&}8’[mwèPÊéäô–WÃÈ{²C =MæÈÈÿ<[ÿNZR)$Sr{öÁ‡È;Ø÷ÖJ&û“·Çè—Ùé‡éÑ‘ÜÚ’ä-š)Z{LŒ•%ò4ZÙH›(iÛöå銧¥Gö&o#{‘>Ò‹±BWnW¾QàÅwÈÈK—JZÏŠñÏ—ÑÏëZñþ¤¤§%E$‘ä…Rl¨UU#þ'Füß}©ÿù5 endstream endobj 400 0 obj 2004 endobj 401 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /VPRCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 399 0 R >> endobj 402 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 137 0 obj << /Type /Font /Subtype /TrueType /BaseFont /VPRCJB+Symbol /FontDescriptor 401 0 R /Widths 402 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 403 0 obj << /Length 404 0 R /Length1 5520 /Filter /FlateDecode >> stream xÚÍW}XSWšßss“$!Dð&„&„(*Û€ QëGµ„¢‚ˆ¢ˆ€2(®Zµõ ZÔqZ]§£<ŽíÚe­áÊhÛ©íØuÛÚm­3µ;n}F;ÕNmg\ûiåî{o¨û¸ì{ßœó;ï9ï9ï×¹çž@ ¬¼uMµ- …Ôs†Š¹®½ÍúÊÏþñj_àS¶,jÚð_{ÔÔÅN-ZÚ±ðÚ•åÚSÄg5Ô×.øìxñxÝ$0¦:bö©žˆN'>½¡©mU @)ñ4´K›ëj1ò‰ŸF¼º©vU‹6Ÿ!¾’xë²Ú¦úâíÏÍ!~ñö–æmÒGÐEü Äg´,¯o¼aþ+ñ¤?êmêCý‘=RSX)÷ð BE b掀@:Oå²\«¤Û|Øß•.p£iw¤Ð“Kài PlÎ/‚%è§þS6™ ó°üX zZµþ†ÃB8 _AÓAxIÚ y´^ Ì‚Ó`ƒÅÒ  :¡ÑØtè–>.‘¶Ñ¤­6ÃvAíÃ0q©t(eÐ çñaéœÒ4Qå"+ƃ&ÁZ¹ æÁZñüÎb‡´Y:MjHß(( »^‚cäÁ-Ìî„ÛK#%DÂ1K¤™ÒQémÒ“…´Vž!Ú{à ‡ë0ˆœŽ‡¥Fi¹t¤«6ÀVØ ¿‚ßÃ÷èB7ËeÍrÖÈK‘¼öl²æ²ç\@Æàl\†Øß² wLj‘ö£µrIc/¼oÂÛp®‘¤S°›ð4;ÌÅs»¸}|;ÿŠd—®’}a¬ mƒ#$ÿ1\„Ëð-|G>˜Ñ‚ŽÂ|,À ¬"z 0Žmb/±Ãì:§å~ޥм,ý§ô E%\ãZÑ~˜L>Ë\N´›bõ¼A¹z›"öGøѧð%ª0IÓpÒcÃt‰eDäW%.ÇDŸà5FN1Æú¹·SªM|>ß!¥IùÒX¢'8Š|E©&ÀÃJæª)š ÐHšŸ‚M°…âÚ û)‹ýðYðünÀM¸?"‡4“mtŽl‡]D»‰öS,ÿ‰vò1ÚG')ǧ‰Þ%:ÿAQý„²w…说Ǯ“ß‘:Šq„äŒZ”ŒâÃè#ïfUâBÚ-¸×uã^ÜO‘?ˆ‡hgõ“÷Òûx‰è/x•¼¾‰·Èïæ!š¬øü{’­'ÚÄž§r˜½Eô-7ŒËåfqOpÜî÷2÷.÷9åq¡ªSµOõ;ÕYx/çëø~ ÿKþ†?Ç_S§«k¶kvi®QVfSn áþ'žvX¼ ¬õÓ‰0Tô®Á6øiÉ«•O¹î èyè­ŸƒëÀÀF±_`6åè×|·›öÄstVŒ¥7ö"½[:¡sá<”â)6®B*dñÒu0KŸóm|%·R©˜ifüÐ9wÊçƒ%tŠÓØàkÒGܲl#Œòff8Òíi6«0"5e¸%Ùœ”8,!Þd4ÄÅêc¢uQZšWq !Ûo/­±†2jBª {y¹[æíµÔQ{OGMÈJ]¥÷Ë„¬5Š˜õ~I/I.ü’Þˆ¤÷Ž$¬EPäζúíÖÐ{>»5ŒUÓ+©ý¬Ï´†®+í)J{‡ÒÖSÛf£ V¿¹Ág aÕ*moèô×øh¹/¹­sgS Á ÑòÂ!˜X»¶ÁL KøC»ÏJ¶û”1Îá¯]š6½Òïn³ÝÙ!œXgŸ{I(Î54]žg%Ñ•¤Û½X¶ºbØt…½0¿FnÕVW†¸Ú`ˆÕÈ:Œ®P’ÝJZý©ù.ûSËÿÌ=ƒ!æ(­­ï,¥Ðt•GØ™«}†¸Š™VZ–m V†pS0b„b{Ä‹z»_î©Yb EÙKì Kj(æ0£R´x-~{­/‚i•b²7YaÜÙæuãm”w±»XÆñ6óº~öT¤ÿÓъܩK„3îÄeMö™²Ö)Jìdë8¹ªuãHŒž ’—‹CQk: Ѭï0Ø­_%Ê~ý‹û{j‡zÔÃ× 7åtÞÙ4>ÔV¾% Ž¥ï»|Â{Sxµ@[V¥8Ðñ*ã˜%J­’µQa–sÔ¶hšÙåšz³hÊí¢©†oЦnÁ#E·‹ä2zTžÑf̤â௾õ"ßðÞÓÜ…3è.a“.ó{鑇ÉÞhÂxÞ¢K‹µ›L¦øaÉ–4‹=idrN†3ÓS¨5ÎRª-µ<¦Uå^”Ü‘³5y‹skÎóÃ_Ö¾l9f:oMQe$³(®Ìävg»²³Ý:çð””2SÖÈ,KrùÁdLvšü.ΩՔ÷jPCœ'ÇãÑh£t®ìdË𔬘4ħ9øÜF;ËS»G:¹œh¯ÛSžS–“§3:mYé#½P2²¼Å¸ÞxÎÈËŒyéyùžýÃ)caûÏs{¡å‹ÇT8ÁrÑXh*4·{Ú '\´˜á‘¤"úÝN*2%jxC»kN»¡Hc(ú©1Áe6i EV¤™` †§Ðaë‹Ã“âóâó32s0³Àv·ça, N¥GƒvŽe ¼jÏVGí‰Þd6¤ºñ“ì®!f§Ê‰Wâà›ž÷£¾Ï<›‘îäŽärIö˜Ä¤Áfœ®i–Ëçæ2“%.Ó6¸·èLZ—E•›«q<ôãÖt{œW Íåv¨<7Šió⊾FÔ*üÉ[w2¬ì$„¨ŸäeTà|e…Á®ùæÎÈOS‚ƒ—oxto¤;mD£[…šî,jjˆ24WñâQ‘0 ­£#À´`ñÄI%®Ç7Õ¯p—4/] ÏWi•|ç}À#Wüf‡z‡† ³.±LH³N‚ø0ÛF` ³­Æ0ÛB`³Íqa¶‰ 6Ìž&ЇÙS1a¶‘ :Ì6èÂl=½,OhÃl&ÌÖ¨Ãl fÿ@  ³Õ\˜u°0[E€ˆó+> àû´:Ñ:wqG:n/ö°òÞ@µÍ'Oö³:â%¶€ê¯”úEâ}VOõ묖ê#J‘Ü®ÔÍl!ÕRûQ¶ˆVi-Që-ŽfùxZA§”ºW©5Þ„Vý™Výo[õ/µê×·êÇ·êÇ´ê‹ux–¾±zìSêz¥ÎðFÕ«o«·•E>£Ë¢')uŠR'y‚ú+AýAýþ ¾&¨ŸÔ§õʼnØIWj=>¥Ô•zµR7(õ ¥v*µÑkÌÒœ¥ß—¥ÿe–~~–~\–þÆÑ5P:ol¿þr¿>³_?¢_ß?\ÿ[ÚAq+ÆAÔ¾ƒ4:bø2!Œß‹Õf‚›¸!V§|%V;¾«3„âdü Tk)>ø)TãlÂ?CJæ/b#“ñOبðÀ‰ÂEç š~>EࢳŠàÑ™EðžèL#x7ÿ&:G¼%¬oˆ ‚“b ‡àu1à!8!æ„ÅÀ‚ã8*º—ˆ¢{ƒð*†ÀÍzIýz±:™zŸ«SÖŠÕcÖˆÕã„b7®„ÅÆ¶!V¿—°•Pö­º•ñfèVÆ—a£Â7ÊãK°Q‰ÅbúŸ&Ï[D>ËX':'‘š¹¢3› (FTŠB±gA@Yì1(΄€2išèî%±GE÷²Êý“E÷{BqV€åYp(Òå¢cIÊŠg(î!\d¹Œ#Á«d%œŠRY(ËÙ#yH»l¢³ŒÀ*:G¤F`ŽD>Q ȾÄËÑ} àVæG{HÿÕ‚ð}uºð]Ïá[*7äM w†ÑáMþæ¼"|éÌ®;G _8u§n»p¾û„l œ# ë0áœÓ(|0 ï9®§h¿ý¾zŸpÒ9_x6ÈoX…Þ8á°3_ø—@ŒÐX*¼ûâ…hÎÞÀ.á4ïYçR¡Óéßèµh“¬¤u–»S„w÷šÝB“‡š¢Ðè ㎠K»„GXKæÖu‡z£…'È–ª@¶0+ ó:A£v sÊçÔŠÈÁ¶% µ &›Y'hÙV*›©k_×Á ”‡»ì¾>8謲Þ'vy»”9G§˜¼ó>]Ûîèš|à‹›,뚺óÃ;åᩲ®²®²®©Þ©Š.ÿâ™%+îy~ÖÖi<8 +è]ÿo^Œzµ endstream endobj 404 0 obj 3786 endobj 405 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -15 757 676 ] /FontName /PYACJB+Times-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 403 0 R >> endobj 406 0 obj [ 722 ] endobj 58 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYACJB+Times-Bold /FontDescriptor 405 0 R /Widths 406 0 R /FirstChar 119 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 407 0 obj << /Length 408 0 R /Length1 6224 /Filter /FlateDecode >> stream xÚ½8y|SÕšß9÷&÷6Ém–.ICÒ›4mš®i›.Ú&m“B[–R*´`± ŲԖÅ>ÊRYä‚ OQÁíùÄ'iA~© 2ÊŒþÄ÷`ôéCñ‰Ë<­ïÍ8ŠMæ»·e†?æùÍ=¹ç;ßrηœïœ{N€€Ö¾ö®ÖX W‘rß“í½+lz½Zr?k^Ðsg׆ïP<@Oß¹¤oAÙºïðKðÕtv´ÎÿÊëèVbÿÂN$h:ÙâAÄ“;»V¬´}ƈˆŸC^êßÓ½|d‘…ˆßŽøøže=ýo97 þ €ò8ÒHþH)aPÆ(¿<}•öEÿ?8òruO…f¬ª¨+¾&æ!ˆˆ|Žï0¾ W yáW"ÿÊ$¢üQé¥ao 8Ákáaôj-|`|NÊ? gáS˜sà4ÔÀ!2 ¶Á4(†.R ÉäPxNb>èFÙ*xìØëåÈkH+„CÂlˆ+”B#Žr?ü6rÀ×p%r0ò7ðÀ&”8ù+¸1ƒîÇÈš!Ç\=$‹®ˆÜe¨ïax>!ñ‘2ˆƒ|(?Ü ÐwÁ½È{ÎÃÄ‚ÞdAê©‚Ù°öÀC„!"YMc£"‘E0 -X„ýv£7gá+øw¢'¯’7"–ÈÑHu;`Š8h9]O/3zÆÇÎPôFÖEGNFÞÃQ@4Æ¿ËX+a lE{wÃ1x >ĹúŒŽèˆm8J.o(P=MÃÑÞfº™mÌaØýìE™â¾ð³áK‘;#{#ïDþ½§˜[)8óEXÆ£/Ì€™Ðó1Ö‹åüø-†Â؇àŒ@˜$¢ŸE¤‚Ì!«ÈSä49C~ ”ꨈ:Óè}ô ,§èzž13VÆÅä2ó˜}ÌÌsìÅ|ÅRŃŠå7Ü–p{x~¸7¼&|"Ry(òBäZcGk¤9 Õèí \‰³`¬’c½MÊ%´ç¼„åZuNà®s>ƒË˜s?c¢ä8˜09¤˜”2´³’øI5©%ÓIÎÏlÒHZÉ"²–ô“{É~,‘ƒèÇQ,Cä8y‡œ%`¹D¾ÅòUPŽš¨ƒ:©Öb™¥•¶ÓNºvÑXž¥‡éQb€)cª˜V,Aæsžù€ù”ù‘5³+ØÕì?±gØØKì°W:EŽâ6Å,¥IY¬ìU>­<Â-æþÀ}„{ÏyxŽß´ÂÛ¡î£?A?„ëìM܈ަ“q&Ö’#äiŒÔ3˜·ùXþ‚Ň%‹ ËFŒ!øR)ÉŽ$»ML´ZÆ™LÆø¸Øƒ^§4jUÏ),C dU-¶ ³%È:“'gI¸£ ­¿"´mHªºY&hk‘Ål7KúPrÁ“ôJúnH­J²2m‡-ø®ßa ‘93±½Ãïh²‡åöT¹½Kn ض۱ƒ-`êôÛ‚¤ÅVõvn ´øq¸!Ÿ´%febb`$ÔÒÀA¨l]ÛiB I‚f‡?Lpøe“h¬›Ñð³Û›²2ƒ¤²ÝÑGEP›1Ö]êgCÑúFÔ•¹P²¶kæ;æoù ­EjµÞÞdZ›‚´EÒ¡Ïþ qÕ¦_Ðë­Àý¿biJUkǶ* ÍöÉ£h‹„µÞXíLK755ɦ¦Q#dÛG½èp$JË"[0ÊQáèܶ¨cõƒfŸ9àhõ7¡®q0Á— #Y™C¦þ‰v ÊPVyV¹'ÚMý£ð«{Fé<¥–åN_DX[#.DÒä¨F3ƒ¶vY‰m/Uãa[ûx牠— ƒQ•-Ût°WP‘¢sض]œ(Çð·7SZÇ(ÊÝšÒtÞÈäµq²ãWì!üŽ1¸?T¥¤Z¡ ‘Y> °\5*[Í0Ô¥äª $ðQߨ«êMÓ.—L)™¦»Z2U7RÞ’‘Ýe¬rs_»¢7tí'EíO/…˜N‘OóÂ{h·¢ŸE#°ŒÀkbXV#0z!&Æh4³/ò“õ †˜Q±ß3ªhêÈåiÿ—àõŠ‹‰ÞPŒÞÒ½•›cˆ),2*9¥^g49g*ÕÏ;»þŘƒ¾ìÍ«w3ów°Í¾¾ïOáƒáŸþp}â ÄJƒlO!Ú3 퉅Ÿ-Š­ŽSâQk9­R§WÆÄ£M±“Õ/jââe›¦ÎµéòÈÍ6‹A'›Í@94‰K-,*ÔëRijQ¼Ñ §“¦ÕN¿wöĘG&õO˜qÎüø–÷I{øjo×d«ýîU’v"#d½q0ü]ø´íƒð_ÈUÜ}cÐ6ç›,a(ÏPF)P†×íãÔqhÙJ¢Ìˆ9-$ÄÆ¶¯³ldÍð2Ó˜qS‡‹=žëÖåæfí*#ùN—ä,È/ôäÅÇ‘«»bZª ªÊôª Þùu/:]…ýéÑb'¨-š]=˰˜/ÆxUúrTop3¬ä…Iöâæ%9f~ѯM.,Ê»npzs…:¶4ÚžpßIŽ)™¶X¢Šg2ïW$¤+•öäMìµ³=œEŠugd˜¾Å ài*0>{ Äxš& š…BŸºO³E£Jãs,¹ïûˆ?P!òÀlg…ˆÝ§MJ7YÞ÷³ØÍ¢™˜%¢q/Ãn@Å'9‚ŠUˆž<§ð¤«ó´fòwsÄLÍU|y䤒Ôü¤ùÞ§ƒÔíí)-£­‚|’ïqŸiî=gj¾4¬;‡«v¸÷tóR“´r¥…kûö€®Ôü­É|ù‹f‚­al Ë$³éòDg.ÆÆ°¼¢-®4›?#œ2O$6}R"p.E"Øub"i ãÚ•VoŒ'ÞK7f)±G7fi){bN9Òq±"Ë)î²ÈnL­º¯vvž·gõŠ}ëxƒNiâÄØ¤²»«ê¶Ý{~`gÉÃуÂLRÈÄe¥=3+Ò§¥ø*6ÏíÙåR©ÃÿÖZ8Ö„Û'OZñHï>—^à ]¿•+òrÊïЖ\!dôR|jèZß hïÁÓÂù®|ýO¤ktX¾ˆ…Ÿ¿Àÿ÷{µâ °Si™=óð-ÄöF¼ìÎìâ.Z,¿)ŒïF€÷ÜBè‡3Ä@zðæs/ýŽ™À*åQÕp*[‰g :,©Ü×dF¹ cº•Ø‚†©s&ª3vu,Ϫïîj½ è¨A‘è¸åÿj¾jÐàm4vìž4fù´Qï5mñžM#O4_¹@®¡ª¹¶ÉµN®\ó©%Ò.ŽìR’”O§,’ÿN¬OQéß ®¯ ¶^¥<ê:Œ­ÃØ¢ð•^©µÍ\G%ÈÃNlïÄözª@È£çÝHéFJ7Rº‘ˆա†;ä§#&i.c9ˆyË‘17js#æ–1‘òƒ„÷½L¾ SIýKZñµ¥Ñâ ¼ÌM…6IîàæéâIò,Ø@ ;åz£/Ú&|b>² ;mÂ:›p’l‡:d,‘kâ‹®>¬*ëo0¡N8N&âÎ*à*u ¯¸„KøKXãz]B– {@ ²'×úl5Â5›5ÂÃ5¦aU° F°×m!Ù"Œ³à£ÿ˜v·v—¢°yt—°{Ò®Éu‹å¸¢_òˆ™…bˆllÈDpÏ`Ã!±<Žl€4– Gë!Jp øeØGrd¸’äÈüß ºÓ°ÛòÁ²Ç,,»„áX Ù2sÑ çRÇ6ÌË£ˆglÌ<ðóÌ,ÛƒìôÁÌwÅr=I…l’‚ädðÈlxdñ¤1¨lp¢¸â(I 2(†·à±á˜xÍ]/^ͱH¹’â|–¢‡Å n>£ø±{žøç²ñ4ŽðzÃ%ñU÷ñåL¹Ãïý'¤Ñá9¼¡?âS‹Ï¸÷ˆO»·ŠO–Éìy¼} 2Ø›†ÄcâVfy6úÅeIƒZ\Œ#.ʬÛ‘üˆO+fg‰3ÝÇÅîeâôQMÕ~Lv¿,»ó½O(·Šån«XZö®8Ñž ŠÅR÷A1Ty^¶ì^nÙ1Ýc‰é ¹bª$¾,ñ¶;¹;¸Û¸"®€Ëáœ\ —ÈY¹XÞÀëøh^ëxžWò,yËdž"}ÒrUê$ d¥š•Û:*Õtt_¢„§˜Z!Ù$;â{½&¯¡L_\å¿EÕ2VgÜê±÷ÕÎl >om æIˆµ©6X ]"‡ÈWä‹€ˆ|)&Äíä«@½L·û›šLµÁ)u!òe`a ñŽ.1¿DÞEQ 68KÒä‚ à8´Ò¤q0e e±­£bnÅüÄ.[sÓK²Ø»’ØÀ–´€ -MQdÃYd‹"[Á€Zžƒ]ýn·,¥ ’ÙîUPÈ*äñ H™GÈó À€'Of»ag޲ëGÙõ2{î/ììQöQödgü=ÿ;¹#sݰ_ºÕ·8ø¶·÷vš‚ëÛl¶ Ž]÷-mílí>êèð78ü¶¹ûoÁÞ/±ç:ü°?ÐÐ8°ß×áœë›+ÿpdóŽ¥›tm½¡kéŽ[ ¶Cl©¤ksàì€ÄÞ,é Hº’®Í¾Í².É·À™Ëoñ¬¸ûîy˗σÿônçd endstream endobj 408 0 obj 4509 endobj 409 0 obj << /Type /FontDescriptor /Ascent 750 /CapHeight 0 /Descent -250 /Flags 32 /FontBBox [ 16 -179 699 686 ] /FontName /TMZGEI+Times-Roman /ItalicAngle 0 /StemV 0 /MaxWidth 1000 /FontFile2 407 0 R >> endobj 410 0 obj [ 250 722 722 722 722 722 722 722 333 333 722 722 250 722 722 722 722 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 333 722 722 278 722 722 278 722 722 722 722 722 722 389 ] endobj 84 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TMZGEI+Times-Roman /FontDescriptor 409 0 R /Widths 410 0 R /FirstChar 32 /LastChar 115 /Encoding /MacRomanEncoding >> endobj 411 0 obj << /Length 412 0 R /Length1 3600 /Filter /FlateDecode >> stream xÚÕ–xÕUÇßçœï÷{/5Æe ÓÆd,¶ØXDÈ "@œ°hLš Æ…§»2@k nS‘¢E‹”Œ¶å£7$œ(Ä*PFšã-ŠH©5&­w}Î{Wþ°úÇ?zž¾÷9¯ïçÇ9ŸóùžŸ @6 ¸¸¬$ŒÙØ/–V)/^³*eÅÜJP =0^ZV’f•øk—._ ßqè-À±unZ¶¤¤ôÉÁ¡€;HüŸ[&†¸WÔ)Ñ Dº¬lÕÚ@• ‰¾VôËË—àa\½ÆfQV²6ìS[D¯=eEIÙ’³·< ºÍ¢—W¬Švâ=Ñß=#¼rI¸¸qtàIÿþ8±)Øï±_äa‹Ûc–óh|üÇH‘¬Ð“­z&aZP¬Ú±Oí@µÊÄ6ñŽÇ3؇cRÆ" Í^©Ó64£M/À ÑBÈÖ7Ë{6 ¤V½Ö:«Ñ¢v¢EÇëIêiìÖõjž@;Ã¥f' Í~”!G7 Øùª®òzV«*P¬'ëÙ}4êœ+ëNü„öš2}ÑWŒ<Õ%Ñ—áw8‡1z,¡V/’L«6u@Voë9xUUÝê¤;?™O$¢ÃmÁ„{q@ô$L2NÌ?ÝÎÒ%[Bj‡{Bí–ïÏ—¯ï@6va»ØwI½²M2dŽK˜!¿tS'–·Rä£xsÜ6©z¬ö”±Ÿ9 ö!ÇÔ¹•êu»rÔ/ãœT=Ü+ÆV\r#z¢>ûP©¯HÍý8ëÖê½2 n½®T‹zdzÝ9¨vk1PF&UÞ dF»˜£êLÌ^ÕôáØ¸/ë‹:Λ†R·]u¨.o”—¦ö¹]²d*U‹7U·—£{ã¼xiQ)ãxx}Õ†lFVÐç¹ŽÑ )ˆNûbi$xWaÊñù©™QS¾”ò#}×¥4÷ôä:Iîüˆ;(bÒü'mȹÿæ<—™13¿0¥Yù¦æÅÂN]˜'ƹ…"ZMÌbŸš—Ù»ÎCÑNÈ}JV­‰Á><åwµƒQ­gZ³8Õzª5k@ÿÔþi©ýSCº+LR÷…èN_|×å•^zoŒB•èÄëc öõjÔèj¿Wù§&´Ž–@ÝígÚ³Têþœøîæ€-*±º²ÚîÞ‚h©ž'sìíÁÓèªF4¸M#]ð†ùíçm˜óíŽ,uƒd#EÏ‹îR¡kQ·­èS‹|åƒFO7: ^“_pÓ lœ í×ã 0c¤¨Pt—Ö×¢ÑÃÞ‹E]ÛyrHi8ÔgÏ=ý&| ”Ÿ[ûÈ W×]KO2rm¢z×O{bÕ_«—3i^´éêÿ¦;ƒ\ç$BöxqJQ¨›P`‹¨·Ê/OÖK [¸¸_Î$[‚ò5ð½+ç…Še–‹ë¡/0kÊ]SfL9w]Ù¢òå×Ï®èÓ²kþÓãòŒ²çc0·GoT.¢0Ê! jÊŠ„%zÈ(yì&¯’ÿ$»È¿“WÈÈNòoäeò¯äûä{dù²ü3³üåKx¥’÷%jV6¸Hùòyž|›ü#yŽF’ aZzkÈjÎéì³|#,{ޗܶҲ…¬Š­*Ù]†²‘`3¿§’5*9o›ù=›düΈg=›pD<±Azué1B;ÂðuL›õ¡k±»Õ¶|€\/g†­µ¾Wc?÷³Ö:ZÖ’÷‘køÕ«s{÷uVbª´¬èÕØÒZŒÜéaÎþ½ô„QÎÙsöÃÌ­+0Llåœýræf-_c›eäRr ¹˜¼‡,&¿B. ï–ÿ2v¯ßM­ˆyΧ\H~™œG~‰, çr¦æPÎ'ï$g“w³È™äôž?H¦_`üi´äqGO¡<™Ì%ƒüšI”o''’Èñämä8imdÍYy,ùY2‡Mf‹Í ‹ò(ò3d&™é‘”?M¦“#0\úpåmµá\¡Ã(§‘CÑO8Dn #÷ÈNa*í)2FFþƒÙú·Ð’Ly™”Û»>EÞ̾ob­DòFò†2:Ñ_ztåmmäš)Úö˜ó%p7ZÙH›(iÛöã¥/G~’üÙ‡ô“>ŒzrºðŽï(ÞCFn¹dÒFVÌ¡|ýB±n”èIyBJDÊ)>(5«ªVUŒüŸ<ù÷$ÿ õ®î: endstream endobj 412 0 obj 1919 endobj 413 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 41 -202 550 729 ] /FontName /LCQCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 411 0 R >> endobj 414 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 600 333 ] endobj 114 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LCQCJB+Symbol /FontDescriptor 413 0 R /Widths 414 0 R /FirstChar 32 /LastChar 93 /Encoding /MacRomanEncoding >> endobj 415 0 obj << /Length 416 0 R /Length1 8868 /Filter /FlateDecode >> stream xÚµ9{|TÕ™ß9÷Þ¹óÌ<2™W&¹óÈÌd2ÉÌd&¯I&ÉM2áMx $@0€LÁ*ÖJµ¢¢UèZ룕! •µlÕšþ[i»®¶¶EíV³înn ™ÙïÞ‰vÝßoÿؽgî9ßùÎwÏù^ç;ß ´°WmØGH1ãxÿxÕÈV×£­­zòmÖ±fÓõvýéàI.@Ï^ö5k¡Ê­&çÐàÀê­Ï8öãóuCˆÐ±¯`ÿuì— mØzsK=ëÅþ'Øïºaãªßv7‚Å5Xù7 ܼI™¦ƒýë°ïºq`Ãà¼o@Úâ[¥ç7mܲ•ì !ìÂ~ç¦Íƒ›v¼áß…ý?(N!Ž€$$‘^”æ€%S˜/.в~v±rÍ!õÿçÅ V‚ Ô2¤‘ùÐɽЃ[#²³(× %xÛ˜‡  ÷{¼'ðþc¶Çq,ûRîL)Ò—nšmM‚œp<ŒÒÝ¿†Z°B9üž´`ÿ8œƒßÀLX ga˜ Ø@š¡Œü ê ÃËøÄ6؈´ð-pãS/æ^E\<cpù.fÔçRø<’; ‡àp)w8÷GˆÃ]Hq>÷;ˆ '}5ìι6‘*º5w7´àz£E~M,¹(‚HB ®‡!Ø7Â8öœ‡_'JSQ\§Ã=ð<ø1È-ä;¬*7”[‹ƒuøÜý(Í9øþÉ+䵜3w<—õ½Ðíòøcð8 ß•$×°\€ ²€,f¼LMN—‹å® ½µ&B7\‡Ol€[Q’‡áïáM,¿ÁUËIYH6‘dy¶3…,ÏÍÎÝ!ÛÑ\6Ãä rºD> ?Äò#ø9j^E¼´î¤##²ó¸‘Üí¹#¹—sÿ€áÐÞ \µ­²n†=°ù½NÀ«ð+´Õ¿Â$á‰X‘‡ãä=ò1j¤Aœí'ÌFfs„ö1ö=®…»;ûTöBîú܃¹7sÿÒSô6Z¾K®Ñ ó`ôÂjÔõzÙ?#pN¢îÎÃ;ðLB–”¢œõ¤,%ÛÉß³dœü™Rj ®¤wÓ'°œ¡ãô<ã`J˜r¦šYÎ`ž`žfàVsÃÜ·¹£Šù=ÙUÙÕÙ‘ì­ÙÓ¹îÜC¹äÎ 7näF²iLGiçAZp l—u½Oò%äç¼€åru Ncô9¿…‹èsWQ*Y6ÔD”$H’´ Ÿ$E¦“n2‡ô }“%d€¬#·‘äNò–ïÃ(Çq,'É)ò&9G~‰åùËŸ)Gyj£^ê§"íÆ²Ë]E‡èZºÞ‹å)z„§c 0-L'3€%ÜaÎ3¿d~Ãü…u°[Ù[Ø¿cÇÙwØ ì¿³—9år‹6EB1¢xRqŒ_ÏÿFQÇÏék¢Á*ØFпÂ: ÷FFúÚ…–¸#O¢¦¾‡~[ƒå],"–j,j,w A ø}e^Û%”–8‹v›ÕRd.4 úV£V)yÇ2”@eÚÛÙïÊøû3¬ßÛÕU%õ½ˆø¢?ãBTçµ4W¿L準RDÊ5ÿ…RÌSŠŸSƒ+ ɪJWÚëÊü4åu‘¥ó– |oÊÛëÊLÈð,Þ/Ã:„Ýn|À•¶ ¥\ÒïJg:G†ö¥ûS8ÝI¦®ªDÇ@Mh¤‰3Ð1pÛ ‰"qxSéŒÝ›’Ç_z`ufî¼%éT±ÛÝ[U™!«¼+3àmÏèCSKϹtþ\»ªr­Ä?Ü£]í]}Ϙ+û%hàº%f 7Cû¥5Œ¡ŒÕ›ÊX·`û¢û”þÆ—3Ô×90¸¯UsOW¾Û/õ¾½î.œ–ÞÕ»$CîêÍ3!óž—bЛ–0ýë\•·Ý;´o]?êæ/uˆŽ´w Õ›¹KFí¢]îTUž´íhr£RNVµUµIm“Û¶#ß~ôõ<þgg42ÝÙ÷±ížÿ¹^ˆ´’w:²™q­’ñ"¯ R5ØûV5 ^½¥\›Quôï34âSÎgðºö]4”wâ“k1S…Ïp $P2ççãS0Æ(<ô¹‡ðc0>t§d:§#‹D'°ütÔ;a¨C¥à§°+U»;çÛB¡Ù“³&“³ —“³ “IhMN& ±ªŽÆnco772vå¯\÷__cþéªOΖg ¹!˜òt„)v’­¨Y—&®’K¡êd¸,EF³ÅZä®m!µÆ¿×£àk}qº’Ìß49¾m†­Ü± ŒlÔr½œêÊÌY¬³TQ·”y<+18OI¼7#ïor«¡ÆÄ™>¹n$k ™Õô€þ²þ²™åô s‘ÞgfCJ3ú4±ÙÕ¢Q3 8›Ýh·iÔ„S˜ë ¸"ó“ÜÅZfñ´ýUb:…V;Z⌌_0\¾8­Žæq›ý¹uB²mÞé$H22Ï_íØ&:YƒÒÇëÔµ Rk5œž©%*­¢–°¬ "!CÒ …vÔ@ßp½’ÔJ¢KÞÑBdSQ⎡3îfr#QÚ¸wa$Š}º÷™·~—ÝMÞìŸ]íØxõ·Vr+YýÌ·]]¿Yõá±óŸÌžËÞîÕfÿYòcºsÿÆìeŽ£¯ˆÐF´âš?ú¯ø)èTP­÷ ú`âõ3š§u§U?Q½y3ú®êÝè;ÕŸ¨&¢úÅÊÊê «S0 ×ë‰~z,\—¨®Ô«AaVšã>>ÜR§Q¶4kÚø¶DÀ ‰´UˆÕÛ‚‘Š#´bŒ‚¨î°ŠSžv6%ŽQr´£=2~qââ$ª±/ù!ªm2y!‚»dB*’5é³MŒ§6³¬È¦–Vo¹ÖJxêÓù~“Ÿ°~à[ØR(*³–‚ÅZè7”’@9£?!P çZ•¥` ˜K%=ËZ&xKÊ–¯]xAªà^,2[-ñX]mY}¯¶& [ ÈŒÚç^O~×X%ÿ”©ê‹2:oj íÞÒ½?ˆ¶oË·®#…fÏúx8¬ö•TEøýWÓ>¥.h-õ¹| ©fffݲù‹vÛh…?Ü;¼,䜑X?¼~ášòGqD›P6XtMeìHß™ÝØh ×ìþ%Íí®ºm}t"ÿ&T—mg^eŽàûFfh‹áœ80½½«ãžö½Ïs\9W¯êpt$:Ö174qüÉ3ñîvmØZž¾äK ¯ôŽ,Wfÿ$néé°è(Áì­€këhà`ÿM?K3ó*„ƚͯ¨V .½º$òèã§ïš^–N5iMF¡Ü×»Ú\ýÚŠé«îÚþ*íÆ˜eÂÍù¾CFá„hI[È_¬DeuX©CiˆQêmu cäŠØäaZÁu•9Z¥.o¨Õqy5ï°sÕNÍþ 7 zFFˆ²†"=ZŠøhD(U—y#všíDÌEXF²N¬÷_RÚ~IùXNb“Ž¨Ï¢LeŒM} o=ƒÏo±ù-e¥ÄjóY¥DÞH¸{pï ×)Z·Vb5¢Æ§v˵Ñ| aš/iÐé*wÙûikõ’5ßmrUÏÌÎYk[:ûþš…ÙiNMÓÌ™†Z†–é|ÊR~ò`—'¹§ë¦ìÐ:Qítjo$ܼɘ-ÜÔ uæÿ%(Ǫõ¨Á÷©>ÑïÕê[µNŸ«ÌërÙ\†¹V§í~§K0èY§Où 'ï+SäèäÒ<È×{ýI’DÊQÐoå3 OM9¤Ë*1\ÂàÅg'(ú# ÈK/¹Zü3±ŸNV†š›C•ÉëTú¨¦(:’v*iý@ÖÁÕµ4Ë£WŒêÚ›È{mö [ $J´¼r2¶¹QéÌç>Y¦[ñ­s"`:Àiu•Y\&í;l£Æ©Ýo2² k- V‹Ú޲7š" +Ia“¥¸ö˜b¿þË,×ÕÇ>c¸¢¯]cn.pÛï~™g’˳N§*±€y«Ý^¡P¸Ë’Zó•y‹ã¼òù ó{æyˆã{Ïߊ½vÇ,=PðT:­à6Ä„xÄÝêæ|­N·Ë#1w•9.—7Ü茹¼ZWž{}¸Êç,d>nÒ[¬=¹]ê¾Æï‹Ô°ÅNéoëLp„aXÉsëj%Ï5È®+Ò©!¹ïÅ cÂø™•$ÇåúؼãÊmŽr›¿”Ø{ð Çí¾V ­$f)!ÿƒãâYœÇß´„¶°IUX|d9Ï\W3»'ÕpCc*»pz£¸¨©ÙS'¦³Ýä]§ªö:ܳ?¥^mLP«XäªÌüQ¶ªK$N§ºy ynÑp¹µvò\W5u¢&)¨äx~´¨Õ³boªÎ}ÀþˆïYß÷—Jµ Ìð1O•‘tñ( :gü²p‡3ök¯Íe”¼ß).lãU‚Q«æhi±²ÅËótUPp)ŒáTT×–¢Rg Ä ©µ¶ÕÚ'G„ Éc&ð,–jü"qýF¾u áª1âõž ›Óþ–Xìt;qHcØ-’ÆBn“ÔJß«S³œ™x.^¡‰éäSGÎAʶD$Pã# ؤ?¤?£gôPCjâ‘ñ¾‘·m}& o÷™#gû†mòI™œ0~–V‚¡Ùñ‰Íqñƒ>‚ÐB2Êa»ø18š'˜È§›åA—_KxEPYJ\FO)ðå\)¸ Bi>ÝœÊ{ ãë”…"$L>?Wëã…^¿¼-ŠÌ™Šs’ݼdÛè¼»{q¬uÓ-[m«½]i2(l¼`ö´ÜÔ9wßçÞ—|¸@kâÄGš67oZÐ^1Û'¶ï^¶i¹Z“ýçºÕ‹¯ëš¶õàÈr£–9‰1ÎŽvibƒ‹*#)öP3M”z¢Æ­žÆ·è5¢Ú­)KÝà¡s±M4VšñX×ñºãÝæ³6ÃäÙq ¿À Z'GÞvØ^w´ŽO&åÄ‘`†Wäe¦ò6+_@$w«5ze‘1ȾHUãTgë,«õ8,5[ëF*¬8NeK7ë8æ`×ä™™´Çg)íl\›¤Ë§Ö˜Ófu—%ß2å&˜ó̳‚JxZœÝÍw Kù¥Â~ƒ°”TP :¡€–(ÕΗ×ßè ¹¼f<• æýv§Ý_bP«¸P(ì®Å­©äuD_Yé3è _‰øüÒ^ Wɇw# ”@a,”3g ƒRîtÍ65yÊ(ËøY)oõ¢ÈáOÚ¡˜_‘|2‹»7f Ö;°¾¨€`°óø›‰œÙJŠ’°Zi.ô­JµùüÉ¥¤£zN}M³c GS W,ž5Ûcé"Ÿ2OîLgVÙ+iÙ¬(çžSqƩכU•âð¼@²¥y?åçy§V:Û*rŸpßdC#QŠ»ý¼?š(J'Ü…ŠW(õJ³*jó=_3ßmVá+2`ëi=SÏ*bµŽh4aªŠ;‹µs²¬T&Lf R,0ÅŠk‘¢ªjÉãq{ª¢µ±b$0»E:›ÑWÞœÑÙ0(›&iVÒ"CÔ@@Ž…“¢nZ‘`ލ¼Ñ%Œ+A~§§Šºýnļ0Íå'þ¦È‡G®Ú¤èøžAÊg‡óðÈÕ¾<ô )”b²kMJ=|!ÄÓ—7œ=2œåVžå•ˆPJº©ôòG ¦¨Öb)XJ&‰Kæ@$îG&ßàFEKItV‰°¾FÎŽkÝÌX²Q§91ªu†+³vWIö «Phéﲡ<§¥ÙóÕ®Ù®Ú|›ÓÙ“Ã̼#PTUšõ‘Qç2«Ï¡()áüÓ®~¬R*X™ü9ÇcûÛm!^X{°d¸­/{Ü¡5oUyY!Ÿ£È×ÇWçÜ»BŸ¼DˆRîŸ9yeÛç-žlÜCœôMHõù×l•ÿ˜Ï>›ýê¿}÷1q¯›J¡ûYXŽwÂw³¿Ç»™¹º±­ÃÛDPŽ·a7Þ*¦†°ogósTHß¶°ì€q¸LzÈïèO˜çÙùìiNÉ*Vòa~¿²BU0%‹ V c7»Ú€%ÀÿœD‘)LS|*¤¼½ká¼¶E‹B=k7 n©š¿qÃÀ@óÌçað+¿-™äwq žòF0C¤`†üUaŽü¿¿ô'}±Q¯ú‡¢ï!­ç‚ä‰"¶éÈ\:*×.¹6È5`ž¡‘Pûy²_Aþµmeý)e°>C¥/lÌ3½B•¸ö„Ž Dá *Ýt;²};•Z%܇ð}虜JÔÄFÄlDÌFÄlD +°7WX!Ï8{Òªsä^{­Ø‹Ê½®Á^Dî T9ŠÛýEò™Eæ¿ ^.N“n2 V‚@ªGwÏ^&O tä>¹¾C,pé~íÒ½ãÒÝçÒÝîÒ½Lî¹8pƒ\±`®îWsusu­susu§H¾ èð„7—ë^*וë¾_®»µ\7R®«*ǧ¢ÂuäûrýmÑ5C÷çº×gèž¡»k†nû Ýš:÷ ÝJ§®Ì©+vêÆÈŽúûõûõ Bðø~ÝýûwéXuDhÃÓü…¸ª¬Ã´½£=•Ø|}´ç9¡­ˆì‚ KP¢¤R{+¤äv‰ÊíÍ$*m4ÄǶŒ¶<ŽÍðhËTÇz˃ëFãÛ0Ú³\hS‘øÔœ1H)¥¶j´å®­ü©Ðf$¢Ë .{!.“{¦ZÅhɹãÈh.8FȨÝ3FÉ áJd¾p9<Æ"æRxL‰Íoƒcô¹Qá½6¢Uø§Èrá[fgq†õ\^‰Ü ¼X)?ðLê´4;> endobj 418 0 obj [ 250 722 722 722 722 722 722 722 333 333 722 722 722 722 250 722 722 500 500 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 722 444 722 722 722 722 722 500 500 278 722 722 278 722 500 722 500 722 722 389 278 500 722 722 ] endobj 25 0 obj << /Type /Font /Subtype /TrueType /BaseFont /HUQAVV+Times-Roman /FontDescriptor 417 0 R /Widths 418 0 R /FirstChar 32 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 419 0 obj << /Length 420 0 R /Length1 3376 /Filter /FlateDecode >> stream xÚÕ–}x•eÇ¿÷}?Ïs:Æä²18æ X0&or†c!Ð\Ãè€4Œ±«;2@&ƒãD š©ÙBòÒÓ\‰&»°@iÀ%½Ì ‘ZË i—Ì­ßý=GÿèåŸþðº<Ïužßïû»ß_žû@H@ ‚++JÂÈÄzQ:%­Ü¸>°vQÄTÐÃË«+JRÂI€¹Aâõ«×T—óú.ñ_ÿ¾òU%¥oæ3g¡øŸ-!á%uRü{ÄS^±~ÓÕÙhŸmuMåÊ\‡2ñ[Å÷W”l û¯R÷ŠHüÀÚ’ŠU]#·‰ét F…+«Ö÷·âiñûÄ^·*\üÄd©Ë#ÅDS°ã±#òoëÀȸòÿü´¤œÀ l×;0‹ÑbÕµu* ;$:O¡G%ME–›fÉÓ‡S8€SzŽ‹W†l}­¼ p«äjÒZ§a:T:t¢ž­žÄ^ݤ¶à,Å('Sr^BÈ´¢9zНêZP¥Ã•„*ë9º`F£sSÝ|,Ã!DÑl*ô_1òT¯Ô^Ž×pSôT¬@½^!=mW§T›:£ÞÐExYQ}ê„;Ì?RÐãv M§â´‰ŸŠÙƉÇçÙ¹Ç8é¿Mej·{\í•ñÊè{=x@ô=’/ŠlÓˆ,#=ÇEÌ—gœi%Lj}»PäžÂRÕ„ ÞÝ2W3mª9¦Ñ¨£ô¥µduÞKÃ4']gzÅØŽ‹nTÏÒgp'"ú²älÅY·^7Ë|$»M:¢VÄænêÜz —™I—÷2Y‘Qî%©ƒ: I¦Yíÿ`nÜõàå£ÔíV=ª×›èe¨·W–<¢:¼)˜¥ú¼ÕîMó¥DDæ±}sí–lä Ïs£&’¢:ãæÒhð‹¡À±%éYþÍ $ùQFW †œTwIÔ5þ¨“1úÜÿ žËš° 08 |sóâÕÎ]ž'⢘ÖYô¹yY±}ZÖßà”¹Ë)ö!%8ȧü®v0±³«3I§;OwN64}hFúÐô2}U&µï|ƒ/±÷uÞ¸X!•â$ê(ëìít°S×ù¸ÊŸtzfçd©¨¯»«{’JŸÂÇIì›oÚlR)u‘:ð¤Iz­ðù÷n2ó]¥üƃøœ°ÊwÉﰆ݌~›|€mÞÏè.ÙÉßbžzFw’u\Óo2Ïò>Œµx[ú¶Ê½dm|ïÔâFñ¬mä »ã‰0G„ë¶ãÙ*ó×%‘­ŒlÅa‰Ô`‹´ê2b„v†·à˜)š¡«ØÓjK~Ü,ß ›ksÌc;w1W5•MääFŽzCnì\WaæJɪ˜Ç’V1rg†¹úw0F%W?ÌÕ³o•X‹ëE«äêW²oV1øË”“«ÉUäJòv²˜ü ¹Œ¼Mþ+س~½¥ìçÚ!òËäbòKä­ä"®TíBò²€ü¹\@Îø£ôôó¬?ŸJOôM´ç¹d£™MûFr9“œAN'§Ii#{ÎÚSÉÈr2™-šÁ$ÚÉÏYäÌާýir9Vþ½N—YK/“;ôzÚä Ž–ÛÂÈýÑ L§92òÇæI%ö257¶>E^˶?É\)ä5ä'âL’ÙŽ¡Ò¢+o« “;hxÃØbr<–ÌÓhm#eúI[vOW"•Ády5y9ˆô“>Lzòu5àÞQ¼‡ŒÜpi¤­Y±ÿËeôËE­‘Úï—ôˆ¤¨¤Ã’|Pjam½ªÿ‘ü0þc÷KûB½` endstream endobj 420 0 obj 1797 endobj 421 0 obj << /Type /FontDescriptor /Ascent 701 /CapHeight 0 /Descent -299 /Flags 32 /FontBBox [ 42 -177 550 706 ] /FontName /RBNCJB+Symbol /ItalicAngle 0 /StemV 0 /MaxWidth 1042 /FontFile2 419 0 R >> endobj 422 0 obj [ 250 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 549 ] endobj 68 0 obj << /Type /Font /Subtype /TrueType /BaseFont /RBNCJB+Symbol /FontDescriptor 421 0 R /Widths 422 0 R /FirstChar 32 /LastChar 61 /Encoding /MacRomanEncoding >> endobj 5 0 obj << /Type /Pages /Count 2 /Kids [ 4 0 R 39 0 R ] >> endobj 423 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 424 0 obj << /CreationDate (D:20060617203329+02'00') /Creator (Word) /ModDate (D:20060617203329+02'00') /Producer (Mac OS X 10.3.9 Quartz PDFContext) >> endobj 425 0 obj [ ] endobj xref 0 426 0000000000 65535 f 0000008594 00000 n 0000000022 00000 n 0000016906 00000 n 0000008614 00000 n 0000782766 00000 n 0000008720 00000 n 0000511713 00000 n 0000684071 00000 n 0000588537 00000 n 0000010337 00000 n 0000008917 00000 n 0000009602 00000 n 0000009429 00000 n 0000009449 00000 n 0000016040 00000 n 0000663887 00000 n 0000718229 00000 n 0000540888 00000 n 0000715455 00000 n 0000524941 00000 n 0000010160 00000 n 0000010180 00000 n 0000017771 00000 n 0000633963 00000 n 0000780155 00000 n 0000694102 00000 n 0000648062 00000 n 0000527345 00000 n 0000013612 00000 n 0000013633 00000 n 0000016020 00000 n 0000015211 00000 n 0000016886 00000 n 0000016077 00000 n 0000017751 00000 n 0000016942 00000 n 0000021229 00000 n 0000017808 00000 n 0000021250 00000 n 0000021359 00000 n 0000030425 00000 n 0000279127 00000 n 0000021669 00000 n 0000022435 00000 n 0000022963 00000 n 0000023734 00000 n 0000024742 00000 n 0000025615 00000 n 0000026495 00000 n 0000027430 00000 n 0000028121 00000 n 0000028962 00000 n 0000029652 00000 n 0000022257 00000 n 0000022277 00000 n 0000466113 00000 n 0000631480 00000 n 0000764648 00000 n 0000558280 00000 n 0000529828 00000 n 0000736081 00000 n 0000022799 00000 n 0000022819 00000 n 0000466983 00000 n 0000725247 00000 n 0000592856 00000 n 0000598060 00000 n 0000782593 00000 n 0000023556 00000 n 0000023576 00000 n 0000470465 00000 n 0000515936 00000 n 0000554066 00000 n 0000617550 00000 n 0000486491 00000 n 0000548627 00000 n 0000024564 00000 n 0000024584 00000 n 0000472206 00000 n 0000522486 00000 n 0000638120 00000 n 0000706088 00000 n 0000604575 00000 n 0000770019 00000 n 0000025436 00000 n 0000025456 00000 n 0000469595 00000 n 0000743915 00000 n 0000620814 00000 n 0000655798 00000 n 0000532314 00000 n 0000601901 00000 n 0000026315 00000 n 0000026335 00000 n 0000473947 00000 n 0000546137 00000 n 0000687958 00000 n 0000536752 00000 n 0000720743 00000 n 0000651302 00000 n 0000027243 00000 n 0000027264 00000 n 0000474817 00000 n 0000710404 00000 n 0000519159 00000 n 0000483800 00000 n 0000669514 00000 n 0000738697 00000 n 0000027949 00000 n 0000027970 00000 n 0000473076 00000 n 0000698870 00000 n 0000491373 00000 n 0000772707 00000 n 0000623494 00000 n 0000028775 00000 n 0000028796 00000 n 0000471335 00000 n 0000479206 00000 n 0000610611 00000 n 0000701528 00000 n 0000730497 00000 n 0000628797 00000 n 0000029480 00000 n 0000029501 00000 n 0000467853 00000 n 0000753573 00000 n 0000613392 00000 n 0000748683 00000 n 0000626149 00000 n 0000030238 00000 n 0000030259 00000 n 0000468724 00000 n 0000643616 00000 n 0000595345 00000 n 0000659894 00000 n 0000760339 00000 n 0000757566 00000 n 0000279103 00000 n 0000465257 00000 n 0000466092 00000 n 0000465281 00000 n 0000466962 00000 n 0000466151 00000 n 0000467832 00000 n 0000467021 00000 n 0000468703 00000 n 0000467892 00000 n 0000469574 00000 n 0000468763 00000 n 0000470444 00000 n 0000469633 00000 n 0000471314 00000 n 0000470503 00000 n 0000472185 00000 n 0000471374 00000 n 0000473055 00000 n 0000472244 00000 n 0000473926 00000 n 0000473115 00000 n 0000474796 00000 n 0000473985 00000 n 0000474856 00000 n 0000478937 00000 n 0000478959 00000 n 0000479169 00000 n 0000479386 00000 n 0000483526 00000 n 0000483548 00000 n 0000483763 00000 n 0000483982 00000 n 0000485993 00000 n 0000486015 00000 n 0000486222 00000 n 0000486664 00000 n 0000490257 00000 n 0000490279 00000 n 0000490492 00000 n 0000491553 00000 n 0000511066 00000 n 0000511089 00000 n 0000511328 00000 n 0000511902 00000 n 0000515642 00000 n 0000515664 00000 n 0000515875 00000 n 0000516114 00000 n 0000518877 00000 n 0000518899 00000 n 0000519106 00000 n 0000519305 00000 n 0000522204 00000 n 0000522226 00000 n 0000522433 00000 n 0000522631 00000 n 0000524683 00000 n 0000524705 00000 n 0000524912 00000 n 0000525086 00000 n 0000526975 00000 n 0000526997 00000 n 0000527204 00000 n 0000527518 00000 n 0000529570 00000 n 0000529592 00000 n 0000529799 00000 n 0000529973 00000 n 0000531944 00000 n 0000531966 00000 n 0000532173 00000 n 0000532487 00000 n 0000536471 00000 n 0000536493 00000 n 0000536703 00000 n 0000536930 00000 n 0000540631 00000 n 0000540653 00000 n 0000540863 00000 n 0000541065 00000 n 0000545723 00000 n 0000545745 00000 n 0000545960 00000 n 0000546317 00000 n 0000548369 00000 n 0000548391 00000 n 0000548598 00000 n 0000548772 00000 n 0000553660 00000 n 0000553682 00000 n 0000553897 00000 n 0000554246 00000 n 0000557986 00000 n 0000558008 00000 n 0000558219 00000 n 0000558458 00000 n 0000587895 00000 n 0000587918 00000 n 0000588152 00000 n 0000588721 00000 n 0000592599 00000 n 0000592621 00000 n 0000592831 00000 n 0000593035 00000 n 0000595087 00000 n 0000595109 00000 n 0000595316 00000 n 0000595491 00000 n 0000597798 00000 n 0000597820 00000 n 0000598027 00000 n 0000598205 00000 n 0000601606 00000 n 0000601628 00000 n 0000601840 00000 n 0000602079 00000 n 0000604201 00000 n 0000604223 00000 n 0000604430 00000 n 0000604748 00000 n 0000610164 00000 n 0000610186 00000 n 0000610402 00000 n 0000610792 00000 n 0000613130 00000 n 0000613152 00000 n 0000613359 00000 n 0000613538 00000 n 0000617295 00000 n 0000617317 00000 n 0000617525 00000 n 0000617729 00000 n 0000620540 00000 n 0000620562 00000 n 0000620769 00000 n 0000620959 00000 n 0000623232 00000 n 0000623254 00000 n 0000623461 00000 n 0000623640 00000 n 0000625651 00000 n 0000625673 00000 n 0000625880 00000 n 0000626323 00000 n 0000628427 00000 n 0000628449 00000 n 0000628656 00000 n 0000628971 00000 n 0000630982 00000 n 0000631004 00000 n 0000631211 00000 n 0000631653 00000 n 0000633705 00000 n 0000633727 00000 n 0000633934 00000 n 0000634108 00000 n 0000637865 00000 n 0000637887 00000 n 0000638095 00000 n 0000638299 00000 n 0000643162 00000 n 0000643184 00000 n 0000643399 00000 n 0000643797 00000 n 0000647781 00000 n 0000647803 00000 n 0000648013 00000 n 0000648240 00000 n 0000651028 00000 n 0000651050 00000 n 0000651257 00000 n 0000651448 00000 n 0000655529 00000 n 0000655551 00000 n 0000655761 00000 n 0000655977 00000 n 0000659639 00000 n 0000659661 00000 n 0000659869 00000 n 0000660074 00000 n 0000663592 00000 n 0000663614 00000 n 0000663826 00000 n 0000664065 00000 n 0000668924 00000 n 0000668946 00000 n 0000669157 00000 n 0000669694 00000 n 0000683416 00000 n 0000683439 00000 n 0000683686 00000 n 0000684262 00000 n 0000687663 00000 n 0000687685 00000 n 0000687897 00000 n 0000688136 00000 n 0000693652 00000 n 0000693674 00000 n 0000693889 00000 n 0000694282 00000 n 0000698476 00000 n 0000698498 00000 n 0000698713 00000 n 0000699051 00000 n 0000701266 00000 n 0000701288 00000 n 0000701495 00000 n 0000701674 00000 n 0000705814 00000 n 0000705836 00000 n 0000706051 00000 n 0000706269 00000 n 0000710147 00000 n 0000710169 00000 n 0000710379 00000 n 0000710584 00000 n 0000715049 00000 n 0000715071 00000 n 0000715286 00000 n 0000715635 00000 n 0000717731 00000 n 0000717753 00000 n 0000717960 00000 n 0000718402 00000 n 0000720373 00000 n 0000720395 00000 n 0000720602 00000 n 0000720916 00000 n 0000724893 00000 n 0000724915 00000 n 0000725130 00000 n 0000725427 00000 n 0000729892 00000 n 0000729914 00000 n 0000730124 00000 n 0000730677 00000 n 0000735639 00000 n 0000735661 00000 n 0000735876 00000 n 0000736261 00000 n 0000738323 00000 n 0000738345 00000 n 0000738552 00000 n 0000738871 00000 n 0000743504 00000 n 0000743526 00000 n 0000743742 00000 n 0000744095 00000 n 0000748289 00000 n 0000748311 00000 n 0000748526 00000 n 0000748864 00000 n 0000752457 00000 n 0000752479 00000 n 0000752692 00000 n 0000753753 00000 n 0000757271 00000 n 0000757293 00000 n 0000757505 00000 n 0000757745 00000 n 0000759841 00000 n 0000759863 00000 n 0000760070 00000 n 0000760513 00000 n 0000764391 00000 n 0000764413 00000 n 0000764623 00000 n 0000764827 00000 n 0000769428 00000 n 0000769450 00000 n 0000769662 00000 n 0000770198 00000 n 0000772209 00000 n 0000772231 00000 n 0000772438 00000 n 0000772881 00000 n 0000779549 00000 n 0000779571 00000 n 0000779782 00000 n 0000780334 00000 n 0000782223 00000 n 0000782245 00000 n 0000782452 00000 n 0000782832 00000 n 0000782883 00000 n 0000783043 00000 n trailer << /Size 426 /Root 423 0 R /Info 424 0 R /ID 425 0 R >> startxref 783134 %%EOF iem_utils-0.0.20240903/iem_adaptfilt/help/0000700000000000000000000000000014665566711014734 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/help/NLMSCC~-help.pd0000600000000000000000000002154214665566711017372 0ustar00#N canvas 284 42 905 710 10; #X declare -lib iem_adaptfilt -lib iemlib -path iemlib; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 44 506 graph; #X msg 36 256 update \$1; #X msg 113 266 beta \$1; #X obj 283 35 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1; #X obj 283 56 dsp; #X floatatom 283 102 5 0 0 0 - - - 0; #X floatatom 296 81 5 0 0 0 - - - 0; #X obj 287 474 bng 15 150 20 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 433 300 2.arg: learn-rate = beta; #X obj 64 286 noise~; #X obj 36 69 vradio 15 1 0 8 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0; #N canvas 165 115 464 314 (subpatch) 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 36 216 pd; #X text 45 48 internal downsampling of update; #X msg 107 348 gamma \$1; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-W_top 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 636 505 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-W_bottom 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 304 505 graph; #X text 86 374 input signal; #X text 201 373 desired signal; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 382 42 graph; #X obj 65 451 unsig~; #X floatatom 65 477 9 0 0 0 - - - 0; #X obj 175 450 unsig~; #X floatatom 175 476 9 0 0 0 - - - 0; #X text 37 374 x(n); #X text 292 373 d(n); #X text 40 419 y(n) = W * x(n); #X obj 287 302 FIR~ \$0-IR 32; #X obj 599 145 loadbang; #X text 483 290 (array-sizes have to be >= then FIR_size); #X text 433 280 1.arg: number of order of FIR-filter; #X text 53 82 update every sample; #X text 53 67 stop \, no update; #X text 53 97 update every 2nd sample; #X text 53 112 update every 4th sample; #X text 53 127 update every 8th sample; #X text 53 142 update every 16th sample; #X text 53 157 update every 32nd sample; #X text 53 172 update every 64th sample; #N canvas 0 0 474 324 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X obj 92 84 loadbang; #X obj 48 182 s \$0-IR; #X msg 48 120 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X msg 205 71 const 0; #X connect 0 0 4 0; #X connect 1 0 5 0; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X restore 600 120 pd; #X obj 613 102 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 630 99 clear; #X obj 600 83 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 617 80 load; #X text 662 89 IR; #X text 15 406 filtered output signal; #X text 179 406 error signal; #X text 153 418 e(n) = d(n) - W * x(n); #X text 304 468 constrain; #X text 304 478 coefficients; #N canvas 0 0 825 416 (subpatch) 0; #X obj 43 39 inlet; #X obj 446 39 inlet; #X obj 92 84 loadbang; #X obj 43 340 s \$0-W_bottom; #X msg 43 226 0 -1 -0.971428 -0.942857 -0.914286 -0.885714 -0.857143 -0.828572 -0.814286 -0.785715 -0.757143 -0.728572 -0.7 -0.671429 -0.657143 -0.642858 -0.614286 -0.585715 -0.571429 -0.557144 -0.528572 -0.514287 -0.500001 -0.485715 -0.471429 -0.457144 -0.442858 -0.428572 -0.428572 -0.400001 -0.400001 -0.385715 -0.371429 -0.371429 -0.357144 -0.357144 -0.342858 -0.328572 -0.314287 -0.285715 -0.285715; #X obj 163 340 s \$0-W_top; #X msg 54 114 0 1 0.928572 0.885714 0.857142 0.828571 0.799999 0.785713 0.757141 0.742855 0.72857 0.714284 0.699998 0.685712 0.671426 0.642854 0.628569 0.599997 0.571425 0.557139 0.528568 0.514282 0.499996 0.499996 0.48571 0.471424 0.457138 0.428567 0.414281 0.399995 0.385709 0.371423 0.357137 0.342851 0.328565 0.31428 0.31428 0.31428 0.31428 0.299994 0.299994; #X msg 446 226 0 -1 -0.857143 -0.728572 -0.671429 -0.614286 -0.585715 -0.557143 -0.514286 -0.485715 -0.471429 -0.471429 -0.442858 -0.428572 -0.400001 -0.371429 -0.342858 -0.328572 -0.314286 -0.285715 -0.285715 -0.271429 -0.271429 -0.271429 -0.271429 -0.271429 -0.271429 -0.257144 -0.242858 -0.228572 -0.214286 -0.214286 -0.214286 -0.200001 -0.214287 -0.200001 -0.200001 -0.185715 -0.171429 -0.171429 -0.171429; #X msg 459 113 0 1 0.842856 0.785713 0.699998 0.642854 0.571425 0.514282 0.457138 0.442852 0.414281 0.385709 0.342851 0.285708 0.257136 0.214279 0.199993 0.171421 0.157135 0.142849 0.128564 0.142849 0.142849 0.142849 0.142849 0.142849 0.128564 0.128564 0.128564 0.128564 0.128564 0.128564 0.142849 0.142849 0.142849 0.142849 0.157135 0.157135 0.157135 0.142849 0.142849; #X connect 0 0 4 0; #X connect 0 0 6 0; #X connect 1 0 8 0; #X connect 1 0 7 0; #X connect 2 0 6 0; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 6 0 5 0; #X connect 7 0 3 0; #X connect 8 0 5 0; #X restore 516 586 pd; #X obj 529 568 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X obj 516 549 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X msg 287 433 0; #X obj 287 453 speedlim 100; #X text 509 532 top & bottom; #X text 533 546 nonconstrained; #X text 546 565 constrained; #X obj 94 423 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X obj 247 422 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #N canvas 0 0 470 320 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; #X msg 137 115 39; #X msg 137 156 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 137 135 tabread \$0-W; #X obj 137 180 tabwrite \$0-W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X restore 599 166 pd; #X text 624 172 update of W; #X text 623 161 graphical; #X text 433 320 4.arg: table-name of W; #X text 433 330 5.arg: table-name of lower boundary of W; #X text 433 340 6.arg: table-name of upper boundary of W; #X text 433 310 3.arg: minimum input value gamma; #X text 143 328 minimum input value; #X msg 113 229 0.1; #X msg 107 310 1e-05; #X text 166 267 beta [0 .. 2]; #X text 163 347 gamma [0 .. 1]; #X obj 468 260 cnv 15 68 17 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #N canvas 0 0 715 341 FORMULAS 0; #X obj 168 54 cnv 15 150 40 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X obj 168 207 cnv 15 510 90 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 29 138 normalized learn rate:; #X text 246 243 <; #X text 250 237 |; #X text 250 249 |; #X text 250 230 |; #X text 250 256 |; #X text 250 270 |; #X text 250 223 |; #X text 254 206 _; #X text 253 270 _; #X text 271 211 W > W_top; #X text 265 275 W < W_bottom; #X text 260 246 &&(W <= W_top); #X text 256 235 (W >= W_bottom); #X text 175 243 W(k+1 \, i) =; #X text 250 216 |; #X text 250 263 |; #X text 346 275 ...... W(k+1 \, i) = W_botton(i); #X text 334 212 ........ W(k+1 \, i) = W_top(i); #X text 120 75 error:; #X text 117 57 output:; #X text 27 242 coefficient iteration:; #X text 358 243 .... W(k+1 \, i) = W(k \, i) + µ(n)* e(n)* x(n); #X text 174 56 y(n) = Wá´´ * x(n); #X text 174 74 e(n) = d(n) - Wá´´ * x(n); #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 280 129 beta; #X text 174 135 µ(n) =; #X text 223 145 ∑ x[n-i]² + gamma²*blocksize; #X text 223 130 ____________________________; #X restore 467 259 pd FORMULAS; #X obj 64 390 NLMSCC~ 32 0.1 1e-05 \$0-W \$0-W_bottom \$0-W_top; #X obj 113 249 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 113 249 5 0 2 0 - - - 0; #X text 149 248 learn-rate; #X obj 107 330 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 107 330 5 0 2 0 - - - 0; #X floatatom 36 237 5 0 0 0 - - - 0; #X text 436 231 Normalized Least Mean Square (linear adaptive FIR-filter); #X text 465 242 with Coefficient Constraint; #X text 432 360 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 460 373 [noisternig \, musil]_AT_iem.at; #X obj 47 678 declare -lib iem_adaptfilt -lib iemlib -path iemlib; #X connect 1 0 73 0; #X connect 2 0 73 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 9 0 26 0; #X connect 9 0 73 0; #X connect 10 0 11 0; #X connect 11 0 79 0; #X connect 13 0 73 0; #X connect 19 0 20 0; #X connect 21 0 22 0; #X connect 26 0 73 1; #X connect 27 0 59 0; #X connect 39 0 38 1; #X connect 41 0 38 0; #X connect 50 0 49 1; #X connect 51 0 49 0; #X connect 52 0 53 0; #X connect 53 0 7 0; #X connect 67 0 75 0; #X connect 68 0 78 0; #X connect 73 0 19 0; #X connect 73 1 21 0; #X connect 73 2 52 0; #X connect 75 0 2 0; #X connect 78 0 13 0; #X connect 79 0 1 0; iem_utils-0.0.20240903/iem_adaptfilt/help/NLMSerr_in~-help.pd0000600000000000000000000001416414665566711020365 0ustar00#N canvas 26 22 1132 728 10; #X declare -lib iem_adaptfilt -lib iemlib -path iemlib; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-W 100 float 0; #X coords 0 1 99 -1 400 140 1; #X restore 633 441 graph; #X msg 46 156 update \$1; #X msg 85 239 beta \$1; #X obj 299 62 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1; #X obj 299 83 dsp; #X floatatom 299 129 5 0 0 0 - - - 0; #X floatatom 312 108 5 0 0 0 - - - 0; #X text 662 278 2.arg: learn-rate = beta; #X obj 336 193 noise~; #X msg 65 319 gamma \$1; #X text 70 348 input signal; #X text 344 295 desired signal; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 394 49 graph; #X obj 54 540 unsig~; #X floatatom 54 566 9 0 0 0 - - - 0; #X obj 392 544 unsig~; #X floatatom 392 564 9 0 0 0 - - - 0; #X text 21 346 x(n); #X text 449 295 d(n); #X text 19 510 y(n) = W * x(n); #X obj 336 278 FIR~ \$0-IR 32; #X obj 612 103 loadbang; #X text 712 267 (array-sizes have to be >= then FIR_size); #X text 662 256 1.arg: number of order of FIR-filter; #N canvas 0 22 474 324 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X obj 92 84 loadbang; #X obj 48 182 s \$0-IR; #X msg 205 71 const 0; #X msg 48 120 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X connect 0 0 5 0; #X connect 1 0 4 0; #X connect 2 0 5 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X restore 613 78 pd; #X obj 626 60 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 643 57 clear; #X obj 613 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 630 38 load; #X text 638 80 IR; #X text 4 495 filtered output signal; #X text 395 422 error signal; #X text 369 434 e(n) = d(n) - W * x(n); #X obj 83 512 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X obj 482 436 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #N canvas 0 22 470 320 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; #X msg 137 115 39; #X msg 137 156 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 137 135 tabread \$0-W; #X obj 137 180 tabwrite \$0-W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X restore 612 124 pd; #X text 637 130 update of W; #X text 636 119 graphical; #X text 662 313 4.arg: table-name of W; #X text 126 301 minimum input value; #X msg 226 195 0.1; #X msg 65 281 1e-05; #X text 138 240 beta [0 .. 2]; #X text 132 318 gamma [0 .. 1]; #X obj 663 213 cnv 15 68 17 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #N canvas 0 22 499 295 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 16 135 normalized learn rate:; #X text 119 73 error:; #X text 116 55 output:; #X text 26 210 coefficient iteration:; #X text 188 211 W(k+1 \, i) = W(k \, i) + µ(n)* e(n)* x(n); #X text 173 56 y(n) = Wá´´ * x(n); #X text 173 72 e(n) = d(n) - Wá´´ * x(n); #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 280 129 beta; #X text 174 135 µ(n) =; #X text 223 145 ∑ x[n-i]² + gamma²*blocksize; #X text 223 130 ____________________________; #X restore 664 213 pd FORMULAS; #X obj 91 223 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 85 222 6 0 2 0 - - - 0; #X text 134 221 learn-rate; #X obj 65 301 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 65 301 8 0 2 0 - - - 0; #X obj 347 389 -~; #X text 232 431 err; #X text 409 343 filt out; #X obj 28 365 delread~ causal_del 1.45126; #X obj 392 325 delread~ feedback_del 1.45126; #X msg 185 195 0.01; #X msg 53 196 0; #X msg 138 195 0.001; #X obj 336 214 delwrite~ causal_del 20; #X obj 67 472 delwrite~ feedback_del 20; #X floatatom 111 690 9 0 0 0 - - - 0; #X text 38 382 ref_filt; #X text 155 404 ref_adapt; #X obj 134 389 delread~ causal_del 2.90249; #X obj 336 255 delread~ causal_del 2.90249; #X obj 46 137 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1; #X text 41 118 Update ON / OFF; #X msg 147 629 128; #X msg 109 629 64; #X obj 110 667 / 44.1; #X obj 299 665 samplerate~; #X obj 299 647 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; #X floatatom 300 706 5 0 0 0 - - - 0; #X obj 300 686 * 0.001; #X floatatom 189 687 9 0 0 0 - - - 0; #X msg 190 627 128; #X obj 188 664 / 44.1; #X msg 225 627 192; #X obj 299 627 loadbang; #X text 660 364 (C) 2010 \, t.musil & m.guldenschuh \, IEM \, Graz \, Austria; #X text 688 377 [musil | guldenschuh]_AT_iem.at; #X text 662 173 Normalized Least Mean Square with separated error and adaption reference input (linear adaptive FIR-filter); #X obj 53 450 NLMSerr_in~ 100 0.003 1e-05 \$0-W; #X msg 114 282 1e-07; #X msg 85 195 0.0001; #X text 662 290 3.arg: minimum input value gamma for; #X text 716 301 energy calculation; #X text 46 44 NLMSerr_in~; #X obj 643 678 declare -lib iem_adaptfilt -lib iemlib -path iemlib; #X obj 635 623 s \$0-W; #X msg 635 600 const 0; #X connect 1 0 83 0; #X connect 2 0 83 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 8 0 59 0; #X connect 9 0 83 0; #X connect 13 0 14 0; #X connect 15 0 16 0; #X connect 20 0 51 0; #X connect 21 0 35 0; #X connect 25 0 24 1; #X connect 27 0 24 0; #X connect 40 0 47 0; #X connect 41 0 50 0; #X connect 47 0 2 0; #X connect 50 0 9 0; #X connect 51 0 15 0; #X connect 51 0 83 2; #X connect 54 0 83 0; #X connect 55 0 51 1; #X connect 56 0 47 0; #X connect 57 0 47 0; #X connect 58 0 47 0; #X connect 61 0 55 0; #X connect 61 0 54 0; #X connect 64 0 83 1; #X connect 65 0 20 0; #X connect 66 0 1 0; #X connect 68 0 70 0; #X connect 69 0 70 0; #X connect 70 0 61 0; #X connect 71 0 74 0; #X connect 72 0 71 0; #X connect 74 0 73 0; #X connect 74 0 70 1; #X connect 74 0 77 1; #X connect 76 0 77 0; #X connect 77 0 75 0; #X connect 77 0 65 0; #X connect 77 0 64 0; #X connect 78 0 77 0; #X connect 79 0 72 0; #X connect 83 0 13 0; #X connect 83 0 60 0; #X connect 84 0 50 0; #X connect 85 0 47 0; #X connect 91 0 90 0; iem_utils-0.0.20240903/iem_adaptfilt/help/NLMS~-help.pd0000600000000000000000000001337014665566711017164 0ustar00#N canvas 137 55 919 550 10; #X declare -lib iem_adaptfilt -lib iemlib -path iemlib; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 454 345 graph; #X msg 25 255 update \$1; #X msg 102 265 beta \$1; #X obj 272 34 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1; #X obj 272 55 dsp; #X floatatom 272 101 5 0 0 0 - - - 0; #X floatatom 285 80 5 0 0 0 - - - 0; #X obj 276 473 bng 15 150 20 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 453 240 2.arg: learn-rate = beta; #X obj 53 285 noise~; #X obj 25 68 vradio 15 1 0 8 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0; #N canvas 165 115 464 314 (subpatch) 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 25 215 pd; #X text 34 47 internal downsampling of update; #X msg 96 347 gamma \$1; #X text 75 373 input signal; #X text 190 372 desired signal; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 367 21 graph; #X obj 54 450 unsig~; #X floatatom 54 476 9 0 0 0 - - - 0; #X obj 174 449 unsig~; #X floatatom 174 475 9 0 0 0 - - - 0; #X text 26 373 x(n); #X text 281 372 d(n); #X text 29 418 y(n) = W * x(n); #X obj 276 301 FIR~ \$0-IR 32; #X obj 618 83 loadbang; #X text 503 230 (array-sizes have to be >= then FIR_size); #X text 453 220 1.arg: number of order of FIR-filter; #X text 42 81 update every sample; #X text 42 66 stop \, no update; #X text 42 96 update every 2nd sample; #X text 42 111 update every 4th sample; #X text 42 126 update every 8th sample; #X text 42 141 update every 16th sample; #X text 42 156 update every 32nd sample; #X text 42 171 update every 64th sample; #N canvas 0 22 474 324 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X obj 92 84 loadbang; #X obj 48 182 s \$0-IR; #X msg 48 120 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X msg 205 71 const 0; #X connect 0 0 4 0; #X connect 1 0 5 0; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X restore 619 58 pd; #X obj 632 40 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 649 37 clear; #X obj 619 21 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 636 18 load; #X text 644 60 IR; #X text 4 405 filtered output signal; #X text 178 405 error signal; #X text 152 417 e(n) = d(n) - W * x(n); #X text 293 467 constrain; #X text 293 477 coefficients; #X msg 276 432 0; #X obj 276 452 speedlim 100; #X obj 83 422 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X obj 247 421 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #N canvas 0 22 470 320 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; #X msg 137 115 39; #X msg 137 156 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 137 135 tabread \$0-W; #X obj 137 180 tabwrite \$0-W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X restore 618 104 pd; #X text 643 110 update of W; #X text 642 99 graphical; #X text 453 260 4.arg: table-name of W; #X text 453 250 3.arg: minimum input value gamma; #X text 132 327 minimum input value; #X msg 102 228 0.1; #X msg 96 309 1e-05; #X text 155 266 beta [0 .. 2]; #X text 152 346 gamma [0 .. 1]; #X obj 455 197 cnv 15 68 17 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #N canvas 0 22 960 496 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 280 129 beta; #X text 174 135 µ(n) =; #X text 16 135 normalized learn rate:; #X text 119 73 error:; #X text 116 55 output:; #X text 26 210 coefficient iteration:; #X text 188 211 W(k+1 \, i) = W(k \, i) + µ(n)* e(n)* x(n); #X text 223 145 ∑ x[n-i]² + gamma²*blocksize; #X text 223 130 ____________________________; #X text 173 56 y(n) = Wá´´ * x(n); #X text 173 72 e(n) = d(n) - Wá´´ * x(n); #X restore 455 197 pd FORMULAS; #X obj 102 248 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 102 248 5 0 2 0 - - - 0; #X text 138 247 learn-rate; #X obj 96 329 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 96 329 5 0 2 0 - - - 0; #X floatatom 25 236 5 0 0 0 - - - 0; #X text 455 179 Normalized Least Mean Square (linear adaptive FIR-filter); #X obj 53 389 NLMS~ 32 0.1 1e-05 \$0-W; #X text 451 278 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 479 291 [noisternig \, musil]_AT_iem.at; #X obj 573 508 declare -lib iem_adaptfilt -lib iemlib -path iemlib; #X connect 1 0 70 0; #X connect 2 0 70 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 9 0 24 0; #X connect 9 0 70 0; #X connect 10 0 11 0; #X connect 11 0 68 0; #X connect 13 0 70 0; #X connect 17 0 18 0; #X connect 19 0 20 0; #X connect 24 0 70 1; #X connect 25 0 51 0; #X connect 37 0 36 1; #X connect 39 0 36 0; #X connect 47 0 48 0; #X connect 48 0 7 0; #X connect 57 0 64 0; #X connect 58 0 67 0; #X connect 64 0 2 0; #X connect 67 0 13 0; #X connect 68 0 1 0; #X connect 70 0 17 0; #X connect 70 1 19 0; iem_utils-0.0.20240903/iem_adaptfilt/help/n_CLNLMS~-help.pd0000600000000000000000000001766714665566711017735 0ustar00#N canvas 18 0 998 724 10; #X declare -lib iem_adaptfilt -lib iemlib -path iemlib -lib zexy -path zexy; #N canvas 0 0 450 300 (subpatch) 0; #X array 1_\$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 59 527 graph; #X msg 35 255 update \$1; #X msg 112 265 beta \$1; #X obj 448 36 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1; #X obj 448 57 dsp; #X floatatom 448 103 5 0 0 0 - - - 0; #X floatatom 461 82 5 0 0 0 - - - 0; #X obj 447 471 bng 15 150 20 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X obj 63 285 noise~; #X obj 35 68 vradio 15 1 0 8 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0; #N canvas 165 115 464 314 (subpatch) 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 35 215 pd; #X text 17 49 internal downsampling of update; #X msg 70 347 gamma \$1; #X text 85 373 input signal; #X text 330 372 desired signal; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 235 33 graph; #X obj 64 470 unsig~; #X floatatom 64 496 9 0 0 0 - - - 0; #X obj 150 470 unsig~; #X floatatom 150 496 9 0 0 0 - - - 0; #X text 421 372 d(n); #X obj 787 293 loadbang; #X text 697 442 (array-sizes have to be >= then FIR_size); #X text 52 81 update every sample; #X text 52 66 stop \, no update; #X text 52 96 update every 2nd sample; #X text 52 111 update every 4th sample; #X text 52 126 update every 8th sample; #X text 52 141 update every 16th sample; #X text 52 156 update every 32nd sample; #X text 52 171 update every 64th sample; #N canvas 0 0 486 336 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X obj 92 84 loadbang; #X obj 48 182 s \$0-IR; #X msg 205 71 const 0; #X msg 48 120 0 0 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X connect 0 0 5 0; #X connect 1 0 4 0; #X connect 2 0 5 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X restore 788 268 pd; #X obj 801 250 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 818 247 clear; #X obj 788 231 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 805 228 load; #X text 850 237 IR; #X text 14 405 filtered output signal; #X text 334 404 error signal; #X text 464 465 constrain; #X text 464 475 coefficients; #X msg 447 430 0; #X obj 447 450 speedlim 100; #X obj 105 422 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #N canvas 0 0 478 328 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; #X msg 137 115 39; #X msg 92 190 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 92 169 tabread 1_\$0-W; #X obj 92 214 tabwrite 1_\$0-W; #X msg 177 192 \$1 39; #X msg 260 191 \$1 39; #X obj 260 170 tabread 3_\$0-W; #X obj 260 215 tabwrite 3_\$0-W; #X obj 177 171 tabread 2_\$0-W; #X obj 177 216 tabwrite 2_\$0-W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 1 0 12 0; #X connect 1 0 10 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; #X connect 12 0 8 0; #X restore 787 314 pd; #X text 812 320 update of W; #X text 811 309 graphical; #X text 106 327 minimum input value; #X msg 112 228 0.1; #X msg 70 309 1e-05; #X text 165 266 beta [0 .. 2]; #X text 126 346 gamma [0 .. 1]; #X obj 537 57 cnv 15 68 17 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #N canvas 0 0 499 295 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 8 135 normalized learn rate:; #X text 119 73 error:; #X text 116 55 output:; #X text 7 210 coefficient iteration:; #X text 176 213 W(k+1 \, i) = leakage*W(k \, i) + µ(n)* e(n)* x(n); #X text 173 54 y(n) = Wá´´ * x(n); #X text 173 72 e(n) = d(n) - Wá´´ * x(n); #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 280 129 beta; #X text 174 135 µ(n) =; #X text 223 145 ∑ x[n-i]² + gamma²*blocksize; #X text 223 130 ____________________________; #X restore 537 57 pd FORMULAS; #X obj 112 248 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 112 248 5 0 2 0 - - - 0; #X text 148 247 learn-rate; #X obj 70 329 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 70 329 5 0 1 0 - - - 0; #X floatatom 35 236 5 0 0 0 - - - 0; #X text 536 39 Normalized Least Mean Square (linear adaptive FIR-filter); #N canvas 0 0 450 300 (subpatch) 0; #X array 2_\$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 309 527 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array 3_\$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 559 527 graph; #X obj 239 471 unsig~; #X floatatom 239 497 9 0 0 0 - - - 0; #X obj 329 469 unsig~; #X floatatom 329 495 9 0 0 0 - - - 0; #X obj 263 243 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 263 243 5 0 10000 0 - - - 0; #X msg 263 261 kappa \$1; #X msg 263 223 1; #X obj 418 301 FIR~ \$0-IR 32; #X obj 181 301 z~ 2; #X obj 299 301 z~ 4; #X text 36 373 x1(n); #X text 267 373 x3(n); #X text 186 372 x2(n); #X text 34 418 y1(n) = 1_W * x1(n); #X obj 191 437 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X obj 281 411 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 120 433 y2(n) = 2_W * x2(n); #X text 210 407 y3(n) = 3_W * x3(n); #X obj 370 433 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 336 429 - 1_W * x1(n); #X text 307 418 e(n) = d(n); #X obj 370 443 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 336 439 - 2_W * x2(n); #X obj 370 453 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 336 449 - 3_W * x3(n); #X text 536 28 Multi Channel Constraint; #X text 482 240 minimum input value; #X obj 446 242 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 446 242 5 0 10000 0 - - - 0; #X msg 446 222 1; #X msg 446 260 leakage \$1; #X text 526 264 leakage [0 .. 1]; #X text 530 173 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 558 186 [noisternig \, musil]_AT_iem.at; #X text 535 79 1.arg: number of channels n; #X text 535 92 2.arg: number of order of FIR-filter; #X text 535 106 3.arg: learn-rate = beta; #X text 328 260 kappa; #X text 299 241 constraint; #X text 536 131 5.arg: constraint = kappa; #X text 535 118 4.arg: regularization parameter = gamma; #X text 536 143 6.arg: leakage; #X text 536 156 7.arg: table-name of W; #X obj 810 617 declare -lib iem_adaptfilt -lib iemlib -path iemlib -lib zexy -path zexy, f 27; #X obj 63 390 n_CLNLMS~ 3 32 0.1 1e-05 1 0.95 \$0-W, f 60; #X connect 1 0 108 0; #X connect 2 0 108 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 8 0 71 0; #X connect 8 0 72 0; #X connect 8 0 73 0; #X connect 8 0 108 0; #X connect 9 0 10 0; #X connect 10 0 59 0; #X connect 12 0 108 0; #X connect 16 0 17 0; #X connect 18 0 19 0; #X connect 21 0 44 0; #X connect 32 0 31 1; #X connect 34 0 31 0; #X connect 41 0 42 0; #X connect 42 0 7 0; #X connect 48 0 55 0; #X connect 49 0 58 0; #X connect 55 0 2 0; #X connect 58 0 12 0; #X connect 59 0 1 0; #X connect 63 0 64 0; #X connect 65 0 66 0; #X connect 68 0 69 0; #X connect 69 0 108 0; #X connect 70 0 68 0; #X connect 71 0 108 3; #X connect 72 0 108 1; #X connect 73 0 108 2; #X connect 92 0 94 0; #X connect 93 0 92 0; #X connect 94 0 108 0; #X connect 108 0 16 0; #X connect 108 1 18 0; #X connect 108 2 63 0; #X connect 108 3 65 0; #X connect 108 4 41 0; iem_utils-0.0.20240903/iem_adaptfilt/help/n_CNLMS~-help.pd0000600000000000000000000001772614665566711017615 0ustar00#N canvas 185 80 1021 690 10; #X declare -lib iem_adaptfilt -lib iemlib -path iemlib -lib zexy -path zexy; #N canvas 0 0 450 300 (subpatch) 0; #X array 1_\$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1 0 0; #X restore 64 529 graph; #X msg 40 257 update \$1; #X msg 117 267 beta \$1; #X obj 456 36 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1; #X obj 456 57 dsp; #X floatatom 456 103 5 0 0 0 - - - 0; #X floatatom 469 82 5 0 0 0 - - - 0; #X obj 452 473 bng 15 150 20 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X obj 68 287 noise~; #X obj 40 70 vradio 15 1 0 8 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0; #N canvas 165 115 464 314 (subpatch) 0; #X obj 76 61 inlet; #X msg 32 163 0; #X msg 63 159 1; #X msg 97 158 2; #X msg 132 156 4; #X msg 159 157 8; #X msg 191 162 16; #X msg 219 164 32; #X msg 248 165 64; #X obj 76 84 sel 0 1 2 3 4 5 6 7; #X obj 32 217 outlet; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 1 0; #X connect 9 1 2 0; #X connect 9 2 3 0; #X connect 9 3 4 0; #X connect 9 4 5 0; #X connect 9 5 6 0; #X connect 9 6 7 0; #X connect 9 7 8 0; #X restore 40 217 pd; #X text 22 51 internal downsampling of update; #X msg 75 349 gamma \$1; #X text 90 375 input signal; #X text 335 374 desired signal; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-IR 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 240 35 graph; #X obj 69 472 unsig~; #X floatatom 69 498 9 0 0 0 - - - 0; #X obj 155 472 unsig~; #X floatatom 155 498 9 0 0 0 - - - 0; #X text 426 374 d(n); #X obj 516 280 loadbang; #X text 704 57 (array-sizes have to be >= then FIR_size); #X text 654 47 1.arg: number of order of FIR-filter; #X text 57 83 update every sample; #X text 57 68 stop \, no update; #X text 57 98 update every 2nd sample; #X text 57 113 update every 4th sample; #X text 57 128 update every 8th sample; #X text 57 143 update every 16th sample; #X text 57 158 update every 32nd sample; #X text 57 173 update every 64th sample; #N canvas 0 0 486 336 (subpatch) 0; #X obj 48 46 inlet; #X obj 205 47 inlet; #X obj 92 84 loadbang; #X obj 48 182 s \$0-IR; #X msg 205 71 const 0; #X msg 48 120 0 0 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X connect 0 0 5 0; #X connect 1 0 4 0; #X connect 2 0 5 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X restore 517 255 pd; #X obj 530 237 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 547 234 clear; #X obj 517 218 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; #X text 534 215 load; #X text 579 224 IR; #X text 19 407 filtered output signal; #X text 339 406 error signal; #X text 469 467 constrain; #X text 469 477 coefficients; #X msg 452 432 0; #X obj 452 452 speedlim 100; #X obj 110 424 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #N canvas 0 0 482 332 (subpatch) 0; #X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; #X msg 137 115 39; #X msg 92 190 \$1 39; #X msg 136 53 1; #X obj 137 92 metro 200; #X obj 136 24 inlet; #X obj 92 169 tabread 1_\$0-W; #X obj 92 214 tabwrite 1_\$0-W; #X msg 177 192 \$1 39; #X msg 260 191 \$1 39; #X obj 260 170 tabread 3_\$0-W; #X obj 260 215 tabwrite 3_\$0-W; #X obj 177 171 tabread 2_\$0-W; #X obj 177 216 tabwrite 2_\$0-W; #X connect 0 0 4 0; #X connect 1 0 6 0; #X connect 1 0 12 0; #X connect 1 0 10 0; #X connect 2 0 7 0; #X connect 3 0 0 0; #X connect 4 0 1 0; #X connect 5 0 3 0; #X connect 6 0 2 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; #X connect 12 0 8 0; #X restore 516 301 pd; #X text 541 307 update of W; #X text 540 296 graphical; #X text 111 329 minimum input value; #X msg 117 230 0.1; #X msg 75 311 1e-05; #X text 170 268 beta [0 .. 2]; #X text 131 348 gamma [0 .. 1]; #X obj 574 48 cnv 15 68 17 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #N canvas 0 0 568 372 FORMULAS 0; #X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 6 135 normalized learn rate:; #X text 119 73 error:; #X text 116 55 output:; #X text 7 212 coefficient iteration:; #X text 176 213 W(k+1 \, i) = W(k \, i) + µ(n)* e(n)* x(n); #X text 173 54 y(n) = Wá´´ * x(n); #X text 173 72 e(n) = d(n) - Wá´´ * x(n); #X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X text 280 129 beta; #X text 174 135 µ(n) =; #X text 223 145 ∑ x[n-i]² + gamma²*blocksize; #X text 223 130 ____________________________; #X restore 573 49 pd FORMULAS; #X obj 117 250 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 117 250 5 0 2 0 - - - 0; #X text 153 249 learn-rate; #X obj 75 331 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 75 331 5 0 1 0 - - - 0; #X floatatom 40 238 5 0 0 0 - - - 0; #X text 572 24 Normalized Least Mean Square (linear adaptive FIR-filter); #N canvas 0 0 450 300 (subpatch) 0; #X array 2_\$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 314 529 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array 3_\$0-W 40 float 0; #X coords 0 1 39 -1 200 140 1; #X restore 564 529 graph; #X obj 244 473 unsig~; #X floatatom 244 499 9 0 0 0 - - - 0; #X obj 334 471 unsig~; #X floatatom 334 497 9 0 0 0 - - - 0; #X text 304 243 minimum input value; #X obj 268 245 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0; #X floatatom 268 245 5 0 10000 0 - - - 0; #X msg 268 263 kappa \$1; #X text 324 262 kappa [0 .. 1]; #X msg 268 225 1; #X obj 423 303 FIR~ \$0-IR 32; #X obj 186 303 z~ 2; #X obj 304 303 z~ 4; #X text 41 375 x1(n); #X text 272 375 x3(n); #X text 191 374 x2(n); #X text 39 420 y1(n) = 1_W * x1(n); #X obj 196 439 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X obj 286 413 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 125 435 y2(n) = 2_W * x2(n); #X text 215 409 y3(n) = 3_W * x3(n); #X obj 375 435 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 341 431 - 1_W * x1(n); #X text 312 420 e(n) = d(n); #X obj 375 445 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 341 441 - 2_W * x2(n); #X obj 375 455 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0; #X text 341 451 - 3_W * x3(n); #X text 572 13 Multi Channel Constraint; #X text 654 160 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria; #X text 682 173 [noisternig \, musil]_AT_iem.at; #X text 655 74 2.arg: number of order of FIR-filter; #X text 655 88 3.arg: learn-rate = beta; #X text 656 113 5.arg: constraint = kappa; #X text 655 100 4.arg: regularization parameter = gamma; #X text 656 128 6.arg: table-name of W; #X obj 783 267 declare -lib iem_adaptfilt -lib iemlib -path iemlib -lib zexy -path zexy, f 27; #X msg 458 139 bang; #N canvas 735 418 450 300 RESET 0; #X obj 37 37 inlet; #X msg 37 60 const 0; #X obj 76 106 s 1_\$0-W; #X obj 56 129 s 2_\$0-W; #X obj 37 152 s 3_\$0-W; #X obj 37 83 t a a a; #X connect 0 0 1 0; #X connect 1 0 5 0; #X connect 5 0 4 0; #X connect 5 1 3 0; #X connect 5 2 2 0; #X restore 458 162 pd RESET TABLES; #X obj 68 392 n_CNLMS~ 3 32 0.1 1e-05 1 \$0-W, f 60; #X connect 1 0 103 0; #X connect 2 0 103 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 4 1 6 0; #X connect 8 0 74 0; #X connect 8 0 75 0; #X connect 8 0 76 0; #X connect 8 0 103 0; #X connect 9 0 10 0; #X connect 10 0 60 0; #X connect 12 0 103 0; #X connect 16 0 17 0; #X connect 18 0 19 0; #X connect 21 0 45 0; #X connect 33 0 32 1; #X connect 35 0 32 0; #X connect 42 0 43 0; #X connect 43 0 7 0; #X connect 49 0 56 0; #X connect 50 0 59 0; #X connect 56 0 2 0; #X connect 59 0 12 0; #X connect 60 0 1 0; #X connect 64 0 65 0; #X connect 66 0 67 0; #X connect 70 0 71 0; #X connect 71 0 103 0; #X connect 73 0 70 0; #X connect 74 0 103 3; #X connect 75 0 103 1; #X connect 76 0 103 2; #X connect 101 0 102 0; #X connect 103 0 16 0; #X connect 103 1 18 0; #X connect 103 2 64 0; #X connect 103 3 66 0; #X connect 103 4 42 0; iem_utils-0.0.20240903/iem_adaptfilt/include/0000700000000000000000000000000014665566711015427 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/include/iemlib.h0000600000000000000000000001367114665566711017053 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2018 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) #ifdef _WIN32 //t_symbol *iemgui_key_sym=0; #include #else //extern t_symbol *iemgui_key_sym; #include #endif extern int sys_noloadbang; //millers m_pd.h beg /* Microsoft Visual Studio is not C99, it does not provide stdint.h */ #ifdef _MSC_VER typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else # include #endif #if !defined(PD_FLOATSIZE) /* if compiled pd version < 0.47*/ # define PD_FLOATSIZE 32 #endif typedef union { float f; unsigned int ui; }t_iemdenormal_f; typedef union { double f; unsigned int ui[2]; }t_iemdenormal_d; #ifndef _MSC_VER /* Micrsoft compiler can't handle "inline" function/macros */ #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) /* a test for NANs and denormals. Should only be necessary on x86 variants. */ /* on arm, the impact is less noticeable, but...why not? */ static inline int IEM_DENORMAL_F(float f) /* malformed float 32 */ { t_iemdenormal_f pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } static inline int IEM_DENORMAL_D(double f) /* malformed double 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 typedef union { t_float f; unsigned int ui; }t_iemdenormal_t32; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 32 */ { t_iemdenormal_t32 pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } #elif PD_FLOATSIZE == 64 typedef union { t_float f; unsigned int ui[2]; }t_iemdenormal_t64; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif /* PD_FLOATSIZE */ #else /* not INTEL or ARM */ #define IEM_DENORMAL_T(f) 0 #define IEM_DENORMAL_D(f) 0 #endif #else /* _MSC_VER */ #define IEM_DENORMAL_F(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) static int IEM_DENORMAL_D(double f) /* malformed t_float 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 #define IEM_DENORMAL_T(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) #else /* 64 bits... don't know what to do here */ //#define IEM_DENORMAL_T(f) (!(((f) >= 0) || ((f) <= 0))) int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif #endif /* _MSC_VER */ //millers m_pd.h end /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #ifndef BUILD_DATE # define BUILD_DATE "" __DATE__ " : " __TIME__ #endif #if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43) # define iem_open sys_open # define iem_close sys_close # define iem_fopen sys_fopen # define iem_fclose sys_fclose #else # define iem_open open # define iem_close close # define iem_fopen fopen # define iem_fclose fclose #endif // millers d_osc.c beg #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) \ || defined(__OpenBSD__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \ defined(ANDROID) #include #endif #ifdef __MINGW32__ #include #endif #ifdef _MSC_VER /* _MSVC lacks BYTE_ORDER and LITTLE_ENDIAN */ #define LITTLE_ENDIAN 0x0001 #define BYTE_ORDER LITTLE_ENDIAN #endif #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 #else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ #endif union tabfudge { double tf_d; int32_t tf_i[2]; }; #ifndef COSTABSIZE # define COSTABSIZE 512 #endif // millers d_osc.c end // millers d_delay.c beg #define IEMDEFDELVS 64 #define IEMXTRASAMPS 4 #define IEMSAMPBLK 4 // millers d_delay.c end #endif iem_utils-0.0.20240903/iem_adaptfilt/pd-lib-builder/0000700000000000000000000000000014665566711016577 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711020633 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/iem_adaptfilt/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711022707 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/iem_adaptfilt/pd-lib-builder/README.md0000600000000000000000000001314614665566711020065 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/iem_adaptfilt/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711021373 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/iem_adaptfilt/src/0000700000000000000000000000000014665566711014573 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/src/FXNLMSplus2in~.c0000600000000000000000000002355014665566711017470 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMS normalized least mean square (LMS) algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- FXNLMSplus2in~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- the difference to NLMS~ is: we have only one ERROR input instead of desired in minus filter out -- */ /* -- that means there is no feedback -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct FXNLMSplus2in_tilde { t_object x_obj;// common pd object structure t_symbol *x_w_array_sym_name; t_word *x_w_array_mem_beg; t_float *x_ref_filt_in_hist;// history buffer for input signal reference for internal convolution = filter t_float *x_ref_adapt_in_hist;// history buffer for input signal reference for internal adapting filter int x_rw_index;// current read-write-index in circular buffer int x_n_order;// order of filter or convolution int x_update;// binary update parameter ON / OFF t_float x_alpha;// leakage Parameter = decrease factor of w_array t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization Parameter = minimum t_float x_flt_sig_in1; } t_FXNLMSplus2in_tilde; t_class *FXNLMSplus2in_tilde_class; static void FXNLMSplus2in_tilde_alpha(t_FXNLMSplus2in_tilde *x, t_floatarg f) // leakage { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_alpha = f; } static void FXNLMSplus2in_tilde_beta(t_FXNLMSplus2in_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2000.0f) f = 2000.0f; x->x_beta = f; } static void FXNLMSplus2in_tilde_gamma(t_FXNLMSplus2in_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void FXNLMSplus2in_tilde_update(t_FXNLMSplus2in_tilde *x, t_floatarg f) // downsample learn-rate { int u = (int)f; if((u > 2) || (u < 0)) // u==0...no update, u==1...normal update, u==2...wrong update u = 0; x->x_update = u; } /* ============== DSP ======================= */ static t_int *FXNLMSplus2in_tilde_perform_zero(t_int *w) { t_int n = (t_int)(w[6]), i; t_sample *filt_out = (t_sample *)(w[4]); for(i=0; ix_n_order; /* number of filter-order */ int rw_index = x->x_rw_index; /* current read write index in circular buffer */ int update = x->x_update; t_float alpha = x->x_alpha; /* leakage */ t_float beta = x->x_beta; /* learn rate */ t_float gammax = x->x_gamma; /* minimum energy */ t_float my, my_err, sum, errin; int j, k; if(!x->x_w_array_mem_beg) goto FXNLMSplus2in_tildeperfzero;// this is quick&dirty Musil/Miller style for(i=0; ix_ref_filt_in_hist[rw_index] = ref_filt_in[i]; // inputs of ref_filt save to history x->x_ref_adapt_in_hist[rw_index] = ref_adapt_in[i]; // inputs of ref_adapt save to history errin = err_in[i]; // begin convolution, filter : j++, k--, rw_index = aktueller index fuer lesen schreiben von history und convolution-beginn sum = 0.0f; k = rw_index; for(j=0; jx_w_array_mem_beg, j) * x->x_ref_filt_in_hist[k]; k--; if(k < 0) k = n_order - 1; } filt_out[i] = sum; if(update) // downsampling for learn rate { sum = 0.0f;// calculate energy for last n-order samples in filter k = rw_index; if(update == 1) // correct energy from ref_adapt { for(j=0; jx_ref_adapt_in_hist[k] * x->x_ref_adapt_in_hist[k]; // correct energy calculation k--; if(k < 0) k = n_order - 1; } } else // incorrect energy from ref_filt (multiplied by 4) { for(j=0; jx_ref_filt_in_hist[k] * x->x_ref_filt_in_hist[k]; // wrong energy calculation k--; if(k < 0) k = n_order - 1; } } sum += gammax * gammax * (float)n_order; // convert gammax corresponding to filter order my = beta / sum;// calculate mue my_err = my * errin; k = rw_index; for(j=0; jx_w_array_mem_beg, j, alpha * iemarray_getfloat(x->x_w_array_mem_beg, j) + x->x_ref_adapt_in_hist[k] * my_err); // leakage k--; if(k < 0) k = n_order - 1; } } rw_index++; if(rw_index >= n_order) rw_index = 0; } x->x_rw_index = rw_index; // back to start return(w+7); FXNLMSplus2in_tildeperfzero: while(n--) { *filt_out++ = 0.0f; } return(w+7); } static void FXNLMSplus2in_tilde_dsp(t_FXNLMSplus2in_tilde *x, t_signal **sp) { x->x_w_array_mem_beg = iemarray_check(x, "FXNLMSplus2in~", x->x_w_array_sym_name, x->x_n_order); if(!x->x_w_array_mem_beg) dsp_add(FXNLMSplus2in_tilde_perform_zero, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else dsp_add(FXNLMSplus2in_tilde_perform, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); } /* setup/setdown things */ static void FXNLMSplus2in_tilde_free(t_FXNLMSplus2in_tilde *x) { freebytes(x->x_ref_filt_in_hist, x->x_n_order*sizeof(t_float)); freebytes(x->x_ref_adapt_in_hist, x->x_n_order*sizeof(t_float)); } static void *FXNLMSplus2in_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_FXNLMSplus2in_tilde *x = (t_FXNLMSplus2in_tilde *)pd_new(FXNLMSplus2in_tilde_class); int n_order=39; t_symbol *w_name; t_float alpha=0.999f; t_float beta=0.01f; t_float gammax=0.00001f; if((argc >= 5) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_SYMBOL(argv,4)) { n_order = (int)atom_getfloatarg(0, argc, argv); alpha = (t_float)atom_getfloatarg(1, argc, argv); beta = (t_float)atom_getfloatarg(2, argc, argv); gammax = (t_float)atom_getfloatarg(3, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(4, argc, argv); if(alpha < 0.0f) alpha = 0.0f; if(alpha > 1.0f) alpha = 1.0f; if(beta < 0.0f) beta = 0.0f; if(beta > 2000.0f) beta = 2000.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 1111111) n_order = 1111111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_flt_sig_in1 = 0; x->x_n_order = n_order; x->x_update = 0; x->x_alpha = alpha; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time err_in memory allocation (history) x->x_ref_filt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); x->x_ref_adapt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (t_word *)0; x->x_rw_index = 0; return(x); } else { pd_error(0, "%s: need 4 float- + 1 symbol-arguments:", s->s_name); pd_error(0, " order_of_filter + leakage + learnrate + security_value + array_name_taps"); return(0); } } void FXNLMSplus2in_tilde_setup(void) { FXNLMSplus2in_tilde_class = class_new(gensym("FXNLMSplus2in~"), (t_newmethod)FXNLMSplus2in_tilde_new, (t_method)FXNLMSplus2in_tilde_free, sizeof(t_FXNLMSplus2in_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(FXNLMSplus2in_tilde_class, t_FXNLMSplus2in_tilde, x_flt_sig_in1); class_addmethod(FXNLMSplus2in_tilde_class, (t_method)FXNLMSplus2in_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(FXNLMSplus2in_tilde_class, (t_method)FXNLMSplus2in_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(FXNLMSplus2in_tilde_class, (t_method)FXNLMSplus2in_tilde_alpha, gensym("alpha"), A_FLOAT, 0); //method: decrease of w_array class_addmethod(FXNLMSplus2in_tilde_class, (t_method)FXNLMSplus2in_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(FXNLMSplus2in_tilde_class, (t_method)FXNLMSplus2in_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal } iem_utils-0.0.20240903/iem_adaptfilt/src/FXNLMSplus3in~.c0000600000000000000000000002246214665566711017472 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMS normalized least mean square (LMS) algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- FXNLMSplus3in~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- the difference to NLMS~ is: we have only one ERROR input instead of desired in minus filter out -- */ /* -- that means there is no feedback -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct FXNLMSplus3in_tilde { t_object x_obj;// common pd object structure t_symbol *x_w_array_sym_name; iemarray_t *x_w_array_mem_beg; t_float *x_ref_filt_in_hist;// history buffer for input signal reference for internal convolution = filter t_float *x_ref_adapt_in_hist;// history buffer for input signal reference for internal adapting filter int x_rw_index;// current read-write-index in circular buffer int x_n_order;// order of filter or convolution int x_update;// binary update parameter ON / OFF t_float x_alpha;// leakage Parameter = decrease factor of w_array t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization Parameter = minimum t_float x_flt_sig_in1; } t_FXNLMSplus3in_tilde; t_class *FXNLMSplus3in_tilde_class; static void FXNLMSplus3in_tilde_alpha(t_FXNLMSplus3in_tilde *x, t_floatarg f) // leakage { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_alpha = f; } static void FXNLMSplus3in_tilde_beta(t_FXNLMSplus3in_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2000.0f) f = 2000.0f; x->x_beta = f; } static void FXNLMSplus3in_tilde_gamma(t_FXNLMSplus3in_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void FXNLMSplus3in_tilde_update(t_FXNLMSplus3in_tilde *x, t_floatarg f) // downsample learn-rate { int u = (int)f; if((u > 2) || (u < 0)) // u==0...no update, u==1...normal update, u==2...wrong update u = 0; x->x_update = u; } /* ============== DSP ======================= */ static t_int *FXNLMSplus3in_tilde_perform_zero(t_int *w) { t_int n = (t_int)(w[6]), i; t_sample *filt_out = (t_sample *)(w[4]); for(i=0; ix_n_order; /* number of filter-order */ int rw_index = x->x_rw_index; /* current read write index in circular buffer */ int update = x->x_update; t_float alpha = x->x_alpha; /* leakage */ t_float beta = x->x_beta; /* learn rate */ t_float gammax = x->x_gamma; /* minimum energy */ t_float my, my_err, sum, errin; int j, k; if(!x->x_w_array_mem_beg) goto FXNLMSplus3in_tildeperfzero;// this is quick&dirty Musil/Miller style for(i=0; ix_ref_filt_in_hist[rw_index] = ref_filt_in[i]; // inputs of ref_filt save to history x->x_ref_adapt_in_hist[rw_index] = ref_adapt_in[i]; // inputs of ref_adapt save to history errin = err_in[i]; // begin convolution, filter : j++, k--, rw_index = aktueller index fuer lesen schreiben von history und convolution-beginn sum = 0.0f; k = rw_index; for(j=0; jx_w_array_mem_beg, j) * x->x_ref_filt_in_hist[k]; k--; if(k < 0) k = n_order - 1; } filt_out[i] = sum; if(update) // downsampling for learn rate { sum = ref_pow_in[i]; sum += gammax * gammax * (float)n_order; // convert gammax corresponding to filter order my = beta / sum;// calculate mue my_err = my * errin; k = rw_index; for(j=0; jx_w_array_mem_beg, j, iemarray_getfloat(x->x_w_array_mem_beg, j) * alpha + x->x_ref_adapt_in_hist[k] * my_err); // leakage k--; if(k < 0) k = n_order - 1; } } rw_index++; if(rw_index >= n_order) rw_index = 0; } x->x_rw_index = rw_index; // back to start return(w+8); FXNLMSplus3in_tildeperfzero: while(n--) { *filt_out++ = 0.0f; } return(w+8); } static void FXNLMSplus3in_tilde_dsp(t_FXNLMSplus3in_tilde *x, t_signal **sp) { x->x_w_array_mem_beg = iemarray_check(x, "FXNLMSplus3in~", x->x_w_array_sym_name, x->x_n_order); if(!x->x_w_array_mem_beg) dsp_add(FXNLMSplus3in_tilde_perform_zero, 7, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[4]->s_vec, x, sp[0]->s_n); else dsp_add(FXNLMSplus3in_tilde_perform, 7, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[4]->s_vec, x, sp[0]->s_n); } /* setup/setdown things */ static void FXNLMSplus3in_tilde_free(t_FXNLMSplus3in_tilde *x) { freebytes(x->x_ref_filt_in_hist, x->x_n_order*sizeof(t_float)); freebytes(x->x_ref_adapt_in_hist, x->x_n_order*sizeof(t_float)); } static void *FXNLMSplus3in_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_FXNLMSplus3in_tilde *x = (t_FXNLMSplus3in_tilde *)pd_new(FXNLMSplus3in_tilde_class); int n_order=39; t_symbol *w_name; t_float alpha=0.999f; t_float beta=0.01f; t_float gammax=0.00001f; if((argc >= 5) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_SYMBOL(argv,4)) { n_order = (int)atom_getfloatarg(0, argc, argv); alpha = (t_float)atom_getfloatarg(1, argc, argv); beta = (t_float)atom_getfloatarg(2, argc, argv); gammax = (t_float)atom_getfloatarg(3, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(4, argc, argv); if(alpha < 0.0f) alpha = 0.0f; if(alpha > 1.0f) alpha = 1.0f; if(beta < 0.0f) beta = 0.0f; if(beta > 2000.0f) beta = 2000.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 1111111) n_order = 1111111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_flt_sig_in1 = 0; x->x_n_order = n_order; x->x_update = 0; x->x_alpha = alpha; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time err_in memory allocation (history) x->x_ref_filt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); x->x_ref_adapt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (iemarray_t *)0; x->x_rw_index = 0; return(x); } else { pd_error(0, "%s: need 4 float- + 1 symbol-arguments:", s->s_name); pd_error(0, " order_of_filter + leakage + learnrate + security_value + array_name_taps"); return(0); } } void FXNLMSplus3in_tilde_setup(void) { FXNLMSplus3in_tilde_class = class_new(gensym("FXNLMSplus3in~"), (t_newmethod)FXNLMSplus3in_tilde_new, (t_method)FXNLMSplus3in_tilde_free, sizeof(t_FXNLMSplus3in_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(FXNLMSplus3in_tilde_class, t_FXNLMSplus3in_tilde, x_flt_sig_in1); class_addmethod(FXNLMSplus3in_tilde_class, (t_method)FXNLMSplus3in_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(FXNLMSplus3in_tilde_class, (t_method)FXNLMSplus3in_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(FXNLMSplus3in_tilde_class, (t_method)FXNLMSplus3in_tilde_alpha, gensym("alpha"), A_FLOAT, 0); //method: decrease of w_array class_addmethod(FXNLMSplus3in_tilde_class, (t_method)FXNLMSplus3in_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(FXNLMSplus3in_tilde_class, (t_method)FXNLMSplus3in_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal } iem_utils-0.0.20240903/iem_adaptfilt/src/NLMSCC~.c0000600000000000000000000003072114665566711016121 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMSCC normalized LMS algorithm with coefficient constraints lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef _MSC_VER #pragma warning( disable : 4305 ) /* uncast const double to float */ #pragma warning( disable : 4244 ) /* uncast float/int conversion etc. */ #pragma warning( disable : 4101 ) /* unused automatic variables */ #endif /* _MSC_VER */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- NLMSCC~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- with Coefficient Constraint -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ /* */ typedef struct NLMSCC_tilde { t_object x_obj; t_symbol *x_w_array_sym_name; iemarray_t *x_w_array_mem_beg; t_symbol *x_wmin_array_sym_name; iemarray_t *x_wmin_array_mem_beg; t_symbol *x_wmax_array_sym_name; iemarray_t *x_wmax_array_mem_beg; t_float *x_io_ptr_beg[4];// memory: 2 sig-in and 2 sig-out vectors t_float *x_in_hist;// start point double buffer for sig-in history int x_rw_index;// read-write-index int x_n_order;// order of filter int x_update;// 2^n rounded value, downsampling of update speed t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization t_outlet *x_out_clipping_bang; t_clock *x_clock; t_float x_msi; } t_NLMSCC_tilde; t_class *NLMSCC_tilde_class; static void NLMSCC_tilde_tick(t_NLMSCC_tilde *x) { outlet_bang(x->x_out_clipping_bang); } static void NLMSCC_tilde_beta(t_NLMSCC_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void NLMSCC_tilde_gamma(t_NLMSCC_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void NLMSCC_tilde_update(t_NLMSCC_tilde *x, t_floatarg f) // downsample of learn-rate { int i=1, u = (int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round downwards i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *NLMSCC_tilde_perform_zero(t_int *w) { t_NLMSCC_tilde *x = (t_NLMSCC_tilde *)(w[1]); t_int n = (t_int)(w[2]), i; t_float **io = x->x_io_ptr_beg; t_sample *out; int j; for(j=0; j<2; j++)/* output-vector-row */ { out = io[j+2]; for(i=0; ix_n_order; /* filter-order */ int rw_index = x->x_rw_index; t_sample *in = x->x_io_ptr_beg[0];// first sig in t_sample *desired_in = x->x_io_ptr_beg[1], din;// second sig in t_sample *filt_out = x->x_io_ptr_beg[2];// first sig out t_sample *err_out = x->x_io_ptr_beg[3], eout;// second sig out t_float *write_in_hist1 = x->x_in_hist; t_float *write_in_hist2 = write_in_hist1+n_order; t_float *read_in_hist = write_in_hist2; iemarray_t *w_filt_coeff = x->x_w_array_mem_beg; iemarray_t *wmin_filt_coeff = x->x_wmin_array_mem_beg; iemarray_t *wmax_filt_coeff = x->x_wmax_array_mem_beg; t_float my, my_err, sum; t_float beta = x->x_beta; t_float gammax = x->x_gamma; int j, update_counter; int update = x->x_update; int ord8=n_order&0xfffffff8; int ord_residual=n_order&0x7; int clipped = 0; if(!w_filt_coeff) goto NLMSCC_tildeperfzero;// this is Musil/Miller style if(!wmin_filt_coeff) goto NLMSCC_tildeperfzero; if(!wmax_filt_coeff) goto NLMSCC_tildeperfzero;// if not constrained, perform zero for(i=0, update_counter=0; ix_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &write_in_hist2[rw_index]; for(j=0; j= update) { update_counter = 0; sum = 0.0f;// calculate energy for last n-order samples in filter read_in_hist = &write_in_hist2[rw_index]; for(j=0; jx_w_array_mem_beg; // coefficient constraints wmin_filt_coeff = x->x_wmin_array_mem_beg; wmax_filt_coeff = x->x_wmax_array_mem_beg; read_in_hist = &write_in_hist2[rw_index]; for(j=0; j iemarray_getfloat(wmax_filt_coeff, j)) { iemarray_setfloat(w_filt_coeff, j, iemarray_getfloat(wmax_filt_coeff, j)); clipped = 1; } else if(iemarray_getfloat(w_filt_coeff, j) < iemarray_getfloat(wmin_filt_coeff, j)) { iemarray_setfloat(w_filt_coeff, j, iemarray_getfloat(wmin_filt_coeff, j)); clipped = 1; } } } } rw_index++; if(rw_index >= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // back to start if(clipped) clock_delay(x->x_clock, 0); return(w+3); NLMSCC_tildeperfzero: while(n--) { *filt_out++ = 0.0f; *err_out++ = 0.0f; } return(w+3); } static void NLMSCC_tilde_dsp(t_NLMSCC_tilde *x, t_signal **sp) { t_int n = sp[0]->s_n; int i; for(i=0; i<4; i++) // store io_vec x->x_io_ptr_beg[i] = sp[i]->s_vec; x->x_w_array_mem_beg = iemarray_check(x, "NLMSCC~", x->x_w_array_sym_name, x->x_n_order); x->x_wmin_array_mem_beg = iemarray_check(x, "NLMSCC~", x->x_wmin_array_sym_name, x->x_n_order); x->x_wmax_array_mem_beg = iemarray_check(x, "NLMSCC~", x->x_wmax_array_sym_name, x->x_n_order); if(!(x->x_w_array_mem_beg && x->x_wmin_array_mem_beg && x->x_wmax_array_mem_beg)) dsp_add(NLMSCC_tilde_perform_zero, 2, x, n); else dsp_add(NLMSCC_tilde_perform, 2, x, n); } /* setup/setdown things */ static void NLMSCC_tilde_free(t_NLMSCC_tilde *x) { freebytes(x->x_in_hist, 2*x->x_n_order*sizeof(t_float)); clock_free(x->x_clock); } static void *NLMSCC_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_NLMSCC_tilde *x = (t_NLMSCC_tilde *)pd_new(NLMSCC_tilde_class); int n_order=39; t_symbol *w_name; t_symbol *wmin_name; t_symbol *wmax_name; t_float beta=0.1f; t_float gammax=0.00001f; if((argc >= 6) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_SYMBOL(argv,4) && IS_A_SYMBOL(argv,5)) { n_order = (int)atom_getfloatarg(0, argc, argv); beta = (t_float)atom_getfloatarg(1, argc, argv); gammax = (t_float)atom_getfloatarg(2, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(3, argc, argv); wmin_name = (t_symbol *)atom_getsymbolarg(4, argc, argv); wmax_name = (t_symbol *)atom_getsymbolarg(5, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_out_clipping_bang = outlet_new(&x->x_obj, &s_bang); x->x_msi = 0; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time desired_in memory allocation (history) x->x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (iemarray_t *)0; x->x_wmin_array_sym_name = gensym(wmin_name->s_name); x->x_wmin_array_mem_beg = (iemarray_t *)0; x->x_wmax_array_sym_name = gensym(wmax_name->s_name); x->x_wmax_array_mem_beg = (iemarray_t *)0; x->x_clock = clock_new(x, (t_method)NLMSCC_tilde_tick); return(x); } else { pd_error(0, "%s: need 3 float- + 3 symbol-arguments:", s->s_name); pd_error(0, " order_of_filter + learnrate_beta + security_value + array_name_taps + array_name_tap_min + array_name_tap_max"); return(0); } } void NLMSCC_tilde_setup(void) { NLMSCC_tilde_class = class_new(gensym("NLMSCC~"), (t_newmethod)NLMSCC_tilde_new, (t_method)NLMSCC_tilde_free, sizeof(t_NLMSCC_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(NLMSCC_tilde_class, t_NLMSCC_tilde, x_msi); class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(NLMSCC_tilde_class, (t_method)NLMSCC_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal //class_sethelpsymbol(NLMSCC_tilde_class, gensym("iemhelp2/NLMSCC~")); } iem_utils-0.0.20240903/iem_adaptfilt/src/NLMSerr_in~.c0000600000000000000000000002073114665566711017112 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMS normalized least mean square (LMS) algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- NLMSerr_in~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- the difference to NLMS~ is: we have only one ERROR input instead of desired in minus filter out -- */ /* -- that means there is no feedback -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct NLMSerr_in_tilde { t_object x_obj;// common pd object structure t_symbol *x_w_array_sym_name; iemarray_t *x_w_array_mem_beg; t_float *x_ref_filt_in_hist;// history buffer for input signal reference for internal convolution = filter t_float *x_ref_adapt_in_hist;// history buffer for input signal reference for internal adapting filter int x_rw_index;// current read-write-index in circular buffer int x_n_order;// order of filter or convolution int x_update;// binary update parameter ON / OFF t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization Parameter = minimum t_float x_flt_sig_in1; } t_NLMSerr_in_tilde; t_class *NLMSerr_in_tilde_class; static void NLMSerr_in_tilde_beta(t_NLMSerr_in_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void NLMSerr_in_tilde_gamma(t_NLMSerr_in_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void NLMSerr_in_tilde_update(t_NLMSerr_in_tilde *x, t_floatarg f) // downsample learn-rate { int u = (int)f; if(u != 0) u = 1; x->x_update = u; } /* ============== DSP ======================= */ static t_int *NLMSerr_in_tilde_perform_zero(t_int *w) { t_int n = (t_int)(w[6]), i; t_float *filt_out = (t_float *)(w[4]); for(i=0; ix_n_order; /* number of filter-order */ int rw_index = x->x_rw_index; /* current read write index in circular buffer */ int update = x->x_update; t_float beta = x->x_beta; /* learn rate */ t_float gammax = x->x_gamma; /* minimum energy */ t_float my, my_err, sum, errin; int j, k; if(!x->x_w_array_mem_beg) goto NLMSerr_in_tildeperfzero;// this is quick&dirty Musil/Miller style for(i=0; ix_ref_filt_in_hist[rw_index] = ref_filt_in[i]; // inputs of ref_filt save to history x->x_ref_adapt_in_hist[rw_index] = ref_adapt_in[i]; // inputs of ref_adapt save to history errin = err_in[i]; // begin convolution, filter : j++, k--, rw_index = aktueller index fuer lesen schreiben von history und convolution-beginn sum = 0.0f; k = rw_index; for(j=0; jx_w_array_mem_beg, j) * x->x_ref_filt_in_hist[k]; k--; if(k < 0) k = n_order - 1; } filt_out[i] = sum; if(update) // downsampling for learn rate { sum = 0.0f;// calculate energy for last n-order samples in filter k = rw_index; for(j=0; jx_ref_adapt_in_hist[k] * x->x_ref_adapt_in_hist[k]; // energie k--; if(k < 0) k = n_order - 1; } sum += gammax * gammax * (float)n_order; // convert gammax corresponding to filter order my = beta / sum;// calculate mue my_err = my * errin; k = rw_index; for(j=0; jx_w_array_mem_beg, j, x->x_ref_adapt_in_hist[k] * my_err); k--; if(k < 0) k = n_order - 1; } } rw_index++; if(rw_index >= n_order) rw_index = 0; } x->x_rw_index = rw_index; // back to start return(w+7); NLMSerr_in_tildeperfzero: while(n--) { *filt_out++ = 0.0f; } return(w+7); } static void NLMSerr_in_tilde_dsp(t_NLMSerr_in_tilde *x, t_signal **sp) { x->x_w_array_mem_beg = iemarray_check(x, "NLMSerr_in~", x->x_w_array_sym_name, x->x_n_order); if(!x->x_w_array_mem_beg) dsp_add(NLMSerr_in_tilde_perform_zero, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else dsp_add(NLMSerr_in_tilde_perform, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); } /* setup/setdown things */ static void NLMSerr_in_tilde_free(t_NLMSerr_in_tilde *x) { freebytes(x->x_ref_filt_in_hist, x->x_n_order*sizeof(t_float)); freebytes(x->x_ref_adapt_in_hist, x->x_n_order*sizeof(t_float)); } static void *NLMSerr_in_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_NLMSerr_in_tilde *x = (t_NLMSerr_in_tilde *)pd_new(NLMSerr_in_tilde_class); int n_order=39; t_symbol*w_name; t_float beta=0.01f; t_float gammax=0.00001f; if((argc >= 4) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_SYMBOL(argv,3)) { n_order = (int)atom_getfloatarg(0, argc, argv); beta = (t_float)atom_getfloatarg(1, argc, argv); gammax = (t_float)atom_getfloatarg(2, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(3, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 1111111) n_order = 1111111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_flt_sig_in1 = 0; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time err_in memory allocation (history) x->x_ref_filt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); x->x_ref_adapt_in_hist = (t_float *)getbytes(x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (iemarray_t *)0; x->x_rw_index = 0; return(x); } else { pd_error(0, "%s: need 3 float- + 1 symbol-arguments:", s->s_name); pd_error(0, " order_of_filter + learnrate_beta + security_value + array_name_taps"); return(0); } } void NLMSerr_in_tilde_setup(void) { NLMSerr_in_tilde_class = class_new(gensym("NLMSerr_in~"), (t_newmethod)NLMSerr_in_tilde_new, (t_method)NLMSerr_in_tilde_free, sizeof(t_NLMSerr_in_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(NLMSerr_in_tilde_class, t_NLMSerr_in_tilde, x_flt_sig_in1); class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(NLMSerr_in_tilde_class, (t_method)NLMSerr_in_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal } iem_utils-0.0.20240903/iem_adaptfilt/src/NLMS~.c0000600000000000000000000002326014665566711015713 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. NLMS normalized least mean square (LMS) algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- NLMS~ ------------------------------ */ /* -- Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct NLMS_tilde { t_object x_obj; t_symbol *x_w_array_sym_name; iemarray_t *x_w_array_mem_beg; t_float *x_io_ptr_beg[4];// memory: 2 sig-in and 2 sig-out vectors t_float *x_in_hist;// start point double buffer for sig-in history int x_rw_index;// read-write-index int x_n_order;// order of filter int x_update;// 2^n rounded value, downsampling of update speed t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// regularization t_float x_msi; } t_NLMS_tilde; t_class *NLMS_tilde_class; static void NLMS_tilde_beta(t_NLMS_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void NLMS_tilde_gamma(t_NLMS_tilde *x, t_floatarg f) // regularization factor (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void NLMS_tilde_update(t_NLMS_tilde *x, t_floatarg f) // downsample learn-rate { int i=1, u = (int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round downwards i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *NLMS_tilde_perform_zero(t_int *w) { t_NLMS_tilde *x = (t_NLMS_tilde *)(w[1]); t_int n = (t_int)(w[2]), i; t_float **io = x->x_io_ptr_beg; t_sample *out; int j; for(j=0; j<2; j++)/* output-vector-row */ { out = io[j+2]; for(i=0; ix_n_order; /* number of filter-order */ int rw_index = x->x_rw_index; t_sample *in = x->x_io_ptr_beg[0];// first sig in t_sample *desired_in = x->x_io_ptr_beg[1], din;// second sig in t_sample *filt_out = x->x_io_ptr_beg[2];// first sig out t_sample *err_out = x->x_io_ptr_beg[3], eout;// second sig out t_float *write_in_hist1 = x->x_in_hist; t_float *write_in_hist2 = write_in_hist1+n_order; t_float *read_in_hist = write_in_hist2; iemarray_t *w_filt_coeff = x->x_w_array_mem_beg; t_float my, my_err, sum; t_float beta = x->x_beta; t_float gammax = x->x_gamma; int j, update_counter; int update = x->x_update; int ord8=n_order&0xfffffff8; int ord_residual=n_order&0x7; if(!w_filt_coeff) goto NLMS_tildeperfzero;// this is quick&dirty Musil/Miller style for(i=0, update_counter=0; ix_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &write_in_hist2[rw_index]; for(j=0; j= update) { update_counter = 0; sum = 0.0f;// calculate energy for last n-order samples in filter read_in_hist = &write_in_hist2[rw_index]; for(j=0; jx_w_array_mem_beg; // coefficient constraints read_in_hist = &write_in_hist2[rw_index]; for(j=0; j= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // back to start return(w+3); NLMS_tildeperfzero: while(n--) { *filt_out++ = 0.0f; *err_out++ = 0.0f; } return(w+3); } static void NLMS_tilde_dsp(t_NLMS_tilde *x, t_signal **sp) { t_int n = sp[0]->s_n; int i; for(i=0; i<4; i++) // store io_vec x->x_io_ptr_beg[i] = sp[i]->s_vec; x->x_w_array_mem_beg = iemarray_check(x, "NLMS~", x->x_w_array_sym_name, x->x_n_order); if(!x->x_w_array_mem_beg) dsp_add(NLMS_tilde_perform_zero, 2, x, n); else dsp_add(NLMS_tilde_perform, 2, x, n); } /* setup/setdown things */ static void NLMS_tilde_free(t_NLMS_tilde *x) { freebytes(x->x_in_hist, 2*x->x_n_order*sizeof(t_float)); } static void *NLMS_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_NLMS_tilde *x = (t_NLMS_tilde *)pd_new(NLMS_tilde_class); int n_order=39; t_symbol *w_name; t_float beta=0.1f; t_float gammax=0.00001f; if((argc >= 4) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_SYMBOL(argv,3)) { n_order = (int)atom_getfloatarg(0, argc, argv); beta = (t_float)atom_getfloatarg(1, argc, argv); gammax = (t_float)atom_getfloatarg(2, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(3, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; // 2 times in and one time desired_in memory allocation (history) x->x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); // table-symbols will be linked to their memory in future (dsp_routine) x->x_w_array_sym_name = gensym(w_name->s_name); x->x_w_array_mem_beg = (iemarray_t *)0; return(x); } else { pd_error(0, "%s: need 3 float- + 1 symbol-arguments:", s->s_name); pd_error(0, " order_of_filter + learnrate_beta + security_value + array_name_taps"); return(0); } } void NLMS_tilde_setup(void) { NLMS_tilde_class = class_new(gensym("NLMS~"), (t_newmethod)NLMS_tilde_new, (t_method)NLMS_tilde_free, sizeof(t_NLMS_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(NLMS_tilde_class, t_NLMS_tilde, x_msi); class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(NLMS_tilde_class, (t_method)NLMS_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal //class_sethelpsymbol(NLMS_tilde_class, gensym("iemhelp2/NLMS~")); } iem_utils-0.0.20240903/iem_adaptfilt/src/VC6/0000700000000000000000000000000014665566711015171 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/src/VC6/iem_adaptfilt.dsp0000600000000000000000000000511314665566711020505 0ustar00# Microsoft Developer Studio Project File - Name="iem_adaptfilt" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_adaptfilt - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak" CFG="iem_adaptfilt - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_adaptfilt - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_adaptfilt - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_adaptfilt - Win32 Release" # Name "iem_adaptfilt - Win32 Debug" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_adaptfilt/src/VC6/iem_adaptfilt.dsw0000600000000000000000000000110114665566711020505 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_adaptfilt"=.\iem_adaptfilt.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_adaptfilt/src/VC6/makefile_win0000600000000000000000000000205414665566711017551 0ustar00 all: ..\iem_adaptfilt.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_adaptfilt.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_adaptfilt_setup \ /out:..\iem_adaptfilt.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_adaptfilt/src/VC7/0000700000000000000000000000000014665566711015172 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/src/VC7/iem_adaptfilt.vcproj0000600000000000000000000000245114665566711021225 0ustar00 iem_utils-0.0.20240903/iem_adaptfilt/src/VC7/makefile_vc7proj0000600000000000000000000000177614665566711020361 0ustar00TARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /DHAVE_G_CANVAS_H /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_adaptfilt/src/VC9/0000700000000000000000000000000014665566711015174 5ustar00iem_utils-0.0.20240903/iem_adaptfilt/src/VC9/iem_adaptfilt.sln0000600000000000000000000000157314665566711020524 0ustar00 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_adaptfilt", "iem_adaptfilt.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_adaptfilt/src/VC9/iem_adaptfilt.vcproj0000600000000000000000000000361514665566711021232 0ustar00 iem_utils-0.0.20240903/iem_adaptfilt/src/VC9/makefile_vc9proj0000600000000000000000000000173414665566711020357 0ustar00TARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_adaptfilt/src/iem_adaptfilt.c0000600000000000000000000000330214665566711017541 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2018 */ #ifdef _MSC_VER #pragma warning( disable : 4305 ) /* uncast const double to float */ #pragma warning( disable : 4244 ) /* uncast float/int conversion etc. */ #pragma warning( disable : 4101 ) /* unused automatic variables */ #endif /* _MSC_VER */ #include "m_pd.h" #include "iemlib.h" static t_class *iem_adaptfilt_class; static void *iem_adaptfilt_new(void) { t_object *x = (t_object *)pd_new(iem_adaptfilt_class); return (x); } void NLMS_tilde_setup(void); void NLMSerr_in_tilde_setup(void); void NLMSCC_tilde_setup(void); void n_CNLMS_tilde_setup(void); void n_CLNLMS_tilde_setup(void); void FXNLMSplus2in_tilde_setup(void); void FXNLMSplus3in_tilde_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_adaptfilt_setup(void) { NLMS_tilde_setup(); NLMSerr_in_tilde_setup(); NLMSCC_tilde_setup(); n_CNLMS_tilde_setup(); n_CLNLMS_tilde_setup(); FXNLMSplus2in_tilde_setup(); FXNLMSplus3in_tilde_setup(); iem_adaptfilt_class = class_new(gensym("iem_adaptfilt"), (t_newmethod)iem_adaptfilt_new, 0, sizeof(t_object), 0, A_GIMME, 0); post("----------------------------------------------"); post("iem_adaptfilt (1.03) library loaded!"); post(" (c) Markus Noisternig, Thomas Musil"); post(" {noisternig, musil}_AT_iem.at"); post(" iem KUG Graz Austria, "BUILD_DATE); post("----------------------------------------------"); } iem_utils-0.0.20240903/iem_adaptfilt/src/iem_adaptfilt.dsp0000600000000000000000000000517014665566711020112 0ustar00# Microsoft Developer Studio Project File - Name="iem_adaptfilt" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_adaptfilt - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_adaptfilt.mak" CFG="iem_adaptfilt - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_adaptfilt - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_adaptfilt - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_adaptfilt.exe" # PROP Bsc_Name "iem_adaptfilt.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_adaptfilt - Win32 Release" # Name "iem_adaptfilt - Win32 Debug" !IF "$(CFG)" == "iem_adaptfilt - Win32 Release" !ELSEIF "$(CFG)" == "iem_adaptfilt - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_vc12proj # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_adaptfilt/src/iem_adaptfilt.dsw0000600000000000000000000000110114665566711020107 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_adaptfilt"=.\iem_adaptfilt.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_adaptfilt/src/iem_adaptfilt.sln0000600000000000000000000000157414665566711020124 0ustar00 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_adaptfilt", "iem_adaptfilt.vcxproj", "{4E46116D-6873-4B74-AF38-4D6863F9F2D8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {4E46116D-6873-4B74-AF38-4D6863F9F2D8}.Debug|Win32.ActiveCfg = Debug|Win32 {4E46116D-6873-4B74-AF38-4D6863F9F2D8}.Debug|Win32.Build.0 = Debug|Win32 {4E46116D-6873-4B74-AF38-4D6863F9F2D8}.Release|Win32.ActiveCfg = Release|Win32 {4E46116D-6873-4B74-AF38-4D6863F9F2D8}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_adaptfilt/src/iem_adaptfilt.vcxproj0000600000000000000000000000613114665566711021015 0ustar00 Debug Win32 Release Win32 MakeFileProj {4E46116D-6873-4B74-AF38-4D6863F9F2D8} Makefile v110 Makefile v110 .\Debug\ .\Debug\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_adaptfilt.exe .\Release\ .\Release\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_adaptfilt.exe iem_utils-0.0.20240903/iem_adaptfilt/src/iemarray.h0000600000000000000000000000234414665566711016562 0ustar00#ifndef _iemarray_h #define _iemarray_h #include "iemlib.h" static iemarray_t *iemarray_check(const void *x, const char*objectname, t_symbol *array_sym_name, t_int length) { int n_points; t_garray *a; iemarray_t *vec; if(!(a = (t_garray *)pd_findbyclass(array_sym_name, garray_class))) { pd_error(x, "%s: no such array for %s", array_sym_name->s_name, objectname); return((iemarray_t *)0); } else if(!iemarray_getarray(a, &n_points, &vec)) { pd_error(x, "%s: bad template for %s", array_sym_name->s_name, objectname); return((iemarray_t *)0); } else if(n_points < length) { pd_error(x, "%s: bad array-size for %s: %d", array_sym_name->s_name, objectname, n_points); return((iemarray_t *)0); } else { return(vec); } } #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_iadd(pointer, index, fvalue) (pointer[index].w_float += (fvalue)) # define iemarray_imul(pointer, index, fvalue) (pointer[index].w_float *= (fvalue)) #else # define iemarray_iadd(pointer, index, fvalue) (pointer[index] += (fvalue)) # define iemarray_imul(pointer, index, fvalue) (pointer[index] *= (fvalue)) #endif #endif /* _iemarray_h */ iem_utils-0.0.20240903/iem_adaptfilt/src/makefile_vc12proj0000600000000000000000000000205114665566711020021 0ustar00TARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_COMP = cl VIS_CPP_LINK = link VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 11.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Windows Kits\8.1" PD_INST_PATH = "$(PROGRAMFILES)\pd-0.48-1" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include /I..\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\Lib\winv6.3\um\x86\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ FXNLMSplus2in~.c \ FXNLMSplus3in~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: $(VIS_CPP_COMP) $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) $(VIS_CPP_LINK) $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_adaptfilt/src/makefile_vc9proj0000600000000000000000000000173414665566711017756 0ustar00TARGET = iem_adaptfilt all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_adaptfilt/src/makefile_win0000600000000000000000000000205414665566711017153 0ustar00 all: ..\iem_adaptfilt.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = NLMS~.c \ NLMSerr_in~.c \ NLMSCC~.c \ n_CNLMS~.c \ n_CLNLMS~.c \ iem_adaptfilt.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_adaptfilt.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_adaptfilt_setup \ /out:..\iem_adaptfilt.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_adaptfilt/src/n_CLNLMS~.c0000600000000000000000000003460714665566711016456 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. n_CLNLMS multichannel-constrained leaky normalized LMS algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef _MSC_VER #pragma warning( disable : 4305 ) /* uncast const double to float */ #pragma warning( disable : 4244 ) /* uncast float/int conversion etc. */ #pragma warning( disable : 4101 ) /* unused automatic variables */ #endif /* _MSC_VER */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- n_CLNLMS~ ------------------------------ */ /* -- multiple Constraint LEAKY Normalized Least Mean Square (linear adaptive FIR-filter) -- */ //* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct n_CLNLMS_tilde_kern { t_symbol *x_w_array_sym_name; iemarray_t *x_w_array_mem_beg; t_float *x_in_ptr_beg;// memory: sig-in vector t_float *x_out_ptr_beg;// memory: sig-out vector t_float *x_in_hist;// start point double buffer for sig-in history } t_n_CLNLMS_tilde_kern; typedef struct n_CLNLMS_tilde { t_object x_obj; t_n_CLNLMS_tilde_kern *x_my_kern; t_float *x_des_in_ptr_beg;// memory: desired-in vector t_float *x_err_out_ptr_beg;// memory: error-out vector int x_n_io;// number of in-channels and filtered out-channels int x_rw_index;// read-write-index int x_n_order;// filter order int x_update;// rounded by 2^n, yields downsampling of learn-rate t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// normalization t_float x_kappa;// constreint: treshold of energy (clipping) t_float x_leakage;// leakage-Faktor for NLMS t_outlet *x_out_compressing_bang; t_clock *x_clock; t_float x_msi; } t_n_CLNLMS_tilde; t_class *n_CLNLMS_tilde_class; static void n_CLNLMS_tilde_tick(t_n_CLNLMS_tilde *x) { outlet_bang(x->x_out_compressing_bang); } static void n_CLNLMS_tilde_beta(t_n_CLNLMS_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void n_CLNLMS_tilde_gamma(t_n_CLNLMS_tilde *x, t_floatarg f) // regularization (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void n_CLNLMS_tilde_kappa(t_n_CLNLMS_tilde *x, t_floatarg f) // threshold for w_coeff { if(f < 0.0001f) f = 0.0001f; if(f > 10000.0f) f = 10000.0f; x->x_kappa = f; } static void n_CLNLMS_tilde_leakage(t_n_CLNLMS_tilde *x, t_floatarg f) // leakage of NLMS { if(f < 0.0001f) f = 0.0001f; if(f > 1.0f) f = 1.0f; x->x_leakage = f; } static void n_CLNLMS_tilde_update(t_n_CLNLMS_tilde *x, t_floatarg f) // downsample learn rate { int i=1, u = (int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round down i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *n_CLNLMS_tilde_perform_zero(t_int *w) { t_n_CLNLMS_tilde *x = (t_n_CLNLMS_tilde *)(w[1]); t_int n = (t_int)(w[2]), i; int n_io = x->x_n_io, j; t_sample *out; out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; ix_n_order; /* number of filter-order */ int rw_index2, rw_index = x->x_rw_index; int n_io = x->x_n_io; t_float din;// second sig in t_sample *filt_out;// first sig out t_sample *err_out, err_sum;// second sig out t_float *read_in_hist; iemarray_t *w_filt_coeff; t_float my, my_err, sum; t_float beta = x->x_beta; t_float hgamma, gammax = x->x_gamma; t_float hkappa, kappa = x->x_kappa; t_float leakage = x->x_leakage; int j, k, update_counter; int update = x->x_update; int ord8=n_order&0xfffffff8; int ord_residual=n_order&0x7; int compressed = 0; for(k=0; kx_my_kern[k].x_w_array_mem_beg) goto n_CLNLMS_tildeperfzero;// this is Musil/Miller style } hgamma = gammax * gammax * (float)n_order; //hkappa = kappa * kappa * (float)n_order; hkappa = kappa; // kappa regards to energy value, else use line above for(i=0, update_counter=0; ix_my_kern[k].x_in_hist[rw_index] = x->x_my_kern[k].x_in_ptr_beg[i]; // save inputs into variabel & history x->x_my_kern[k].x_in_hist[rw_index+n_order] = x->x_my_kern[k].x_in_ptr_beg[i]; } din = x->x_des_in_ptr_beg[i]; // begin convolution err_sum = din; for(k=0; kx_my_kern[k].x_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_out_ptr_beg[i] = sum; err_sum -= sum; } x->x_err_out_ptr_beg[i] = err_sum; // end convolution if(update) // downsampling of learn rate { update_counter++; if(update_counter >= update) { update_counter = 0; for(k=0; kx_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_w_array_mem_beg; read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; sum = 0.0f; for(j=0; j hkappa) { compressed = 1; my = sqrt(hkappa/sum); w_filt_coeff = x->x_my_kern[k].x_w_array_mem_beg; for(j=0; j= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // wieder in die garage stellen if(compressed) clock_delay(x->x_clock, 0); return(w+3); n_CLNLMS_tildeperfzero: err_out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; is_n; int ok_w = 1; int m = x->x_n_io, i; for(i=0; ix_my_kern[i].x_in_ptr_beg = sp[i]->s_vec; x->x_des_in_ptr_beg = sp[m]->s_vec; for(i=0; ix_my_kern[i].x_out_ptr_beg = sp[i+m+1]->s_vec; x->x_err_out_ptr_beg = sp[2*m+1]->s_vec; for(i=0; ix_my_kern[i].x_w_array_mem_beg = iemarray_check(x, "n_CLNLMS~", x->x_my_kern[i].x_w_array_sym_name, x->x_n_order); if(!x->x_my_kern[i].x_w_array_mem_beg) ok_w = 0; } if(!ok_w) dsp_add(n_CLNLMS_tilde_perform_zero, 2, x, n); else dsp_add(n_CLNLMS_tilde_perform, 2, x, n); } /* setup/setdown things */ static void n_CLNLMS_tilde_free(t_n_CLNLMS_tilde *x) { int i, n_io=x->x_n_io; for(i=0; ix_my_kern[i].x_in_hist, 2*x->x_n_order*sizeof(t_float)); freebytes(x->x_my_kern, n_io*sizeof(t_n_CLNLMS_tilde_kern)); clock_free(x->x_clock); } static void *n_CLNLMS_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_n_CLNLMS_tilde *x = (t_n_CLNLMS_tilde *)pd_new(n_CLNLMS_tilde_class); char buffer[400]; int i; int n_order=39, n_io=1; t_symbol *w_name; t_float beta=0.1f; t_float gammax=0.00001f; t_float kappa = 1.0f; t_float leakage = 0.99f; if((argc >= 7) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4) && IS_A_FLOAT(argv,5) && IS_A_SYMBOL(argv,6)) { n_io = (int)atom_getfloatarg(0, argc, argv); n_order = (int)atom_getfloatarg(1, argc, argv); beta = (t_float)atom_getfloatarg(2, argc, argv); gammax = (t_float)atom_getfloatarg(3, argc, argv); kappa = (t_float)atom_getfloatarg(4, argc, argv); leakage = (t_float)atom_getfloatarg(5, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(6, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(kappa < 0.0001f) kappa = 0.0001f; if(kappa > 10000.0f) kappa = 10000.0f; if(leakage < 0.0001f) leakage = 0.0001f; if(leakage > 1.0f) leakage = 1.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; if(n_io < 1) n_io = 1; if(n_io > 60) n_io = 60; for(i=0; ix_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); for(i=0; i<=n_io; i++) outlet_new(&x->x_obj, &s_signal); x->x_out_compressing_bang = outlet_new(&x->x_obj, &s_bang); x->x_msi = 0; x->x_n_io = n_io; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; x->x_kappa = kappa; x->x_leakage = leakage; x->x_my_kern = (t_n_CLNLMS_tilde_kern *)getbytes(x->x_n_io*sizeof(t_n_CLNLMS_tilde_kern)); for(i=0; is_name); x->x_my_kern[i].x_w_array_sym_name = gensym(buffer); x->x_my_kern[i].x_w_array_mem_beg = (iemarray_t *)0; x->x_my_kern[i].x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); } x->x_clock = clock_new(x, (t_method)n_CLNLMS_tilde_tick); return(x); } else { pd_error(0, "%s: need 6 float- + 1 symbol-arguments:", s->s_name); pd_error(0, " number_of_filters + order_of_filters + learnrate_beta + security_value_gamma + threshold_kappa + leakage_factor_lambda + array_name_taps"); return(0); } } void n_CLNLMS_tilde_setup(void) { n_CLNLMS_tilde_class = class_new(gensym("n_CLNLMS~"), (t_newmethod)n_CLNLMS_tilde_new, (t_method)n_CLNLMS_tilde_free, sizeof(t_n_CLNLMS_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(n_CLNLMS_tilde_class, t_n_CLNLMS_tilde, x_msi); class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_kappa, gensym("kappa"), A_FLOAT, 0); // method: threshold for compressing w_coeff class_addmethod(n_CLNLMS_tilde_class, (t_method)n_CLNLMS_tilde_leakage, gensym("leakage"), A_FLOAT, 0); // method: leakage factor [0 1] for w update //class_sethelpsymbol(n_CLNLMS_tilde_class, gensym("iemhelp2/n_CLNLMS~")); } iem_utils-0.0.20240903/iem_adaptfilt/src/n_CNLMS~.c0000600000000000000000000003305214665566711016333 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. n_CNLMS multichannel-constrained (non leaky) normalized LMS algorithm lib iem_adaptfilt written by Markus Noisternig & Thomas Musil noisternig_AT_iem.at; musil_AT_iem.at (c) Institute of Electronic Music and Acoustics, Graz Austria 2005 */ #ifdef _MSC_VER #pragma warning( disable : 4305 ) /* uncast const double to float */ #pragma warning( disable : 4244 ) /* uncast float/int conversion etc. */ #pragma warning( disable : 4101 ) /* unused automatic variables */ #endif /* _MSC_VER */ #include "m_pd.h" #include "iemlib.h" #include "iemarray.h" #include #include #include /* ----------------------- n_CNLMS~ ------------------------------ */ /* -- multi-channel Constraint Normalized Least Mean Square (linear adaptive FIR-filter) -- */ /* -- first input: reference signal -- */ /* -- second input: desired signal -- */ /* -- -- */ /* for further information on adaptive filter design we refer to */ /* [1] Haykin, "Adaptive Filter Theory", 4th ed, Prentice Hall */ /* [2] Benesty, "Adaptive Signal Processing", Springer */ typedef struct n_CNLMS_tilde_kern { t_symbol *x_w_array_sym_name; iemarray_t *x_w_array_mem_beg; t_float *x_in_ptr_beg;// memory: sig-in vector t_float *x_out_ptr_beg;// memory: sig-out vector t_float *x_in_hist;// start point double buffer for sig-in history } t_n_CNLMS_tilde_kern; typedef struct n_CNLMS_tilde { t_object x_obj; t_n_CNLMS_tilde_kern *x_my_kern; t_float *x_des_in_ptr_beg;// memory: desired-in vector t_float *x_err_out_ptr_beg;// memory: error-out vector int x_n_io;// number of in-channels and filtered out-channels int x_rw_index;// read-write-index int x_n_order;// filter order int x_update;// rounded by 2^n, yields downsampling of update rate t_float x_beta;// learn rate [0 .. 2] t_float x_gamma;// normalization t_float x_kappa;// constraint: threshold of energy (clipping) t_outlet *x_out_compressing_bang; t_clock *x_clock; t_float x_msi; } t_n_CNLMS_tilde; t_class *n_CNLMS_tilde_class; static void n_CNLMS_tilde_tick(t_n_CNLMS_tilde *x) { outlet_bang(x->x_out_compressing_bang); } static void n_CNLMS_tilde_beta(t_n_CNLMS_tilde *x, t_floatarg f) // learn rate { if(f < 0.0f) f = 0.0f; if(f > 2.0f) f = 2.0f; x->x_beta = f; } static void n_CNLMS_tilde_gamma(t_n_CNLMS_tilde *x, t_floatarg f) // regularization (dither) { if(f < 0.0f) f = 0.0f; if(f > 1.0f) f = 1.0f; x->x_gamma = f; } static void n_CNLMS_tilde_kappa(t_n_CNLMS_tilde *x, t_floatarg f) // threshold for w_coeff { if(f < 0.0001f) f = 0.0001f; if(f > 10000.0f) f = 10000.0f; x->x_kappa = f; } static void n_CNLMS_tilde_update(t_n_CNLMS_tilde *x, t_floatarg f) // downsampling of learn rate { int i=1, u = (int)f; if(u < 0) u = 0; else { while(i <= u) // convert u for 2^N i *= 2; // round downward i /= 2; u = i; } x->x_update = u; } /* ============== DSP ======================= */ static t_int *n_CNLMS_tilde_perform_zero(t_int *w) { t_n_CNLMS_tilde *x = (t_n_CNLMS_tilde *)(w[1]); t_int n = (t_int)(w[2]), i; int n_io = x->x_n_io, j; t_sample *out; out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; ix_n_order; /* filter-order */ int rw_index2, rw_index = x->x_rw_index; int n_io = x->x_n_io, k; t_sample din;// second sig in t_sample *filt_out;// first sig out t_sample *err_out, err_sum;// second sig out t_float *read_in_hist; iemarray_t *w_filt_coeff; t_float my, my_err, sum; t_float beta = x->x_beta; t_float hgamma, gammax = x->x_gamma; t_float hkappa, kappa = x->x_kappa; int j, update_counter; int update = x->x_update; int ord8=n_order&0xfffffff8; int ord_residual=n_order&0x7; int compressed = 0; for(k=0; kx_my_kern[k].x_w_array_mem_beg) goto n_CNLMS_tildeperfzero;// this is Musil/Miller style } hgamma = gammax * gammax * (float)n_order; //hkappa = kappa * kappa * (float)n_order; hkappa = kappa;// kappa regards to energy value, else use line above for(i=0, update_counter=0; ix_my_kern[k].x_in_hist[rw_index] = x->x_my_kern[k].x_in_ptr_beg[i]; // save inputs into variabel & history x->x_my_kern[k].x_in_hist[rw_index+n_order] = x->x_my_kern[k].x_in_ptr_beg[i]; } din = x->x_des_in_ptr_beg[i]; // begin convolution err_sum = din; for(k=0; kx_my_kern[k].x_w_array_mem_beg; // Musil's special convolution buffer struct read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_out_ptr_beg[i] = sum; err_sum -= sum; } x->x_err_out_ptr_beg[i] = err_sum; // end convolution if(update) // downsampling of learn rate { update_counter++; if(update_counter >= update) { update_counter = 0; for(k=0; kx_my_kern[k].x_in_hist[rw_index2]; for(j=0; jx_my_kern[k].x_w_array_mem_beg; read_in_hist = &x->x_my_kern[k].x_in_hist[rw_index2]; sum = 0.0f; for(j=0; j hkappa) { compressed = 1; my = sqrt(hkappa/sum); w_filt_coeff = x->x_my_kern[k].x_w_array_mem_beg; for(j=0; j= n_order) rw_index -= n_order; } x->x_rw_index = rw_index; // back to start if(compressed) clock_delay(x->x_clock, 0); return(w+3); n_CNLMS_tildeperfzero: err_out = x->x_err_out_ptr_beg; for(i=0; ix_my_kern[j].x_out_ptr_beg; for(i=0; is_n; int ok_w = 1; int i, m = x->x_n_io; for(i=0; ix_my_kern[i].x_in_ptr_beg = sp[i]->s_vec; x->x_des_in_ptr_beg = sp[m]->s_vec; for(i=0; ix_my_kern[i].x_out_ptr_beg = sp[i+m+1]->s_vec; x->x_err_out_ptr_beg = sp[2*m+1]->s_vec; for(i=0; ix_my_kern[i].x_w_array_mem_beg = iemarray_check(x, "n_CNLMS~", x->x_my_kern[i].x_w_array_sym_name, x->x_n_order); if(!x->x_my_kern[i].x_w_array_mem_beg) ok_w = 0; } if(!ok_w) dsp_add(n_CNLMS_tilde_perform_zero, 2, x, n); else dsp_add(n_CNLMS_tilde_perform, 2, x, n); } /* setup/setdown things */ static void n_CNLMS_tilde_free(t_n_CNLMS_tilde *x) { int i, n_io=x->x_n_io; for(i=0; ix_my_kern[i].x_in_hist, 2*x->x_n_order*sizeof(t_float)); freebytes(x->x_my_kern, n_io*sizeof(t_n_CNLMS_tilde_kern)); clock_free(x->x_clock); } static void *n_CNLMS_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_n_CNLMS_tilde *x = (t_n_CNLMS_tilde *)pd_new(n_CNLMS_tilde_class); char buffer[400]; int i; int n_order=39, n_io=1; t_symbol *w_name; t_float beta=0.1f; t_float gammax=0.00001f; t_float kappa = 1.0f; if((argc >= 6) && IS_A_FLOAT(argv,0) && //IS_A_FLOAT/SYMBOL from iemlib.h IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4) && IS_A_SYMBOL(argv,5)) { n_io = (int)atom_getfloatarg(0, argc, argv); n_order = (int)atom_getfloatarg(1, argc, argv); beta = (t_float)atom_getfloatarg(2, argc, argv); gammax = (t_float)atom_getfloatarg(3, argc, argv); kappa = (t_float)atom_getfloatarg(4, argc, argv); w_name = (t_symbol *)atom_getsymbolarg(5, argc, argv); if(beta < 0.0f) beta = 0.0f; if(beta > 2.0f) beta = 2.0f; if(gammax < 0.0f) gammax = 0.0f; if(gammax > 1.0f) gammax = 1.0f; if(kappa < 0.0001f) kappa = 0.0001f; if(kappa > 10000.0f) kappa = 10000.0f; if(n_order < 2) n_order = 2; if(n_order > 11111) n_order = 11111; if(n_io < 1) n_io = 1; if(n_io > 60) n_io = 60; for(i=0; ix_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); for(i=0; i<=n_io; i++) outlet_new(&x->x_obj, &s_signal); x->x_out_compressing_bang = outlet_new(&x->x_obj, &s_bang); x->x_msi = 0; x->x_n_io = n_io; x->x_n_order = n_order; x->x_update = 0; x->x_beta = beta; x->x_gamma = gammax; x->x_kappa = kappa; x->x_my_kern = (t_n_CNLMS_tilde_kern *)getbytes(x->x_n_io*sizeof(t_n_CNLMS_tilde_kern)); for(i=0; is_name); x->x_my_kern[i].x_w_array_sym_name = gensym(buffer); x->x_my_kern[i].x_w_array_mem_beg = (iemarray_t *)0; x->x_my_kern[i].x_in_hist = (t_float *)getbytes(2*x->x_n_order*sizeof(t_float)); } x->x_clock = clock_new(x, (t_method)n_CNLMS_tilde_tick); return(x); } else { pd_error(0, "%s: need 5 float- + 1 symbol-arguments:", s->s_name); pd_error(0, " number_of_filters + order_of_filters + learnrate_beta + security_value_gamma + threshold_kappa + array_name_taps"); return(0); } } void n_CNLMS_tilde_setup(void) { n_CNLMS_tilde_class = class_new(gensym("n_CNLMS~"), (t_newmethod)n_CNLMS_tilde_new, (t_method)n_CNLMS_tilde_free, sizeof(t_n_CNLMS_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(n_CNLMS_tilde_class, t_n_CNLMS_tilde, x_msi); class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_update, gensym("update"), A_FLOAT, 0); // method: downsampling factor of learning (multiple of 2^N) class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_beta, gensym("beta"), A_FLOAT, 0); //method: normalized learning rate class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_gamma, gensym("gamma"), A_FLOAT, 0); // method: dithering noise related to signal class_addmethod(n_CNLMS_tilde_class, (t_method)n_CNLMS_tilde_kappa, gensym("kappa"), A_FLOAT, 0); // method: threshold for compressing w_coeff //class_sethelpsymbol(n_CNLMS_tilde_class, gensym("iemhelp2/n_CNLMS~")); } iem_utils-0.0.20240903/iem_dp/0000700000000000000000000000000014665566711012437 5ustar00iem_utils-0.0.20240903/iem_dp/GnuGPL.txt0000600000000000000000000004311014665566711014275 0ustar00 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. iem_utils-0.0.20240903/iem_dp/LICENSE.txt0000600000000000000000000000324014665566711014263 0ustar00iem_dp - dynamic library for pd; calculates pd signals or pd float messages in double precision. The goal of this library is to allow more than 24 bit accurate access to arrays and delay-lines. That means: with 32-bit IEEE floatingpoint we have a 23 bit mantissa with a resolution of 1 to 8388608. If you want to access to an array ( size greater than 8388608 ) by tabread4, you get a staircase-shaped output. The objects of this library work internal with double or 32-bit integer instead 24-bit mantissa of 32-bit float. To connect this higher resolution, we need 2 signal or 2 message cords. One for the float casted number and one for the difference to the higher resolution number. Copyright (C) 2000-2013 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details ( GnuGPL.txt ). (e.g. http://www.gnu.org/copyleft/gpl.html) You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Graz, 28 June 2013 Thomas Musiliem_utils-0.0.20240903/iem_dp/Makefile0000600000000000000000000000236514665566711014107 0ustar00#!/usr/bin/make -f # Makefile to the 'iemguts' library for Pure Data. # Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build # settings and rules (https://github.com/pure-data/pd-lib-builder). lib.name = iem_dp # special file that does not provide a class lib.setup.sources = src/iem_dp.c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(filter-out $(lib.setup.sources),$(wildcard src/*.c)) datafiles = \ $(wildcard *.pd) \ README.txt \ GnuGPL.txt \ LICENSE.txt \ $(empty) #cflags = -DVERSION=$(shell cat VERSION.txt) ## build a multi-object library make-lib-executable=yes ## suppress "unused" warnings #suppress-wunused=yes ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # This Makefile is based on the Makefile from pd-lib-builder written by # Katja Vetter. You can get it from: # https://github.com/pure-data/pd-lib-builder PDLIBBUILDER_DIR=pd-lib-builder/ include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder)) iem_utils-0.0.20240903/iem_dp/README.txt0000600000000000000000000000204014665566711014133 0ustar00iem_dp is a double precision library written by Thomas Musil and IOhannes Zmoelnig The goal of this library is to allow more than 24 bit accurate access to arrays and delay-lines. That means: with 32-bit IEEE floatingpoint we have a 23 bit mantissa with a resolution of 1 to 8388608. If you want to access to an array ( size greater than 8388608 ) by tabread4, you get a staircase-shaped output. The objects of this library work internal with double or 32-bit integer instead 24-bit mantissa of 32-bit float. To connect this higher resolution, we need 2 signal or 2 message cords. One for the float casted number and one for the difference to the higher resolution number. ftohex symtodp dptosym dptohex vline~~ samphold~~ wrap~~ phasor~~ print~~ add__ , +__ , +'' sub__ , -__ , -'' mul__ , *__ , *'' div__ , /__ , /'' add~~ , +~~ sub~~ , -~~ mul~~ , *~~ div~~ , /~~ tabwrite__ , tabwrite'' tabread__ , tabread'' tabread4__ , tabread4'' tabwrite~~ tabread~~ tabread4~~ max__ , max'' min__ , min'' max~~ min~~ random__ , random'' delwrite~~ delread~~ vd~~iem_utils-0.0.20240903/iem_dp/add__-help.pd0000600000000000000000000000257514665566711014753 0ustar00#N canvas 291 113 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 14 12 +__; #X text 70 13 double precision addition; #X text 359 326 sum displayed via a symbol; #X obj 165 209 +__ 0 0; #X text 201 83 = symbol selector of an anything; #X text 191 72 double precision number beginning with a "double quote" =; #X text 425 120 = symbol selector of an anything; #X text 415 109 double precision number beginning with a "double quote" =; #X msg 292 108 "8.7654321234567; #X msg 70 71 "1.2345678765432; #X text 90 342 should be "9.9999999999999; #X obj 166 303 dptosym; #X text 14 32 add__; #X text 14 57 +''; #X obj 239 209 add__ 0 0; #X obj 316 209 +'' 0 0; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 71 94 symtodp; #X obj 291 130 symtodp; #X connect 16 0 10 0; #X connect 16 0 24 0; #X connect 16 1 9 0; #X connect 16 1 24 1; #X connect 21 0 33 0; #X connect 22 0 32 0; #X connect 24 0 0 0; #X connect 32 0 16 0; #X connect 32 1 16 1; #X connect 33 0 16 2; #X connect 33 1 16 3; iem_utils-0.0.20240903/iem_dp/add~~-help.pd0000600000000000000000000000510614665566711015042 0ustar00#N canvas 291 113 860 543 10; #X symbolatom 196 376 25 0 0 0 - - -; #X text 133 473 IEM KUG; #X text 117 461 musil; #X text 154 461 @; #X text 163 461 iem.at; #X text 116 483 Graz \, Austria; #X text 176 435 @; #X text 185 435 iem.at; #X text 117 435 zmoelnig; #X text 388 376 sum displayed via a symbol; #X text 14 12 +~~; #X text 70 13 double precision signal addition; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X obj 194 203 +~~ #######; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 452 106 = symbol selector of an anything; #X text 442 95 double precision number beginning with a "double quote" =; #X text 230 60 = symbol selector of an anything; #X text 220 49 double precision number beginning with a "double quote" =; #X msg 99 48 "1.2345678765432; #X msg 320 94 "8.7654321234567; #X text 119 392 should be "9.9999999999999; #X text 14 34 add~~; #X obj 287 201 add~~; #X text 68 422 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 450 (c) Thomas Musil 2000 - 2013; #X text 314 13 15 digits accurate; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 440 256 +~~ 100 0; #X obj 516 255 add~~ 100 0; #X connect 12 0 16 1; #X connect 13 0 16 0; #X connect 14 0 16 3; #X connect 15 0 16 2; #X connect 16 0 19 0; #X connect 16 1 19 1; #X connect 18 0 17 0; #X connect 19 0 0 0; #X connect 24 0 32 0; #X connect 25 0 33 0; #X connect 32 0 13 0; #X connect 32 1 12 0; #X connect 33 0 15 0; #X connect 33 1 14 0; #X connect 35 0 34 0; #X connect 36 0 38 0; #X connect 37 0 36 0; #X connect 38 0 35 0; #X connect 38 1 35 1; iem_utils-0.0.20240903/iem_dp/delread~~-help.pd0000600000000000000000000000166214665566711015715 0ustar00#N canvas 248 216 633 323 10; #X obj 32 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 33 48 \; pd dsp \$1; #X obj 175 65 sig~; #X floatatom 174 40 5 0 0 0 - - -; #X obj 178 197 delread~~ abc 1234 0; #X obj 178 224 unsig~; #X floatatom 178 248 5 0 0 0 - - -; #X obj 176 91 delwrite~~ abc 9876 0; #X msg 221 166 2345 0; #X msg 242 145 3456 0; #X floatatom 163 148 5 0 0 0 - - -; #X floatatom 310 144 5 0 0 0 - - -; #X obj 390 226 unsig~; #X floatatom 390 250 5 0 0 0 - - -; #X floatatom 382 122 5 0 0 0 - - -; #X floatatom 437 122 5 0 0 0 - - -; #X obj 390 199 vd~~ abc; #X obj 382 141 sig~; #X obj 436 144 sig~; #X connect 0 0 1 0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 8 0 4 0; #X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 1; #X connect 12 0 13 0; #X connect 14 0 17 0; #X connect 15 0 18 0; #X connect 16 0 12 0; #X connect 17 0 16 0; #X connect 18 0 16 1; iem_utils-0.0.20240903/iem_dp/delwrite~~-help.pd0000600000000000000000000000166214665566711016134 0ustar00#N canvas 248 216 633 323 10; #X obj 32 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 33 48 \; pd dsp \$1; #X obj 175 65 sig~; #X floatatom 174 40 5 0 0 0 - - -; #X obj 178 197 delread~~ abc 1234 0; #X obj 178 224 unsig~; #X floatatom 178 248 5 0 0 0 - - -; #X obj 176 91 delwrite~~ abc 9876 0; #X msg 221 166 2345 0; #X msg 242 145 3456 0; #X floatatom 163 148 5 0 0 0 - - -; #X floatatom 310 144 5 0 0 0 - - -; #X obj 390 226 unsig~; #X floatatom 390 250 5 0 0 0 - - -; #X floatatom 382 122 5 0 0 0 - - -; #X floatatom 437 122 5 0 0 0 - - -; #X obj 390 199 vd~~ abc; #X obj 382 141 sig~; #X obj 436 144 sig~; #X connect 0 0 1 0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 8 0 4 0; #X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 1; #X connect 12 0 13 0; #X connect 14 0 17 0; #X connect 15 0 18 0; #X connect 16 0 12 0; #X connect 17 0 16 0; #X connect 18 0 16 1; iem_utils-0.0.20240903/iem_dp/div__-help.pd0000600000000000000000000000437414665566711015004 0ustar00#N canvas 291 113 1057 750 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 14 12 /__; #X text 70 13 double precision division; #X obj 165 209 /__ 0 0; #X text 359 326 quotient displayed via a symbol; #X text 470 109 = symbol selector of an anything; #X text 460 98 double precision number beginning with a "double quote" =; #X text 288 72 = symbol selector of an anything; #X text 278 61 double precision number beginning with a "double quote" =; #X text 90 342 should be "1.111111; #X msg 385 98 "1.111111; #X msg 163 61 "1.234567654321; #X obj 166 303 dptosym; #X text 13 31 div__; #X symbolatom 409 641 25 0 0 0 - - -; #X floatatom 493 560 11 0 0 0 - - -; #X floatatom 469 588 11 0 0 0 - - -; #X text 579 559 difference; #X text 553 587 float casted; #X text 601 641 quotient displayed via a symbol; #X text 712 424 = symbol selector of an anything; #X text 702 413 double precision number beginning with a "double quote" =; #X text 530 387 = symbol selector of an anything; #X text 520 376 double precision number beginning with a "double quote" =; #X text 332 657 should be "1.111111; #X msg 627 413 "1.111111; #X msg 405 376 "1.234567654321; #X obj 408 618 dptosym; #X obj 407 524 div__ 0 0; #X text 14 57 /''; #X obj 239 209 div__ 0 0; #X obj 316 209 /'' 0 0; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 87 symtodp; #X obj 385 120 symtodp; #X obj 406 402 symtodp; #X obj 627 435 symtodp; #X connect 15 0 10 0; #X connect 15 0 24 0; #X connect 15 1 9 0; #X connect 15 1 24 1; #X connect 22 0 48 0; #X connect 23 0 47 0; #X connect 24 0 0 0; #X connect 37 0 50 0; #X connect 38 0 49 0; #X connect 39 0 26 0; #X connect 40 0 28 0; #X connect 40 0 39 0; #X connect 40 1 27 0; #X connect 40 1 39 1; #X connect 47 0 15 0; #X connect 47 1 15 1; #X connect 48 0 15 2; #X connect 48 1 15 3; #X connect 49 0 40 0; #X connect 49 1 40 1; #X connect 50 0 40 2; #X connect 50 1 40 3; iem_utils-0.0.20240903/iem_dp/div~~-help.pd0000600000000000000000000000510014665566711015066 0ustar00#N canvas 291 113 944 545 10; #X symbolatom 194 388 25 0 0 0 - - -; #X text 134 493 IEM KUG; #X text 118 481 musil; #X text 155 481 @; #X text 164 481 iem.at; #X text 117 503 Graz \, Austria; #X text 177 455 @; #X text 186 455 iem.at; #X text 118 455 zmoelnig; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 13 84 \; pd dsp \$1; #X obj 13 64 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X text 70 13 double precision signal multiplication; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 14 12 /~~; #X obj 194 203 /~~ #######; #X text 117 406 should be "1.111111; #X text 406 105 = symbol selector of an anything; #X text 396 94 double precision number beginning with a "double quote" =; #X text 225 63 = symbol selector of an anything; #X text 215 52 double precision number beginning with a "double quote" =; #X msg 320 94 "1.111111; #X msg 99 51 "1.234567654321; #X text 386 388 quotient displayed via a symbol; #X text 13 38 div~~; #X obj 297 203 div~~; #X text 374 13 15 digits accurate; #X text 69 442 (c) IOhannes m zmoelnig 1999 - 2013; #X text 69 470 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 440 256 /~~ 100 0; #X obj 516 255 div~~ 100 0; #X connect 9 0 18 1; #X connect 10 0 18 0; #X connect 11 0 18 3; #X connect 12 0 18 2; #X connect 14 0 13 0; #X connect 16 0 0 0; #X connect 18 0 16 0; #X connect 18 1 16 1; #X connect 24 0 33 0; #X connect 25 0 32 0; #X connect 32 0 10 0; #X connect 32 1 9 0; #X connect 33 0 12 0; #X connect 33 1 11 0; #X connect 35 0 34 0; #X connect 36 0 38 0; #X connect 37 0 36 0; #X connect 38 0 35 0; #X connect 38 1 35 1; iem_utils-0.0.20240903/iem_dp/dptohex-help.pd0000600000000000000000000001071214665566711015370 0ustar00#N canvas 159 54 987 753 10; #X floatatom 143 239 11 0 0 0 - - -; #X floatatom 120 266 11 0 0 0 - - -; #X symbolatom 21 380 25 0 0 0 - - -; #X symbolatom 473 281 25 0 0 0 - - -; #X obj 472 222 + 3.1415; #X msg 472 201 9.26536e-05; #X text 526 258 7-8 digits accurate; #X text 229 238 difference; #X text 204 265 truncated; #X text 203 380 internal value; #X text 664 617 IEM KUG; #X text 648 605 musil; #X text 685 605 @; #X text 694 605 iem.at; #X text 647 627 Graz \, Austria; #X text 707 579 @; #X text 716 579 iem.at; #X text 648 579 zmoelnig; #X text 75 53 the inputs are two floats \, left one is the float-truncated value of a double value \, the right one is the difference between double value and the float-truncated.; #X text 74 112 output is a symbol:hexadeximal of sum of both double casted inputs; #X symbolatom 104 459 25 0 0 0 - - -; #X obj 36 313 +__ 2; #X symbolatom 159 337 25 0 0 0 - - -; #X msg 668 440 1e-23; #X symbolatom 645 493 25 0 0 0 - - -; #X obj 644 470 ftohex; #X msg 719 440 2e-23; #X msg 773 440 4e-23; #X msg 824 440 8e-23; #X msg 707 361 1e+19; #X msg 756 360 1e+20; #X symbolatom 318 579 25 0 0 0 - - -; #X msg 670 385 1e-18; #X msg 719 385 1e-19; #X text 70 13 double to hexadecimal converter (only for debugging purpose) ; #X msg 20 149 "0.000000000000000001; #X msg 21 175 "1e-18; #X msg 19 199 "1e-23; #X msg 709 95 "22.2222222233; #X msg 708 71 "44.4444444444; #X msg 708 48 "44.444444444444; #X msg 710 119 "22.2222222222; #X msg 710 142 "-22.2222222222; #X msg 555 81 "1.234; #X msg 558 106 "1.9999; #X msg 562 131 "2.00123; #X msg 491 154 "0.987; #X msg 627 175 "1e-14; #X msg 384 388 "1e+19; #X msg 436 388 "1e+20; #X msg 396 413 "-1e+19; #X msg 456 413 "-1e+20; #X msg 365 448 "1e-18; #X msg 423 449 "1e-19; #X msg 377 471 "-1e-18; #X msg 423 513 "2; #X msg 441 473 "-1e-19; #N canvas 0 22 907 755 (subpatch) 0; #X symbolatom 317 582 25 0 0 0 - - -; #X msg 396 413 "-1e+19; #X msg 456 413 "-1e+20; #X msg 365 448 "1e-18; #X msg 423 449 "1e-19; #X msg 377 471 "-1e-18; #X msg 423 513 "2; #X msg 441 473 "-1e-19; #X symbolatom 163 312 10 0 0 0 - - -; #X obj 162 290 makefilename "1e%d; #X floatatom 163 254 5 -78 78 0 - - -; #X obj 164 334 unsymbol; #X symbolatom 314 311 10 0 0 0 - - -; #X floatatom 314 253 5 -46 39 0 - - -; #X obj 315 333 unsymbol; #X obj 313 289 makefilename "-1e%d; #X obj 316 559 dptohex; #X obj 317 531 symtodp; #X connect 1 0 17 0; #X connect 2 0 17 0; #X connect 3 0 17 0; #X connect 4 0 17 0; #X connect 5 0 17 0; #X connect 6 0 17 0; #X connect 7 0 17 0; #X connect 8 0 11 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 11 0 17 0; #X connect 12 0 14 0; #X connect 13 0 15 0; #X connect 14 0 17 0; #X connect 15 0 12 0; #X connect 16 0 0 0; #X connect 17 0 16 0; #X connect 17 1 16 1; #X restore 76 577 pd; #X obj 548 377 pow; #X msg 546 355 10 \$1; #X floatatom 545 335 5 -46 39 0 - - -; #X floatatom 549 400 0 0 0 0 - - -; #X obj 595 376 pow; #X msg 593 354 10 \$1; #X floatatom 592 334 5 -46 39 0 - - -; #X floatatom 600 423 0 0 0 0 - - -; #X obj 598 400 * -1; #X obj 472 258 dptohex; #X obj 317 556 dptohex; #X obj 20 357 dptohex; #X obj 158 314 dptohex; #X obj 103 436 dptosym; #X text 14 12 dptohex; #X text 199 196 15 digits accurate; #X msg 94 169 "3.14159265358979; #X msg 100 477 "3.14159265358979; #X text 37 478 should be; #X obj 117 195 symtodp; #X obj 317 531 symtodp; #X text 599 566 (c) IOhannes m zmoelnig 1999 - 2013; #X text 599 594 (c) Thomas Musil 2000 - 2013; #X connect 4 0 67 0; #X connect 5 0 4 0; #X connect 21 0 69 0; #X connect 21 1 69 1; #X connect 23 0 25 0; #X connect 25 0 24 0; #X connect 26 0 25 0; #X connect 27 0 25 0; #X connect 28 0 25 0; #X connect 29 0 25 0; #X connect 30 0 25 0; #X connect 32 0 25 0; #X connect 33 0 25 0; #X connect 35 0 77 0; #X connect 36 0 77 0; #X connect 37 0 77 0; #X connect 48 0 78 0; #X connect 49 0 78 0; #X connect 50 0 78 0; #X connect 51 0 78 0; #X connect 52 0 78 0; #X connect 53 0 78 0; #X connect 54 0 78 0; #X connect 55 0 78 0; #X connect 56 0 78 0; #X connect 58 0 61 0; #X connect 59 0 58 0; #X connect 60 0 59 0; #X connect 61 0 25 0; #X connect 62 0 66 0; #X connect 63 0 62 0; #X connect 64 0 63 0; #X connect 65 0 25 0; #X connect 66 0 65 0; #X connect 67 0 3 0; #X connect 68 0 31 0; #X connect 69 0 2 0; #X connect 70 0 22 0; #X connect 71 0 20 0; #X connect 74 0 77 0; #X connect 77 0 1 0; #X connect 77 0 21 0; #X connect 77 0 70 0; #X connect 77 0 71 0; #X connect 77 1 0 0; #X connect 77 1 21 1; #X connect 77 1 70 1; #X connect 77 1 71 1; #X connect 78 0 68 0; #X connect 78 1 68 1; iem_utils-0.0.20240903/iem_dp/dptosym-help.pd0000600000000000000000000000415314665566711015416 0ustar00#N canvas 502 22 781 599 10; #X symbolatom 525 160 25 0 0 0 - - -; #X obj 525 103 + 3.1415; #X msg 525 79 9.26536e-05; #X text 574 135 7-8 digits accurate; #X text 169 289 output is a symbol of sum of both double casted inputs ; #X text 361 15 (only for help and debugging purpose); #X symbolatom 109 353 25 0 0 0 - - -; #X text 149 467 IEM KUG; #X text 133 455 musil; #X text 170 455 @; #X text 179 455 iem.at; #X text 132 477 Graz \, Austria; #X text 192 429 @; #X text 201 429 iem.at; #X text 133 429 zmoelnig; #X text 46 369 should be "1.2345678765432; #X floatatom 88 102 11 0 0 0 - - -; #X floatatom 65 129 11 0 0 0 - - -; #X text 168 235 the inputs are two floats \, left one is the float-casted value of a double value \, the right one is the float difference between double value and the float-casted.; #X text 149 128 float-casted; #X text 174 101 difference to double; #X obj 110 288 dptosym; #X obj 525 134 dptosym; #X symbolatom 557 349 25 0 0 0 - - -; #X msg 596 293 9.26536e-05; #X text 606 324 7-8 digits accurate; #X obj 557 323 dptosym; #X msg 559 267 3.1415; #X obj 568 238 t b b; #X obj 568 215 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X symbolatom 552 485 25 0 0 0 - - -; #X obj 558 438 dptosym; #X msg 32 46 "1.234567890123456789; #X msg 558 388 "3.1415926535897932; #X obj 577 462 symbol; #X obj 558 413 symtodp; #X obj 32 71 symtodp; #X text 84 416 (c) IOhannes m zmoelnig 1999 - 2013; #X text 84 444 (c) Thomas Musil 2000 - 2013; #X text 14 12 dptosym; #X text 81 12 double precision to symbol converter; #X symbolatom 147 332 25 0 0 0 - - -; #X obj 147 311 symbol; #X text 195 311 and a symbol number with a leading double quotes; #X connect 1 0 22 0; #X connect 2 0 1 0; #X connect 21 0 6 0; #X connect 21 1 42 0; #X connect 22 0 0 0; #X connect 24 0 26 1; #X connect 26 0 23 0; #X connect 27 0 26 0; #X connect 28 0 27 0; #X connect 28 1 24 0; #X connect 29 0 28 0; #X connect 31 1 34 0; #X connect 32 0 36 0; #X connect 33 0 35 0; #X connect 34 0 30 0; #X connect 35 0 31 0; #X connect 35 1 31 1; #X connect 36 0 17 0; #X connect 36 0 21 0; #X connect 36 1 16 0; #X connect 36 1 21 1; #X connect 42 0 41 0; iem_utils-0.0.20240903/iem_dp/max__-help.pd0000600000000000000000000000255614665566711015007 0ustar00#N canvas 223 169 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 349 326 product displayed via a symbol; #X text 258 73 = symbol selector of an anything; #X text 248 62 double precision number beginning with a "double quote" =; #X text 479 109 = symbol selector of an anything; #X text 469 98 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X text 14 12 max__; #X text 14 34 max''; #X obj 165 209 max__ 0 0; #X obj 246 211 max'' 0 0; #X msg 163 61 "1.111111112; #X msg 385 98 "1.111111113; #X text 102 341 should be "1.111111113; #X text 55 13 double precision comparsion \, output the greater value ; #X text 419 12 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 87 symtodp; #X obj 385 120 symtodp; #X connect 18 0 0 0; #X connect 21 0 10 0; #X connect 21 0 18 0; #X connect 21 1 9 0; #X connect 21 1 18 1; #X connect 23 0 30 0; #X connect 24 0 31 0; #X connect 30 0 21 0; #X connect 30 1 21 1; #X connect 31 0 21 2; #X connect 31 1 21 3; iem_utils-0.0.20240903/iem_dp/max~~-help.pd0000600000000000000000000000511114665566711015073 0ustar00#N canvas 291 113 860 543 10; #X symbolatom 196 386 25 0 0 0 - - -; #X text 133 493 IEM KUG; #X text 117 481 musil; #X text 154 481 @; #X text 163 481 iem.at; #X text 116 503 Graz \, Austria; #X text 176 455 @; #X text 185 455 iem.at; #X text 117 455 zmoelnig; #X text 388 386 sum displayed via a symbol; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 452 106 = symbol selector of an anything; #X text 442 95 double precision number beginning with a "double quote" =; #X text 230 60 = symbol selector of an anything; #X text 220 49 double precision number beginning with a "double quote" =; #X text 14 12 max~~; #X text 70 13 double precision comparsion \, output the greater value ; #X obj 194 203 max~~ ######; #X msg 99 48 "1.111111112; #X msg 320 94 "1.111111113; #X text 132 401 should be "1.111111113; #X text 450 14 15 digits accurate; #X text 68 442 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 470 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X obj 496 228 sig~; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 496 282 pd sunsig~~; #X symbolatom 496 307 25 0 0 0 - - -; #X obj 496 254 max~~ 10 0; #X floatatom 496 207 5 0 0 0 - - -; #X floatatom 557 207 5 0 0 0 - - -; #X connect 10 0 23 1; #X connect 11 0 23 0; #X connect 12 0 23 3; #X connect 13 0 23 2; #X connect 15 0 14 0; #X connect 16 0 0 0; #X connect 23 0 16 0; #X connect 23 1 16 1; #X connect 24 0 30 0; #X connect 25 0 31 0; #X connect 30 0 11 0; #X connect 30 1 10 0; #X connect 31 0 13 0; #X connect 31 1 12 0; #X connect 32 0 35 0; #X connect 33 0 34 0; #X connect 35 0 33 0; #X connect 35 1 33 1; #X connect 36 0 32 0; #X connect 37 0 35 2; iem_utils-0.0.20240903/iem_dp/min__-help.pd0000600000000000000000000000255214665566711015001 0ustar00#N canvas 223 169 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 349 326 product displayed via a symbol; #X text 258 73 = symbol selector of an anything; #X text 248 62 double precision number beginning with a "double quote" =; #X text 479 109 = symbol selector of an anything; #X text 469 98 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X msg 163 61 "1.111111112; #X msg 385 98 "1.111111113; #X text 14 12 min__; #X text 14 34 min''; #X obj 165 209 min__ 0 0; #X obj 246 211 min'' 0 0; #X text 90 342 should be "1.111111112; #X text 55 13 double precision comparsion \, output the less value ; #X text 419 12 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 86 symtodp; #X obj 385 120 symtodp; #X connect 18 0 0 0; #X connect 19 0 30 0; #X connect 20 0 31 0; #X connect 23 0 10 0; #X connect 23 0 18 0; #X connect 23 1 9 0; #X connect 23 1 18 1; #X connect 30 0 23 0; #X connect 30 1 23 1; #X connect 31 0 23 2; #X connect 31 1 23 3; iem_utils-0.0.20240903/iem_dp/min~~-help.pd0000600000000000000000000000510614665566711015075 0ustar00#N canvas 291 113 860 543 10; #X symbolatom 196 386 25 0 0 0 - - -; #X text 133 483 IEM KUG; #X text 117 471 musil; #X text 154 471 @; #X text 163 471 iem.at; #X text 116 493 Graz \, Austria; #X text 176 445 @; #X text 185 445 iem.at; #X text 117 445 zmoelnig; #X text 388 386 sum displayed via a symbol; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 452 106 = symbol selector of an anything; #X text 442 95 double precision number beginning with a "double quote" =; #X text 230 60 = symbol selector of an anything; #X text 220 49 double precision number beginning with a "double quote" =; #X msg 99 48 "1.111111112; #X msg 320 94 "1.111111113; #X text 14 11 min~~; #X text 70 13 double precision comparsion \, output the less value ; #X obj 194 203 min~~ ######; #X text 132 402 should be "1.111111112; #X text 450 14 15 digits accurate; #X text 68 432 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 460 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 320 115 symtodp; #X obj 462 220 sig~; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 462 274 pd sunsig~~; #X symbolatom 462 299 25 0 0 0 - - -; #X floatatom 462 199 5 0 0 0 - - -; #X floatatom 523 199 5 0 0 0 - - -; #X obj 462 246 min~~ 10 0; #X connect 10 0 25 1; #X connect 11 0 25 0; #X connect 12 0 25 3; #X connect 13 0 25 2; #X connect 15 0 14 0; #X connect 16 0 0 0; #X connect 21 0 30 0; #X connect 22 0 31 0; #X connect 25 0 16 0; #X connect 25 1 16 1; #X connect 30 0 11 0; #X connect 30 1 10 0; #X connect 31 0 13 0; #X connect 31 1 12 0; #X connect 32 0 37 0; #X connect 33 0 34 0; #X connect 35 0 32 0; #X connect 36 0 37 2; #X connect 37 0 33 0; #X connect 37 1 33 1; iem_utils-0.0.20240903/iem_dp/mul__-help.pd0000600000000000000000000000257014665566711015013 0ustar00#N canvas 223 169 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 55 13 double precision multiplication; #X text 311 272 float casted; #X text 14 12 *__; #X text 349 326 product displayed via a symbol; #X obj 165 209 *__ 0 0; #X text 90 342 should be "1.234567654321; #X msg 163 61 "1.111111; #X msg 385 98 "1.111111; #X text 250 73 = symbol selector of an anything; #X text 240 62 double precision number beginning with a "double quote" =; #X text 471 109 = symbol selector of an anything; #X text 461 98 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X obj 239 209 mul__ 0 0; #X obj 316 209 *'' 0 0; #X text 14 32 mul__; #X text 14 57 *''; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 164 87 symtodp; #X obj 385 120 symtodp; #X connect 16 0 10 0; #X connect 16 0 24 0; #X connect 16 1 9 0; #X connect 16 1 24 1; #X connect 18 0 32 0; #X connect 19 0 33 0; #X connect 24 0 0 0; #X connect 32 0 16 0; #X connect 32 1 16 1; #X connect 33 0 16 2; #X connect 33 1 16 3; iem_utils-0.0.20240903/iem_dp/mul~~-help.pd0000600000000000000000000000507714665566711015116 0ustar00#N canvas 291 113 936 537 10; #X symbolatom 194 348 25 0 0 0 - - -; #X text 134 493 IEM KUG; #X text 118 481 musil; #X text 155 481 @; #X text 164 481 iem.at; #X text 117 503 Graz \, Austria; #X text 177 455 @; #X text 186 455 iem.at; #X text 118 455 zmoelnig; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X text 14 12 *~~; #X text 70 13 double precision signal multiplication; #X obj 194 203 *~~ #######; #X text 386 348 product displayed via a symbol; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X msg 320 94 "1.111111; #X msg 99 51 "1.111111; #X text 117 366 should be "1.234567654321; #X text 406 105 = symbol selector of an anything; #X text 396 94 double precision number beginning with a "double quote" =; #X text 183 62 = symbol selector of an anything; #X text 173 51 double precision number beginning with a "double quote" =; #X text 16 32 mul~~; #X obj 292 203 mul~~; #X text 374 13 15 digits accurate; #X text 69 442 (c) IOhannes m zmoelnig 1999 - 2013; #X text 69 470 (c) Thomas Musil 2000 - 2013; #X obj 99 74 symtodp; #X obj 320 115 symtodp; #X obj 440 256 *~~ 100 0; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 516 255 mul~~ 100 0; #X connect 9 0 17 1; #X connect 10 0 17 0; #X connect 11 0 17 3; #X connect 12 0 17 2; #X connect 14 0 13 0; #X connect 17 0 19 0; #X connect 17 1 19 1; #X connect 19 0 0 0; #X connect 20 0 33 0; #X connect 21 0 32 0; #X connect 32 0 10 0; #X connect 32 1 9 0; #X connect 33 0 12 0; #X connect 33 1 11 0; #X connect 34 0 36 0; #X connect 34 1 36 1; #X connect 36 0 35 0; #X connect 37 0 34 0; #X connect 38 0 37 0; iem_utils-0.0.20240903/iem_dp/pd-lib-builder/0000700000000000000000000000000014665566711015232 5ustar00iem_utils-0.0.20240903/iem_dp/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711017266 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/iem_dp/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711021342 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/iem_dp/pd-lib-builder/README.md0000600000000000000000000001314614665566711016520 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/iem_dp/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711020026 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/iem_dp/phasor~~-help.pd0000600000000000000000000000311614665566711015605 0ustar00#N canvas 50 82 859 466 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X text 639 34 see also:; #X text 592 211 IEM KUG; #X text 576 199 musil; #X text 613 199 @; #X text 622 199 iem.at; #X text 575 221 Graz \, Austria; #X text 635 173 @; #X text 644 173 iem.at; #X text 576 173 zmoelnig; #X text 13 -11 phasor~~; #X obj 719 35 phasor~; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 100 float 0; #X coords 0 1 100 -1 200 100 1; #X restore 413 12 graph; #X obj 54 382 metro 500; #X floatatom 39 117 0 0 0 0 - - -; #X obj 39 141 sig~ 890; #X text 91 114 <-- specify frequency; #X text 106 140 <-- convert it to audio signal; #X text 177 404 <-- graph the output; #X text 149 195 <-- right inlet resets phase; #X obj 38 406 tabwrite~ array99; #X obj 54 357 loadbang; #X obj 120 357 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 39 226 phasor~~; #X floatatom 90 199 5 0 0 0 - - -; #X floatatom 91 285 0 0 0 0 - - -; #X obj 91 262 unsig~; #X text 97 246 fine out; #X text 45 325 coarse out; #X msg 91 179 0.5; #X text 80 -10 - sawtooth generator with double precision output; #X text 527 160 (c) IOhannes m zmoelnig 1999 - 2013; #X text 527 188 (c) Thomas Musil 2000 - 2013; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 16 0 23 0; #X connect 17 0 18 0; #X connect 18 0 26 0; #X connect 24 0 16 0; #X connect 24 0 16 0; #X connect 25 0 16 0; #X connect 26 0 23 0; #X connect 26 1 29 0; #X connect 27 0 26 1; #X connect 29 0 28 0; #X connect 32 0 27 0; iem_utils-0.0.20240903/iem_dp/random__-help.pd0000600000000000000000000000244114665566711015473 0ustar00#N canvas 88 232 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 39 430 (c) Thomas Musil 2000 - 2007; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2007; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 359 326 difference displayed via a symbol; #X text 203 83 = symbol selector of an anything; #X text 294 13 14 digits accurate; #X msg 292 108 "8.7654321234567; #X text 193 72 double precision number beginning with a "double quote" =; #X text 422 119 = symbol selector of an anything; #X text 412 108 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X obj 316 210 random'' 10 0; #X obj 165 209 random__ 10 0; #X msg 90 106 bang; #X msg 151 114 seed 20 0; #X text 97 13 double precision random; #X text 14 12 random__; #X text 14 32 random''; #X obj 292 130 symtodp; #X connect 18 0 30 0; #X connect 22 0 0 0; #X connect 24 0 12 0; #X connect 24 0 22 0; #X connect 24 1 11 0; #X connect 24 1 22 1; #X connect 25 0 24 0; #X connect 26 0 24 0; #X connect 30 0 24 1; #X connect 30 1 24 2; iem_utils-0.0.20240903/iem_dp/samphold~~-help.pd0000600000000000000000000000340314665566711016117 0ustar00#N canvas 404 97 682 587 10; #X obj 30 19 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 30 86 5 0 0 0 - - -; #X floatatom 46 64 3 0 0 0 - - -; #X obj 30 41 dsp; #X text 516 25 see also:; #X text 468 119 IEM KUG; #X text 452 107 musil; #X text 489 107 @; #X text 498 107 iem.at; #X text 451 129 Graz \, Austria; #X text 511 81 @; #X text 520 81 iem.at; #X text 452 81 zmoelnig; #X obj 30 518 snapshot~; #X floatatom 30 541 5 0 0 0 - - -; #X obj 40 467 metro 100; #X obj 40 442 loadbang; #X text 11 -2 samphold~~; #X obj 588 25 samphold~; #X obj 30 419 samphold~~; #X obj 96 308 sig~; #X obj 259 311 sig~; #X floatatom 96 283 3 0 0 0 - - -; #X floatatom 259 286 3 0 0 0 - - -; #X msg 48 232 reset; #X text 127 162 set output to a number; #X text 134 283 sample signal; #X text 302 284 control signal; #X text 161 187 reset previous value; #X text 111 243 to force the next sample; #X text 160 201 for control inlet; #X text 110 229 reset to default 1e+20; #X msg 35 163 set 34 0.34; #X msg 43 195 reset 10 0.1; #X obj 108 335 *~ 0.01; #X obj 271 339 *~ 0.01; #X text 107 -1 - double precision sample and hold unit; #X text 403 68 (c) IOhannes m zmoelnig 1999 - 2013; #X text 403 96 (c) Thomas Musil 2000 - 2013; #X obj 64 494 t b b; #X obj 129 520 snapshot~; #X floatatom 129 543 9 0 0 0 - - -; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 13 0 14 0; #X connect 15 0 39 0; #X connect 16 0 15 0; #X connect 19 0 13 0; #X connect 19 1 40 0; #X connect 20 0 34 0; #X connect 20 0 19 0; #X connect 21 0 35 0; #X connect 21 0 19 2; #X connect 22 0 20 0; #X connect 23 0 21 0; #X connect 24 0 19 0; #X connect 32 0 19 0; #X connect 33 0 19 0; #X connect 34 0 19 1; #X connect 35 0 19 3; #X connect 39 0 13 0; #X connect 39 1 40 0; #X connect 40 0 41 0; iem_utils-0.0.20240903/iem_dp/src/0000700000000000000000000000000014665566711013226 5ustar00iem_utils-0.0.20240903/iem_dp/src/VC6/0000700000000000000000000000000014665566711013624 5ustar00iem_utils-0.0.20240903/iem_dp/src/VC6/iem_dp.dsp0000600000000000000000000000472414665566711015602 0ustar00# Microsoft Developer Studio Project File - Name="iem_dp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_dp - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_dp.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_dp.mak" CFG="iem_dp - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_dp - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_dp - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_dp - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_dp.exe" # PROP Bsc_Name "iem_dp.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_dp - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_dp.exe" # PROP Bsc_Name "iem_dp.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_dp - Win32 Release" # Name "iem_dp - Win32 Debug" !IF "$(CFG)" == "iem_dp - Win32 Release" !ELSEIF "$(CFG)" == "iem_dp - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_dp/src/VC6/iem_dp.dsw0000600000000000000000000000106314665566711015602 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_dp"=.\iem_dp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_dp/src/VC6/makefile_win0000600000000000000000000000244314665566711016206 0ustar00TARGET = iem_dp all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_dp/src/VC7/0000700000000000000000000000000014665566711013625 5ustar00iem_utils-0.0.20240903/iem_dp/src/VC7/iem_dp.vcproj0000600000000000000000000000241514665566711016313 0ustar00 iem_utils-0.0.20240903/iem_dp/src/VC7/makefile_vc7proj0000600000000000000000000000245614665566711017010 0ustar00TARGET = iem_dp all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_dp/src/VC9/0000700000000000000000000000000014665566711013627 5ustar00iem_utils-0.0.20240903/iem_dp/src/VC9/iem_dp.sln0000600000000000000000000000155514665566711015612 0ustar00 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_dp", "iem_dp.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_dp/src/VC9/iem_dp.vcproj0000600000000000000000000000356114665566711016320 0ustar00 iem_utils-0.0.20240903/iem_dp/src/VC9/makefile_vc9proj0000600000000000000000000000243414665566711017010 0ustar00TARGET = iem_dp all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = symtodp.c \ dptosym.c \ dptohex.c \ ftohex.c \ vline~~.c \ samphold~~.c \ wrap~~.c \ phasor~~.c \ print~~.c \ add__.c \ sub__.c \ mul__.c \ div__.c \ add~~.c \ sub~~.c \ mul~~.c \ div~~.c \ tabwrite_dp.c \ tabread_dp.c \ tabread4_dp.c \ tabwrite~~.c \ tabread~~.c \ tabread4~~.c \ max__.c \ min__.c \ max~~.c \ min~~.c \ random__.c \ delay~~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_dp/src/add__.c0000600000000000000000000000421114665566711014420 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ add__ or +__ ---------------------------- */ /* based on miller's +, which is part of pd, only with double precision */ static t_class *add___class; typedef struct _add__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_add__; static void add___bang(t_add__ *x) { double dsum; t_float fsum; dsum = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) + iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); fsum = iem_dp_cast_to_float(dsum); outlet_float(x->x_out_fine, iem_dp_calc_residual(dsum, fsum)); outlet_float(x->x_out_coarse, fsum); } static void add___float(t_add__ *x, t_floatarg f) { x->x_coarse_left = f; add___bang(x); } static void *add___new(t_symbol *s, int ac, t_atom *av) { t_add__ *x = (t_add__ *)pd_new(add___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } void add___setup(void) { add___class = class_new(gensym("add__"), (t_newmethod)add___new, 0, sizeof(t_add__), 0, A_GIMME, 0); class_addcreator((t_newmethod)add___new, gensym("+__"), A_GIMME, 0); class_addcreator((t_newmethod)add___new, gensym("+''"), A_GIMME, 0); class_addbang(add___class, add___bang); class_addfloat(add___class, add___float); } iem_utils-0.0.20240903/iem_dp/src/add~~.c0000600000000000000000000002011114665566711014513 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- add~~ ------------------------------ */ /* based on miller's +~ which is part of pd */ static t_class *add_tilde_tilde_class, *scalaradd_tilde_tilde_class; typedef struct _add_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_add_tilde_tilde; typedef struct _scalaradd_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalaradd_tilde_tilde; static void *add_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||((argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT))) { t_scalaradd_tilde_tilde *x = (t_scalaradd_tilde_tilde *)pd_new(scalaradd_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_add_tilde_tilde *x = (t_add_tilde_tilde *)pd_new(add_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *add_tilde_tilde_perform(t_int *w) { t_add_tilde_tilde *x = (t_add_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d; t_float f; while(n--) { d = iem_dp_calc_sum(*in1c++, *in1f++) + iem_dp_calc_sum(*in2c++, *in2f++); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *add_tilde_tilde_perf8(t_int *w) { t_add_tilde_tilde *x = (t_add_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) + iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) + iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) + iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) + iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) + iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) + iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) + iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) + iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalaradd_tilde_tilde_perform(t_int *w) { t_scalaradd_tilde_tilde *x = (t_scalaradd_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) + g; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *scalaradd_tilde_tilde_perf8(t_int *w) { t_scalaradd_tilde_tilde *x = (t_scalaradd_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) + g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) + g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) + g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) + g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) + g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) + g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) + g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) + g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void add_tilde_tilde_dsp(t_add_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(add_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(add_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalaradd_tilde_tilde_dsp(t_scalaradd_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalaradd_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalaradd_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void add_tilde_tilde_setup(void) { add_tilde_tilde_class = class_new(gensym("+~~"), (t_newmethod)add_tilde_tilde_new, 0, sizeof(t_add_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)add_tilde_tilde_new, gensym("add~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(add_tilde_tilde_class, t_add_tilde_tilde, x_f); class_addmethod(add_tilde_tilde_class, (t_method)add_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); scalaradd_tilde_tilde_class = class_new(gensym("+~~"), 0, 0, sizeof(t_scalaradd_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalaradd_tilde_tilde_class, t_scalaradd_tilde_tilde, x_f); class_addmethod(scalaradd_tilde_tilde_class, (t_method)scalaradd_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/delay~~.c0000600000000000000000000002772214665566711015100 0ustar00/* Copyright (c) 1997-1999 Miller Puckette. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #define DEFDELVS_TT 64 /* LATER get this from canvas at DSP time */ #define XTRASAMPS_TT 4 #define SAMPBLK_TT 4 /* ----------------------------- delwrite~~ ----------------------------- */ typedef struct delwrite_tilde_tilde_ctl { int c_n; t_sample *c_vec; int c_phase; } t_delwrite_tilde_tilde_ctl; typedef struct _delwrite_tilde_tilde { t_object x_obj; t_symbol *x_sym; double x_deltime; t_delwrite_tilde_tilde_ctl x_cspace; int x_sortno; /* DSP sort number at which this was last put on chain */ int x_rsortno; /* DSP sort # for first delread or write in chain */ int x_vecsize; /* vector size for delread~ to use */ t_float x_f; } t_delwrite_tilde_tilde; //extern static int delread_zero; static t_class *delwrite_tilde_tilde_class; static void delwrite_tilde_tilde_updatesr (t_delwrite_tilde_tilde *x, t_float sr) /* added by Mathieu Bouchard */ { int nsamps = (int)(x->x_deltime * (double)sr * (double)(0.001)); if (nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (SAMPBLK_TT - 1)); nsamps += DEFDELVS_TT; if(x->x_cspace.c_n != nsamps) { x->x_cspace.c_vec = (t_sample *)resizebytes(x->x_cspace.c_vec, (x->x_cspace.c_n + XTRASAMPS_TT) * sizeof(t_sample), (nsamps + XTRASAMPS_TT) * sizeof(t_sample)); x->x_cspace.c_n = nsamps; x->x_cspace.c_phase = XTRASAMPS_TT; } } /* routine to check that all delwrites/delreads/vds have same vecsize */ static void delwrite_tilde_tilde_checkvecsize(t_delwrite_tilde_tilde *x, int vecsize) { if (x->x_rsortno != ugen_getsortno()) { x->x_vecsize = vecsize; x->x_rsortno = ugen_getsortno(); } /* LATER this should really check sample rate and blocking, once that is supported. Probably we don't actually care about vecsize. For now just suppress this check. */ #if 0 else if (vecsize != x->x_vecsize) pd_error(x, "delread/delwrite/vd vector size mismatch"); #endif } static void *delwrite_tilde_tilde_new(t_symbol *s, t_floatarg coarse_msec, t_floatarg fine_msec) { t_delwrite_tilde_tilde *x = (t_delwrite_tilde_tilde *)pd_new(delwrite_tilde_tilde_class); if(!*s->s_name) s = gensym("delwrite~~"); pd_bind(&x->x_obj.ob_pd, s); x->x_sym = s; x->x_deltime = iem_dp_calc_sum(coarse_msec, fine_msec); x->x_cspace.c_n = 0; x->x_cspace.c_vec = (t_sample *)getbytes(XTRASAMPS_TT * sizeof(t_sample)); x->x_sortno = 0; x->x_vecsize = 0; x->x_f = 0; return (x); } static t_int *delwrite_tilde_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_delwrite_tilde_tilde_ctl *c = (t_delwrite_tilde_tilde_ctl *)(w[2]); int n = (int)(w[3]); int phase = c->c_phase, nsamps = c->c_n; t_sample *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS_TT); phase += n; while (n--) { t_sample f = *in++; if(IEM_DENORMAL_T(f)) f = 0; *bp++ = f; if (bp == ep) { vp[0] = ep[-4]; vp[1] = ep[-3]; vp[2] = ep[-2]; vp[3] = ep[-1]; bp = vp + XTRASAMPS_TT; phase -= nsamps; } } c->c_phase = phase; return (w+4); } static void delwrite_tilde_tilde_dsp(t_delwrite_tilde_tilde *x, t_signal **sp) { dsp_add(delwrite_tilde_tilde_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n); x->x_sortno = ugen_getsortno(); delwrite_tilde_tilde_checkvecsize(x, sp[0]->s_n); delwrite_tilde_tilde_updatesr(x, sp[0]->s_sr); } static void delwrite_tilde_tilde_free(t_delwrite_tilde_tilde *x) { pd_unbind(&x->x_obj.ob_pd, x->x_sym); freebytes(x->x_cspace.c_vec, (x->x_cspace.c_n + XTRASAMPS_TT) * sizeof(t_sample)); } static void delwrite_tilde_tilde_setup(void) { delwrite_tilde_tilde_class = class_new(gensym("delwrite~~"), (t_newmethod)delwrite_tilde_tilde_new, (t_method)delwrite_tilde_tilde_free, sizeof(t_delwrite_tilde_tilde), 0, A_DEFSYM, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(delwrite_tilde_tilde_class, t_delwrite_tilde_tilde, x_f); class_addmethod(delwrite_tilde_tilde_class, (t_method)delwrite_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } /* ----------------------------- delread~~ ----------------------------- */ static t_class *delread_tilde_tilde_class; typedef struct _delread_tilde_tilde { t_object x_obj; t_symbol *x_sym; t_float x_fine; double x_deltime; /* delay in msec */ int x_delsamps; /* delay in samples */ t_float x_sr; /* samples per msec */ t_float x_n; /* vector size */ int x_zerodel; /* 0 or vecsize depending on read/write order */ } t_delread_tilde_tilde; static void delread_tilde_tilde_list(t_delread_tilde_tilde *x, t_symbol *s, int ac, t_atom *av); static void *delread_tilde_tilde_new(t_symbol *s, int ac, t_atom *av) { t_symbol *delname; t_delread_tilde_tilde *x = (t_delread_tilde_tilde *)pd_new(delread_tilde_tilde_class); if((ac > 0) && IS_A_SYMBOL(av, 0)) delname = atom_getsymbolarg(0, ac, av); else delname = &s_; x->x_sym = delname; x->x_sr = 1; x->x_n = 1; x->x_zerodel = 0; delread_tilde_tilde_list(x, &s_list, ac-1, av+1); floatinlet_new(&x->x_obj, &x->x_fine); outlet_new(&x->x_obj, &s_signal); return (x); } static void delread_tilde_tilde_list(t_delread_tilde_tilde *x, t_symbol *s, int ac, t_atom *av) { t_float coarse, fine; t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); if((ac > 0) && (IS_A_FLOAT(av, 0))) coarse = atom_getfloatarg(0, ac, av); else coarse = 0.0; if((ac > 1) && (IS_A_FLOAT(av, 1))) fine = atom_getfloatarg(1, ac, av); else fine = 0.0; x->x_deltime = iem_dp_calc_sum(coarse, fine); if(delwriter) { int delsize = delwriter->x_cspace.c_n; x->x_delsamps = (int)(0.5 + (double)x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if(x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if(x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS_TT) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS_TT; } } static void delread_tilde_tilde_double(t_delread_tilde_tilde *x, double d) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_deltime = d; if(delwriter) { int delsize = delwriter->x_cspace.c_n; x->x_delsamps = (int)(0.5 + (double)x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if(x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if(x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS_TT) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS_TT; } } static void delread_tilde_tilde_float(t_delread_tilde_tilde *x, t_float coarse) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_deltime = iem_dp_calc_sum(coarse, x->x_fine); if(delwriter) { int delsize = delwriter->x_cspace.c_n; x->x_delsamps = (int)(0.5 + (double)x->x_sr * x->x_deltime) + x->x_n - x->x_zerodel; if(x->x_delsamps < x->x_n) x->x_delsamps = x->x_n; else if(x->x_delsamps > delwriter->x_cspace.c_n - DEFDELVS_TT) x->x_delsamps = delwriter->x_cspace.c_n - DEFDELVS_TT; } } static t_int *delread_tilde_tilde_perform(t_int *w) { t_sample *out = (t_float *)(w[1]); t_delwrite_tilde_tilde_ctl *c = (t_delwrite_tilde_tilde_ctl *)(w[2]); int delsamps = *(int *)(w[3]); int n = (int)(w[4]); int phase = c->c_phase - delsamps, nsamps = c->c_n; t_sample *vp = c->c_vec, *bp, *ep = vp + (c->c_n + XTRASAMPS_TT); if(phase < 0) phase += nsamps; bp = vp + phase; while(n--) { *out++ = *bp++; if(bp == ep) bp -= nsamps; } return (w+5); } static void delread_tilde_tilde_dsp(t_delread_tilde_tilde *x, t_signal **sp) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_sr = sp[0]->s_sr * 0.001; x->x_n = sp[0]->s_n; if(delwriter) { delwrite_tilde_tilde_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); delread_tilde_tilde_double(x, x->x_deltime); dsp_add(delread_tilde_tilde_perform, 4, sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps, sp[0]->s_n); } else if (*x->x_sym->s_name) pd_error(x, "delread~~: %s: no such delwrite~~",x->x_sym->s_name); } static void delread_tilde_tilde_setup(void) { delread_tilde_tilde_class = class_new(gensym("delread~~"), (t_newmethod)delread_tilde_tilde_new, 0, sizeof(t_delread_tilde_tilde), 0, A_GIMME, 0); class_addmethod(delread_tilde_tilde_class, (t_method)delread_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addfloat(delread_tilde_tilde_class, (t_method)delread_tilde_tilde_float); } /* ----------------------------- vd~~ ----------------------------- */ static t_class *vd_tilde_tilde_class; typedef struct _vd_tilde_tilde { t_object x_obj; t_symbol *x_sym; t_float x_sr; /* samples per msec */ int x_zerodel; /* 0 or vecsize depending on read/write order */ t_float x_f; } t_vd_tilde_tilde; static void *vd_tilde_tilde_new(t_symbol *s) { t_vd_tilde_tilde *x = (t_vd_tilde_tilde *)pd_new(vd_tilde_tilde_class); if(!*s->s_name) s = gensym("vd~~"); x->x_sym = s; x->x_sr = 1; x->x_zerodel = 0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } static t_int *vd_tilde_tilde_perform(t_int *w) { t_sample *cin = (t_sample *)(w[1]); t_sample *fin = (t_sample *)(w[2]); t_sample *out = (t_sample *)(w[3]); t_delwrite_tilde_tilde_ctl *ctl = (t_delwrite_tilde_tilde_ctl *)(w[4]); t_vd_tilde_tilde *x = (t_vd_tilde_tilde *)(w[5]); int n = (int)(w[6]); int nsamps = ctl->c_n; double limit = (double)nsamps - (double)n - 1.0; t_sample fn = n-1; t_sample *vp = ctl->c_vec, *bp, *wp = vp + ctl->c_phase; t_sample zerodel = x->x_zerodel; while (n--) { double delsamps = (double)x->x_sr * iem_dp_calc_sum(*cin++, *fin++) - (double)zerodel; t_sample frac; int idelsamps; t_sample a, b, c, d, cminusb; if(delsamps < 1.00001) delsamps = 1.00001; if(delsamps > limit) delsamps = limit; delsamps += (double)fn; fn = fn - 1.0f; idelsamps = (int)delsamps; frac = (t_sample)(delsamps - (double)idelsamps); bp = wp - idelsamps; if(bp < vp + 4) bp += nsamps; d = bp[-3]; c = bp[-2]; b = bp[-1]; a = bp[0]; cminusb = c - b; *out++ = b + frac * ( cminusb - 0.1666667f * (1.-frac) * ( (d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b) ) ); } return (w+7); } static void vd_tilde_tilde_dsp(t_vd_tilde_tilde *x, t_signal **sp) { t_delwrite_tilde_tilde *delwriter = (t_delwrite_tilde_tilde *)pd_findbyclass(x->x_sym, delwrite_tilde_tilde_class); x->x_sr = sp[0]->s_sr * 0.001; if(delwriter) { delwrite_tilde_tilde_checkvecsize(delwriter, sp[0]->s_n); x->x_zerodel = (delwriter->x_sortno == ugen_getsortno() ? 0 : delwriter->x_vecsize); dsp_add(vd_tilde_tilde_perform, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, &delwriter->x_cspace, x, sp[0]->s_n); } else pd_error(x, "vd~~: %s: no such delwrite~~", x->x_sym->s_name); } static void vd_tilde_tilde_setup(void) { vd_tilde_tilde_class = class_new(gensym("vd~~"), (t_newmethod)vd_tilde_tilde_new, 0, sizeof(t_vd_tilde_tilde), 0, A_DEFSYM, 0); class_addmethod(vd_tilde_tilde_class, (t_method)vd_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); CLASS_MAINSIGNALIN(vd_tilde_tilde_class, t_vd_tilde_tilde, x_f); } /********************/ void delay_tilde_tilde_setup(void) { delwrite_tilde_tilde_setup(); delread_tilde_tilde_setup(); vd_tilde_tilde_setup(); } iem_utils-0.0.20240903/iem_dp/src/div__.c0000600000000000000000000000430214665566711014453 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ div__ or /__ ---------------------------- */ /* based on miller's /, which is part of pd, only with double precision */ static t_class *div___class; typedef struct _div__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_div__; static void div___bang(t_div__ *x) { double ddiv, nom; t_float fdiv; nom = iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); ddiv = (nom ? iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) / nom : 0); fdiv = (t_float)ddiv; outlet_float(x->x_out_fine, iem_dp_calc_residual(ddiv, fdiv)); outlet_float(x->x_out_coarse, fdiv); } static void div___float(t_div__ *x, t_floatarg f) { x->x_coarse_left = f; div___bang(x); } static void *div___new(t_symbol *s, int ac, t_atom *av) { t_div__ *x = (t_div__ *)pd_new(div___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void div___free(t_div__ *x) { } void div___setup(void) { div___class = class_new(gensym("div__"), (t_newmethod)div___new, 0, sizeof(t_div__), 0, A_GIMME, 0); class_addcreator((t_newmethod)div___new, gensym("/__"), A_GIMME, 0); class_addcreator((t_newmethod)div___new, gensym("/''"), A_GIMME, 0); class_addbang(div___class, div___bang); class_addfloat(div___class, div___float); } iem_utils-0.0.20240903/iem_dp/src/div~~.c0000600000000000000000000002167214665566711014562 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- div~~ ------------------------------ */ /* based on miller's /~ which is part of pd */ static t_class *div_tilde_tilde_class, *scalardiv_tilde_tilde_class; typedef struct _div_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_div_tilde_tilde; typedef struct _scalardiv_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalardiv_tilde_tilde; static void *div_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||((argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT))) { t_scalardiv_tilde_tilde *x = (t_scalardiv_tilde_tilde *)pd_new(scalardiv_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_div_tilde_tilde *x = (t_div_tilde_tilde *)pd_new(div_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *div_tilde_tilde_perform(t_int *w) { t_div_tilde_tilde *x = (t_div_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, nom; t_float f; while(n--) { nom = iem_dp_calc_sum(*in2c++, *in2f++); d = (nom ? iem_dp_calc_sum(*in1c++, *in1f++) / nom : 0); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *div_tilde_tilde_perf8(t_int *w) { t_div_tilde_tilde *x = (t_div_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d, nom; t_float f; nom = iem_dp_calc_sum(in2c[0], in2f[0]); d = (nom ? iem_dp_calc_sum(in1c[0], in1f[0]) / nom : 0); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; nom = iem_dp_calc_sum(in2c[1], in2f[1]); d = (nom ? iem_dp_calc_sum(in1c[1], in1f[1]) / nom : 0); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; nom = iem_dp_calc_sum(in2c[2], in2f[2]); d = (nom ? iem_dp_calc_sum(in1c[2], in1f[2]) / nom : 0); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; nom = iem_dp_calc_sum(in2c[3], in2f[3]); d = (nom ? iem_dp_calc_sum(in1c[3], in1f[3]) / nom : 0); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; nom = iem_dp_calc_sum(in2c[4], in2f[4]); d = (nom ? iem_dp_calc_sum(in1c[4], in1f[4]) / nom : 0); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; nom = iem_dp_calc_sum(in2c[5], in2f[5]); d = (nom ? iem_dp_calc_sum(in1c[5], in1f[5]) / nom : 0); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; nom = iem_dp_calc_sum(in2c[6], in2f[6]); d = (nom ? iem_dp_calc_sum(in1c[6], in1f[6]) / nom : 0); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; nom = iem_dp_calc_sum(in2c[7], in2f[7]); d = (nom ? iem_dp_calc_sum(in1c[7], in1f[7]) / nom : 0); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalardiv_tilde_tilde_perform(t_int *w) { t_scalardiv_tilde_tilde *x = (t_scalardiv_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; if(g) { double h=1.0/g; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) * h; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } } else { while(n--) { *outf++ = 0; *outc++ = 0; } } return(w+3); } static t_int *scalardiv_tilde_tilde_perf8(t_int *w) { t_scalardiv_tilde_tilde *x = (t_scalardiv_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); if(g) { double h=1.0/g; for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) * h; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) * h; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) * h; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) * h; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) * h; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) * h; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) * h; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) * h; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } } else { for(; n; n -= 8, outc += 8, outf += 8) { outf[0] = 0; outc[0] = 0; outf[1] = 0; outc[1] = 0; outf[2] = 0; outc[2] = 0; outf[3] = 0; outc[3] = 0; outf[4] = 0; outc[4] = 0; outf[5] = 0; outc[5] = 0; outf[6] = 0; outc[6] = 0; outf[7] = 0; outc[7] = 0; } } return(w+3); } static void div_tilde_tilde_dsp(t_div_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(div_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(div_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalardiv_tilde_tilde_dsp(t_scalardiv_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalardiv_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalardiv_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void div_tilde_tilde_setup(void) { div_tilde_tilde_class = class_new(gensym("/~~"), (t_newmethod)div_tilde_tilde_new, 0, sizeof(t_div_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)div_tilde_tilde_new, gensym("div~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(div_tilde_tilde_class, t_div_tilde_tilde, x_f); class_addmethod(div_tilde_tilde_class, (t_method)div_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); scalardiv_tilde_tilde_class = class_new(gensym("/~~"), 0, 0, sizeof(t_scalardiv_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalardiv_tilde_tilde_class, t_scalardiv_tilde_tilde, x_f); class_addmethod(scalardiv_tilde_tilde_class, (t_method)scalardiv_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/dptohex.c0000600000000000000000000000344614665566711015056 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2013 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- dptohex ------------------------------ */ /* double float to 16 digits of hexadecimal converter */ /* double float is only internal used */ /* to transfer this value, we divide this double value into use one float casted value */ /* and into the difference to the accurate double value. */ /* double float (sign_1 + exp_12 + mant_51) */ static t_class *dptohex_class; typedef struct _dptohex { t_object x_obj; t_float x_float_casted_value; t_float x_residual; } t_dptohex; static void dptohex_bang(t_dptohex *x) { char buf[100]; union tabfudge tf; tf.tf_d = iem_dp_calc_sum(x->x_float_casted_value, x->x_residual); sprintf(buf, "#%08X%08X", tf.tf_i[HIOFFSET], tf.tf_i[LOWOFFSET]); outlet_symbol(x->x_obj.ob_outlet, gensym(buf)); } static void dptohex_float(t_dptohex *x, t_floatarg f) { x->x_float_casted_value = f; dptohex_bang(x); } static void *dptohex_new(void) { t_dptohex *x = (t_dptohex *)pd_new(dptohex_class); floatinlet_new(&x->x_obj, &x->x_residual); x->x_float_casted_value = 0.0f; x->x_residual = 0.0f; outlet_new(&x->x_obj, &s_symbol); return (x); } static void dptohex_free(t_dptohex *x) { } void dptohex_setup(void) { dptohex_class = class_new(gensym("dptohex"), (t_newmethod)dptohex_new, (t_method)dptohex_free, sizeof(t_dptohex), 0, 0); class_addbang(dptohex_class, dptohex_bang); class_addfloat(dptohex_class, dptohex_float); } iem_utils-0.0.20240903/iem_dp/src/dptosym.c0000600000000000000000000000370314665566711015076 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- dptosym ------------------------------ */ /* double float to symbol-string of a double value converter */ /* double float is only internal used */ /* to transfer this value, we divide this double value into use one float casted value */ /* and into the difference to the accurate double value. */ /* double float (sign_1 + exp_12 + mant_51) */ static t_class *dptosym_class; typedef struct _dptosym { t_object x_obj; t_float x_float_casted_value; t_float x_residual; t_outlet *x_out_sym; t_outlet *x_out_any; } t_dptosym; static void dptosym_bang(t_dptosym *x) { char buf[100]; double d=iem_dp_calc_sum(x->x_float_casted_value, x->x_residual); t_atom at_dummy; sprintf(buf, "\"%.18g", d); outlet_anything(x->x_out_any, gensym(buf), 0, &at_dummy); outlet_symbol(x->x_out_sym, gensym(buf+1)); } static void dptosym_float(t_dptosym *x, t_floatarg f) { x->x_float_casted_value = f; // post("dptosym float float: %.12g + %.12g", x->x_float_casted_value, x->x_residual); dptosym_bang(x); } static void *dptosym_new(void) { t_dptosym *x = (t_dptosym *)pd_new(dptosym_class); floatinlet_new(&x->x_obj, &x->x_residual); x->x_float_casted_value = 0.0f; x->x_residual = 0.0f; x->x_out_sym = outlet_new(&x->x_obj, &s_symbol); x->x_out_any = outlet_new(&x->x_obj, &s_list); return (x); } void dptosym_setup(void) { dptosym_class = class_new(gensym("dptosym"), (t_newmethod)dptosym_new, 0, sizeof(t_dptosym), 0, 0); class_addbang(dptosym_class, dptosym_bang); class_addfloat(dptosym_class, dptosym_float); } iem_utils-0.0.20240903/iem_dp/src/ftohex.c0000600000000000000000000000230614665566711014672 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- ftohex ------------------------------ */ /* float to 8 digits of hexadecimal converter */ /* float (sign_1 + exp_8 + mant_23) */ static t_class *ftohex_class; typedef struct _ftohex { t_object x_obj; } t_ftohex; union tabfudge_f { float tf_f; long tf_l; }; static void ftohex_float(t_ftohex *x, t_floatarg f) { char buf[100]; union tabfudge_f tf; tf.tf_f = f; sprintf(buf, "#%08X", (unsigned int)tf.tf_l); outlet_symbol(x->x_obj.ob_outlet, gensym(buf)); } static void *ftohex_new(void) { t_ftohex *x = (t_ftohex *)pd_new(ftohex_class); outlet_new(&x->x_obj, &s_symbol); return (x); } void ftohex_setup(void) { ftohex_class = class_new(gensym("ftohex"), (t_newmethod)ftohex_new, 0, sizeof(t_ftohex), 0, 0); class_addfloat(ftohex_class, ftohex_float); } iem_utils-0.0.20240903/iem_dp/src/iem_dp.c0000600000000000000000000000675414665566711014645 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. * iem_dp written by IOhannes m zmoelnig, Thomas Musil, * Copyright (c) IEM KUG Graz Austria 2000 - 2008 */ /* iem_dp means double precision, it is a library of external pd objects */ /* which deal with array access and delay lines */ /* the way how objects comunicate with other objects in double precision is, */ /* to send two values on two different outputs to two different inputs */ /* one value is the float casted value of the original double value */ /* the other value is the difference in double of the original minus the float casted value */ /* the receiving inlets only cast them to double and add them */ #include "m_pd.h" #include "iemlib.h" //static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */ t_float iem_dp_cast_to_float(double d) { return((t_float)d); } double iem_dp_cast_to_double(t_float f) { return((double)f); } t_float iem_dp_calc_residual(double d, t_float f) { return(iem_dp_cast_to_float(d - iem_dp_cast_to_double(f))); } double iem_dp_calc_sum(t_float f, t_float r) { return(iem_dp_cast_to_double(f) + iem_dp_cast_to_double(r)); } static t_class *iem_dp_class; static void *iem_dp_new(void) { t_object *x = (t_object *)pd_new(iem_dp_class); return (x); } void ftohex_setup(void); void symtodp_setup(void); void dptosym_setup(void); void dptohex_setup(void); void vline_tilde_tilde_setup(void); void samphold_tilde_tilde_setup(void); void wrap_tilde_tilde_setup(void); void phasor_tilde_tilde_setup(void); void print_tilde_tilde_setup(void); void add___setup(void); void sub___setup(void); void mul___setup(void); void div___setup(void); void add_tilde_tilde_setup(void); void sub_tilde_tilde_setup(void); void mul_tilde_tilde_setup(void); void div_tilde_tilde_setup(void); void tabwrite_dp_setup(void); void tabread_dp_setup(void); void tabread4_dp_setup(void); void tabwrite_tilde_tilde_setup(void); void tabread_tilde_tilde_setup(void); void tabread4_tilde_tilde_setup(void); void max_dp_setup(void); void min_dp_setup(void); void max_tilde_tilde_setup(void); void min_tilde_tilde_setup(void); void random_dp_setup(void); void delay_tilde_tilde_setup(void); //void listtodp_setup(void); //void dqnsymtodp_setup(void); //void dptodqnsym_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_dp_setup(void) { iem_dp_class = class_new(gensym("iem_dp"), iem_dp_new, 0, sizeof(t_object), CLASS_NOINLET, 0); ftohex_setup(); symtodp_setup(); dptosym_setup(); dptohex_setup(); vline_tilde_tilde_setup(); samphold_tilde_tilde_setup(); wrap_tilde_tilde_setup(); phasor_tilde_tilde_setup(); print_tilde_tilde_setup(); add___setup(); sub___setup(); mul___setup(); div___setup(); add_tilde_tilde_setup(); sub_tilde_tilde_setup(); mul_tilde_tilde_setup(); div_tilde_tilde_setup(); tabwrite_dp_setup(); tabread_dp_setup(); tabread4_dp_setup(); tabwrite_tilde_tilde_setup(); tabread_tilde_tilde_setup(); tabread4_tilde_tilde_setup(); max_dp_setup(); min_dp_setup(); max_tilde_tilde_setup(); min_tilde_tilde_setup(); random_dp_setup(); delay_tilde_tilde_setup(); // listtodp_setup(); // dqnsymtodp_setup(); // dptodqnsym_setup(); post("iem_dp (R-1.19) library loaded! (c) IOhannes m zmoelnig, Thomas Musil 06.2013"); post(" zmoelnig%ciem.at iem KUG Graz Austria", '@'); post(" musil%ciem.at iem KUG Graz Austria", '@'); } iem_utils-0.0.20240903/iem_dp/src/iem_dp.h0000600000000000000000000000241114665566711014634 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2013 */ /* double precision library */ #ifndef __IEM_DP_H__ #define __IEM_DP_H__ /* #ifdef __i386__ */ /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ /* #define PD_BIGORSMALL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) #else #define PD_BIGORSMALL(f) 0 #endif #endif */ t_float iem_dp_cast_to_float(double d); double iem_dp_cast_to_double(t_float f); t_float iem_dp_calc_residual(double d, t_float f); double iem_dp_calc_sum(t_float f, t_float r); extern int ugen_getsortno(void); #endif /* #ifdef Z_USE_WORD_ARRAYS #define zarray_t t_word #define zarray_getarray garray_getfloatwords #define zarray_getfloat(pointer, index) (pointer[index].w_float) #define zarray_setfloat(pointer, index, value) (pointer[index].w_float = value) #else #define zarray_t t_float #define zarray_getarray garray_getfloatarray #define zarray_getfloat(pointer, index) (pointer[index]) #define zarray_setfloat(pointer, index, value) (pointer[index] = value) #endif*/ iem_utils-0.0.20240903/iem_dp/src/iemlib.h0000600000000000000000000001360714665566711014651 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2018 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) #ifdef _WIN32 //t_symbol *iemgui_key_sym=0; #include #else //extern t_symbol *iemgui_key_sym; #include #endif extern int sys_noloadbang; //millers m_pd.h beg /* Microsoft Visual Studio is not C99, it does not provide stdint.h */ #ifdef _MSC_VER typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else # include #endif #if !defined(PD_FLOATSIZE) /* if compiled pd version < 0.47*/ # define PD_FLOATSIZE 32 #endif typedef union { float f; unsigned int ui; }t_iemdenormal_f; typedef union { double f; unsigned int ui[2]; }t_iemdenormal_d; #ifndef _MSC_VER /* Micrsoft compiler can't handle "inline" function/macros */ #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) /* a test for NANs and denormals. Should only be necessary on x86 variants. */ /* on arm, the impact is less noticeable, but...why not? */ static inline int IEM_DENORMAL_F(float f) /* malformed float 32 */ { t_iemdenormal_f pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } static inline int IEM_DENORMAL_D(double f) /* malformed double 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 typedef union { t_float f; unsigned int ui; }t_iemdenormal_t32; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 32 */ { t_iemdenormal_t32 pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } #elif PD_FLOATSIZE == 64 typedef union { t_float f; unsigned int ui[2]; }t_iemdenormal_t64; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif /* PD_FLOATSIZE */ #else /* not INTEL or ARM */ #define IEM_DENORMAL_T(f) 0 #define IEM_DENORMAL_D(f) 0 #endif #else /* _MSC_VER */ #define IEM_DENORMAL_F(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) static int IEM_DENORMAL_D(double f) /* malformed t_float 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 #define IEM_DENORMAL_T(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) #else /* 64 bits... don't know what to do here */ //#define IEM_DENORMAL_T(f) (!(((f) >= 0) || ((f) <= 0))) int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif #endif /* _MSC_VER */ //millers m_pd.h end /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #ifndef BUILD_DATE # define BUILD_DATE "" __DATE__ " : " __TIME__ #endif #if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43) # define iem_open sys_open # define iem_close sys_close # define iem_fopen sys_fopen # define iem_fclose sys_fclose #else # define iem_open open # define iem_close close # define iem_fopen fopen # define iem_fclose fclose #endif // millers d_osc.c beg #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) \ || defined(__OpenBSD__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \ defined(ANDROID) #include #endif #ifdef __MINGW32__ #include #endif #ifdef _MSC_VER /* _MSVC lacks BYTE_ORDER and LITTLE_ENDIAN */ #define LITTLE_ENDIAN 0x0001 #define BYTE_ORDER LITTLE_ENDIAN #endif #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 #else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ #endif union tabfudge { double tf_d; int32_t tf_i[2]; }; // millers d_osc.c end // millers d_delay.c beg #define IEMDEFDELVS 64 #define IEMXTRASAMPS 4 #define IEMSAMPBLK 4 // millers d_delay.c end #endif iem_utils-0.0.20240903/iem_dp/src/max__.c0000600000000000000000000000430614665566711014462 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ max_dp ---------------------------- */ /* based on miller's max, which is part of pd, only with double precision */ static t_class *max_dp_class; typedef struct _max_dp { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_max_dp; static void max_dp_bang(t_max_dp *x) { double dleft, dright; dleft = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left); dright = iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); if(dleft > dright) { outlet_float(x->x_out_fine, x->x_fine_left); outlet_float(x->x_out_coarse, x->x_coarse_left); } else { outlet_float(x->x_out_fine, x->x_fine_right); outlet_float(x->x_out_coarse, x->x_coarse_right); } } static void max_dp_float(t_max_dp *x, t_floatarg f) { x->x_coarse_left = f; max_dp_bang(x); } static void *max_dp_new(t_symbol *s, int ac, t_atom *av) { t_max_dp *x = (t_max_dp *)pd_new(max_dp_class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } void max_dp_setup(void) { max_dp_class = class_new(gensym("max__"), (t_newmethod)max_dp_new, 0, sizeof(t_max_dp), 0, A_GIMME, 0); class_addcreator((t_newmethod)max_dp_new, gensym("max''"), A_GIMME, 0); class_addbang(max_dp_class, max_dp_bang); class_addfloat(max_dp_class, max_dp_float); } iem_utils-0.0.20240903/iem_dp/src/max~~.c0000600000000000000000000002065014665566711014560 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- max~~ ------------------------------ */ /* based on miller's max~ which is part of pd */ static t_class *max_tilde_tilde_class, *scalarmax_tilde_tilde_class; typedef struct _max_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_max_tilde_tilde; typedef struct _scalarmax_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarmax_tilde_tilde; static void *max_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||((argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT))) { t_scalarmax_tilde_tilde *x = (t_scalarmax_tilde_tilde *)pd_new(scalarmax_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_max_tilde_tilde *x = (t_max_tilde_tilde *)pd_new(max_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *max_tilde_tilde_perform(t_int *w) { t_max_tilde_tilde *x = (t_max_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; t_sample i2c = *in2c++; t_sample i2f = *in2f++; double dleft = iem_dp_calc_sum(i1c, i1f); double dright = iem_dp_calc_sum(i2c, i2f); if(dleft > dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *max_tilde_tilde_perf8(t_int *w) { t_max_tilde_tilde *x = (t_max_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) + iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) + iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) + iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) + iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) + iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) + iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) + iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) + iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarmax_tilde_tilde_perform(t_int *w) { t_scalarmax_tilde_tilde *x = (t_scalarmax_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample i2c = x->x_in2_coarse; t_sample i2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double dright = iem_dp_calc_sum(i2c, i2f); while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; double dleft = iem_dp_calc_sum(i1c, i1f); if(dleft > dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *scalarmax_tilde_tilde_perf8(t_int *w) { t_scalarmax_tilde_tilde *x = (t_scalarmax_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) + g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) + g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) + g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) + g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) + g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) + g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) + g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) + g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void max_tilde_tilde_dsp(t_max_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(max_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(max_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(max_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarmax_tilde_tilde_dsp(t_scalarmax_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarmax_tilde_tilde_perform, 2, sp[0]->s_n); else dsp_add(scalarmax_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(scalarmax_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void max_tilde_tilde_setup(void) { max_tilde_tilde_class = class_new(gensym("max~~"), (t_newmethod)max_tilde_tilde_new, 0, sizeof(t_max_tilde_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(max_tilde_tilde_class, t_max_tilde_tilde, x_f); class_addmethod(max_tilde_tilde_class, (t_method)max_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); scalarmax_tilde_tilde_class = class_new(gensym("max~~"), 0, 0, sizeof(t_scalarmax_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarmax_tilde_tilde_class, t_scalarmax_tilde_tilde, x_f); class_addmethod(scalarmax_tilde_tilde_class, (t_method)scalarmax_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/min__.c0000600000000000000000000000430614665566711014460 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ min_dp ---------------------------- */ /* based on miller's min, which is part of pd, only with double precision */ static t_class *min_dp_class; typedef struct _min_dp { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_min_dp; static void min_dp_bang(t_min_dp *x) { double dleft, dright; dleft = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left); dright = iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); if(dleft < dright) { outlet_float(x->x_out_fine, x->x_fine_left); outlet_float(x->x_out_coarse, x->x_coarse_left); } else { outlet_float(x->x_out_fine, x->x_fine_right); outlet_float(x->x_out_coarse, x->x_coarse_right); } } static void min_dp_float(t_min_dp *x, t_floatarg f) { x->x_coarse_left = f; min_dp_bang(x); } static void *min_dp_new(t_symbol *s, int ac, t_atom *av) { t_min_dp *x = (t_min_dp *)pd_new(min_dp_class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } void min_dp_setup(void) { min_dp_class = class_new(gensym("min__"), (t_newmethod)min_dp_new, 0, sizeof(t_min_dp), 0, A_GIMME, 0); class_addcreator((t_newmethod)min_dp_new, gensym("min''"), A_GIMME, 0); class_addbang(min_dp_class, min_dp_bang); class_addfloat(min_dp_class, min_dp_float); } iem_utils-0.0.20240903/iem_dp/src/min~~.c0000600000000000000000000002065014665566711014556 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- min~~ ------------------------------ */ /* based on miller's min~ which is part of pd */ static t_class *min_tilde_tilde_class, *scalarmin_tilde_tilde_class; typedef struct _min_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_min_tilde_tilde; typedef struct _scalarmin_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarmin_tilde_tilde; static void *min_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||((argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT))) { t_scalarmin_tilde_tilde *x = (t_scalarmin_tilde_tilde *)pd_new(scalarmin_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_min_tilde_tilde *x = (t_min_tilde_tilde *)pd_new(min_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *min_tilde_tilde_perform(t_int *w) { t_min_tilde_tilde *x = (t_min_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; t_sample i2c = *in2c++; t_sample i2f = *in2f++; double dleft = iem_dp_calc_sum(i1c, i1f); double dright = iem_dp_calc_sum(i2c, i2f); if(dleft < dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *min_tilde_tilde_perf8(t_int *w) { t_min_tilde_tilde *x = (t_min_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) + iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) + iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) + iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) + iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) + iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) + iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) + iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) + iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarmin_tilde_tilde_perform(t_int *w) { t_scalarmin_tilde_tilde *x = (t_scalarmin_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample i2c = x->x_in2_coarse; t_sample i2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double dright = iem_dp_calc_sum(i2c, i2f); while(n--) { t_sample i1c = *in1c++; t_sample i1f = *in1f++; double dleft = iem_dp_calc_sum(i1c, i1f); if(dleft < dright) { *outf++ = i1f; *outc++ = i1c; } else { *outf++ = i2f; *outc++ = i2c; } } return(w+3); } static t_int *scalarmin_tilde_tilde_perf8(t_int *w) { t_scalarmin_tilde_tilde *x = (t_scalarmin_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) + g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) + g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) + g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) + g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) + g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) + g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) + g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) + g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void min_tilde_tilde_dsp(t_min_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(min_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(min_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(min_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarmin_tilde_tilde_dsp(t_scalarmin_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarmin_tilde_tilde_perform, 2, sp[0]->s_n); else dsp_add(scalarmin_tilde_tilde_perform, 2, x, sp[0]->s_n); //dsp_add(scalarmin_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void min_tilde_tilde_setup(void) { min_tilde_tilde_class = class_new(gensym("min~~"), (t_newmethod)min_tilde_tilde_new, 0, sizeof(t_min_tilde_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(min_tilde_tilde_class, t_min_tilde_tilde, x_f); class_addmethod(min_tilde_tilde_class, (t_method)min_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); scalarmin_tilde_tilde_class = class_new(gensym("min~~"), 0, 0, sizeof(t_scalarmin_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarmin_tilde_tilde_class, t_scalarmin_tilde_tilde, x_f); class_addmethod(scalarmin_tilde_tilde_class, (t_method)scalarmin_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/mul__.c0000600000000000000000000000427114665566711014473 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ mul__ or *__ ---------------------------- */ /* based on miller's *, which is part of pd, only with double precision */ static t_class *mul___class; typedef struct _mul__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_mul__; static void mul___bang(t_mul__ *x) { double dprod; t_float fprod; dprod = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) * iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); fprod = iem_dp_cast_to_float(dprod); outlet_float(x->x_out_fine, iem_dp_calc_residual(dprod, fprod)); outlet_float(x->x_out_coarse, fprod); } static void mul___float(t_mul__ *x, t_floatarg f) { x->x_coarse_left = f; mul___bang(x); } static void *mul___new(t_symbol *s, int ac, t_atom *av) { t_mul__ *x = (t_mul__ *)pd_new(mul___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void mul___free(t_mul__ *x) { } void mul___setup(void) { mul___class = class_new(gensym("mul__"), (t_newmethod)mul___new, 0, sizeof(t_mul__), 0, A_GIMME, 0); class_addcreator((t_newmethod)mul___new, gensym("*__"), A_GIMME, 0); class_addcreator((t_newmethod)mul___new, gensym("*''"), A_GIMME, 0); class_addbang(mul___class, mul___bang); class_addfloat(mul___class, mul___float); } iem_utils-0.0.20240903/iem_dp/src/mul~~.c0000600000000000000000000002011314665566711014562 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- mul~~ ------------------------------ */ /* based on miller's *~ which is part of pd */ static t_class *mul_tilde_tilde_class, *scalarmul_tilde_tilde_class; typedef struct _mul_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_mul_tilde_tilde; typedef struct _scalarmul_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarmul_tilde_tilde; static void *mul_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||((argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT))) { t_scalarmul_tilde_tilde *x = (t_scalarmul_tilde_tilde *)pd_new(scalarmul_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_mul_tilde_tilde *x = (t_mul_tilde_tilde *)pd_new(mul_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *mul_tilde_tilde_perform(t_int *w) { t_mul_tilde_tilde *x = (t_mul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d; t_float f; while(n--) { d = iem_dp_calc_sum(*in1c++, *in1f++) * iem_dp_calc_sum(*in2c++, *in2f++); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *mul_tilde_tilde_perf8(t_int *w) { t_mul_tilde_tilde *x = (t_mul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) * iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) * iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) * iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) * iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) * iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) * iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) * iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) * iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarmul_tilde_tilde_perform(t_int *w) { t_scalarmul_tilde_tilde *x = (t_scalarmul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) * g; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *scalarmul_tilde_tilde_perf8(t_int *w) { t_scalarmul_tilde_tilde *x = (t_scalarmul_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) * g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) * g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) * g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) * g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) * g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) * g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) * g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) * g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void mul_tilde_tilde_dsp(t_mul_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(mul_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(mul_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarmul_tilde_tilde_dsp(t_scalarmul_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarmul_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalarmul_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void mul_tilde_tilde_setup(void) { mul_tilde_tilde_class = class_new(gensym("*~~"), (t_newmethod)mul_tilde_tilde_new, 0, sizeof(t_mul_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)mul_tilde_tilde_new, gensym("mul~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(mul_tilde_tilde_class, t_mul_tilde_tilde, x_f); class_addmethod(mul_tilde_tilde_class, (t_method)mul_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); scalarmul_tilde_tilde_class = class_new(gensym("*~~"), 0, 0, sizeof(t_scalarmul_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarmul_tilde_tilde_class, t_scalarmul_tilde_tilde, x_f); class_addmethod(scalarmul_tilde_tilde_class, (t_method)scalarmul_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/phasor~~.c0000600000000000000000000000500314665566711015262 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- phasor~~ ------------------------------ */ /* based on miller's phasor~ which is part of pd */ static t_class *phasor_tilde_tilde_class, *scalarphasor_tilde_tilde_class; typedef struct _phasor_tilde_tilde { t_object x_obj; double x_phase; double x_rcp_sr; t_float x_freq; } t_phasor_tilde_tilde; static void *phasor_tilde_tilde_new(t_floatarg freq) { t_phasor_tilde_tilde *x = (t_phasor_tilde_tilde *)pd_new(phasor_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); x->x_phase = 0; x->x_rcp_sr = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_freq = freq; return(x); } static t_int *phasor_tilde_tilde_perform(t_int *w) { t_phasor_tilde_tilde *x = (t_phasor_tilde_tilde *)(w[1]); t_sample *freq_in = (t_sample *)(w[2]); t_sample *outc = (t_sample *)(w[3]); t_sample *outf = (t_sample *)(w[4]); int n = (int)(w[5]); double dphase = x->x_phase; double rcp_sr = x->x_rcp_sr; double fin; t_float fphase; int k; while(n--) { fin = (double)*freq_in++; k = (int)dphase; if(dphase >= 0) dphase -= (double)k; else dphase -= (double)(k-1); fphase = iem_dp_cast_to_float(dphase); *outf++ = iem_dp_calc_residual(dphase, fphase); *outc++ = fphase; dphase += fin * rcp_sr; } x->x_phase = dphase; return(w+6); } static void phasor_tilde_tilde_dsp(t_phasor_tilde_tilde *x, t_signal **sp) { x->x_rcp_sr = (double)(1.0)/(double)(sp[0]->s_sr); dsp_add(phasor_tilde_tilde_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } static void phasor_tilde_tilde_ft1(t_phasor_tilde_tilde *x, t_floatarg ph) { x->x_phase = (double)ph; } void phasor_tilde_tilde_setup(void) { phasor_tilde_tilde_class = class_new(gensym("phasor~~"), (t_newmethod)phasor_tilde_tilde_new, 0, sizeof(t_phasor_tilde_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(phasor_tilde_tilde_class, t_phasor_tilde_tilde, x_freq); class_addmethod(phasor_tilde_tilde_class, (t_method)phasor_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(phasor_tilde_tilde_class, (t_method)phasor_tilde_tilde_ft1, gensym("ft1"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_dp/src/print~~.c0000600000000000000000000000541514665566711015131 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- print~~ ------------------------------ */ /* based on miller's print~ which is part of pd */ static t_class *print_tilde_tilde_class; typedef struct _print_tilde_tilde { t_object x_obj; t_float x_f; t_symbol *x_sym; int x_count; } t_print_tilde_tilde; static void *print_tilde_tilde_new(t_symbol *s) { t_print_tilde_tilde *x = (t_print_tilde_tilde *)pd_new(print_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); x->x_sym = (s->s_name[0] ? s : gensym("print~~")); x->x_count = 0; x->x_f = 0; return(x); } static t_int *print_tilde_tilde_perform(t_int *w) { t_print_tilde_tilde *x = (t_print_tilde_tilde *)(w[1]); t_sample *inc = (t_sample *)(w[2]); t_sample *inf = (t_sample *)(w[3]); int n = (int)(w[4]); if(x->x_count) { post("%s:", x->x_sym->s_name); while(n >= 4) { post("%-20.14g %-20.14g %-20.14g %-20.14g", iem_dp_calc_sum(inc[0], inf[0]), iem_dp_calc_sum(inc[1], inf[1]), iem_dp_calc_sum(inc[2], inf[2]), iem_dp_calc_sum(inc[3], inf[3])); n -= 4; inc += 4; inf += 4; } if(n) { if(n == 3) { post("%-20.14g %-20.14g %-20.14g", iem_dp_calc_sum(inc[0], inf[0]), iem_dp_calc_sum(inc[1], inf[1]), iem_dp_calc_sum(inc[2], inf[2])); } else if(n == 2) { post("%-20.14g %-20.14g", iem_dp_calc_sum(inc[0], inf[0]), iem_dp_calc_sum(inc[1], inf[1])); } else if(n == 1) { post("%-20.14g", iem_dp_calc_sum(inc[0], inf[0])); } } x->x_count--; } return(w+5); } static void print_tilde_tilde_float(t_print_tilde_tilde *x, t_floatarg f) { if(f < 0) f = 0; x->x_count = f; } static void print_tilde_tilde_bang(t_print_tilde_tilde *x) { x->x_count = 1; } static void print_tilde_tilde_dsp(t_print_tilde_tilde *x, t_signal **sp) { dsp_add(print_tilde_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); } void print_tilde_tilde_setup(void) { print_tilde_tilde_class = class_new(gensym("print~~"), (t_newmethod)print_tilde_tilde_new, 0, sizeof(t_print_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(print_tilde_tilde_class, t_print_tilde_tilde, x_f); class_addmethod(print_tilde_tilde_class, (t_method)print_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addbang(print_tilde_tilde_class, print_tilde_tilde_bang); class_addfloat(print_tilde_tilde_class, print_tilde_tilde_float); } iem_utils-0.0.20240903/iem_dp/src/random__.c0000600000000000000000000000533114665566711015154 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ random_dp ---------------------------- */ /* based on miller's random, which is part of pd, only with double precision */ static t_class *random_dp_class; typedef struct _random_dp { t_object x_obj; t_float x_max_coarse; t_float x_max_fine; unsigned int x_state; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_random_dp; static int makeseed(void) { static unsigned int random_nextseed = 1489853723; random_nextseed = random_nextseed * 435898247 + 938284287; return (random_nextseed & 0x7fffffff); } static void *random_dp_new(t_symbol *s, int ac, t_atom *av) { t_random_dp *x = (t_random_dp *)pd_new(random_dp_class); if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_max_coarse = atom_getfloatarg(0, ac, av); else x->x_max_coarse = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_max_fine = atom_getfloatarg(1, ac, av); else x->x_max_fine = 0.0f; x->x_state = makeseed(); floatinlet_new(&x->x_obj, &x->x_max_coarse); floatinlet_new(&x->x_obj, &x->x_max_fine); x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void random_dp_bang(t_random_dp *x) { int n = (int)iem_dp_calc_sum(x->x_max_coarse, x->x_max_fine); int nval; int range = (n < 1 ? 1 : n); unsigned int randval = x->x_state; t_float fine, coarse; x->x_state = randval = randval * 472940017 + 832416023; nval = ((double)range) * ((double)randval) * (1./4294967296.); if(nval >= range) nval = range-1; coarse = iem_dp_cast_to_float((double)nval); outlet_float(x->x_out_fine, iem_dp_calc_residual((double)nval, coarse)); outlet_float(x->x_out_coarse, coarse); } static void random_dp_seed(t_random_dp *x, t_symbol *s, int ac, t_atom *av) { t_float fine, coarse; if((ac > 0) && (IS_A_FLOAT(av, 0))) coarse = atom_getfloatarg(0, ac, av); else coarse = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) fine = atom_getfloatarg(1, ac, av); else fine = 0.0f; x->x_state = (int)iem_dp_calc_sum(coarse, fine); } void random_dp_setup(void) { random_dp_class = class_new(gensym("random__"), (t_newmethod)random_dp_new, 0, sizeof(t_random_dp), 0, A_GIMME, 0); class_addcreator((t_newmethod)random_dp_new, gensym("random''"), A_GIMME, 0); class_addbang(random_dp_class, random_dp_bang); class_addmethod(random_dp_class, (t_method)random_dp_seed, gensym("seed"), A_GIMME, 0); } iem_utils-0.0.20240903/iem_dp/src/samphold~~.c0000600000000000000000000000756314665566711015612 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ---------------- samphold~~ - double precision sample and hold ----------------- */ /* based on miller's samphold~ which is part of pd */ typedef struct samphold_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; double x_lastin; double x_lastout; } t_samphold_tilde_tilde; t_class *samphold_tilde_tilde_class; static void *samphold_tilde_tilde_new(void) { t_samphold_tilde_tilde *x = (t_samphold_tilde_tilde *)pd_new(samphold_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_lastin = 0; x->x_lastout = 0; x->x_f = 0; return (x); } static t_int *samphold_tilde_tilde_perform(t_int *w) { t_samphold_tilde_tilde *x = (t_samphold_tilde_tilde *)(w[1]); int n = (int)(w[2]), i; t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double lastin = x->x_lastin; double d_lastout = x->x_lastout; t_float f_lastout = 0.0f; for(i = 0; i < n; i++, in1c++, in1f++) { double next = iem_dp_calc_sum(*in2c++, *in2f++); if(next < lastin) d_lastout = iem_dp_calc_sum(*in1c, *in1f); f_lastout = iem_dp_cast_to_float(d_lastout); *outf++ = iem_dp_calc_residual(d_lastout, f_lastout); *outc++ = f_lastout; lastin = next; } x->x_lastin = lastin; x->x_lastout = d_lastout; return(w+3); } static void samphold_tilde_tilde_dsp(t_samphold_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; dsp_add(samphold_tilde_tilde_perform, 2, x, sp[0]->s_n); } static void samphold_tilde_tilde_reset(t_samphold_tilde_tilde *x, t_symbol *s, int argc, t_atom *argv) { t_float coarse, fine; if((argc > 0) && (IS_A_FLOAT(argv, 0))) coarse = atom_getfloatarg(0, argc, argv); else coarse = 1.0e20f; if((argc > 1) && (IS_A_FLOAT(argv, 1))) fine = atom_getfloatarg(1, argc, argv); else fine = 0.0f; x->x_lastin = iem_dp_calc_sum(coarse, fine); } static void samphold_tilde_tilde_set(t_samphold_tilde_tilde *x, t_symbol *s, int argc, t_atom *argv) { t_float coarse, fine; if((argc > 0) && (IS_A_FLOAT(argv, 0))) coarse = atom_getfloatarg(0, argc, argv); else coarse = 0.0f; if((argc > 1) && (IS_A_FLOAT(argv, 1))) fine = atom_getfloatarg(1, argc, argv); else fine = 0.0f; x->x_lastout = iem_dp_calc_sum(coarse, fine); } void samphold_tilde_tilde_setup(void) { samphold_tilde_tilde_class = class_new(gensym("samphold~~"), (t_newmethod)samphold_tilde_tilde_new, 0, sizeof(t_samphold_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(samphold_tilde_tilde_class, t_samphold_tilde_tilde, x_f); class_addmethod(samphold_tilde_tilde_class, (t_method)samphold_tilde_tilde_set, gensym("set"), A_GIMME, 0); class_addmethod(samphold_tilde_tilde_class, (t_method)samphold_tilde_tilde_reset, gensym("reset"), A_GIMME, 0); class_addmethod(samphold_tilde_tilde_class, (t_method)samphold_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/sub__.c0000600000000000000000000000427114665566711014467 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* ------------------------ sub__ or -__ ---------------------------- */ /* based on miller's -, which is part of pd, only with double precision */ static t_class *sub___class; typedef struct _sub__ { t_object x_obj; t_float x_coarse_left; t_float x_fine_left; t_float x_coarse_right; t_float x_fine_right; t_outlet *x_out_coarse; t_outlet *x_out_fine; } t_sub__; static void sub___bang(t_sub__ *x) { double ddiff; t_float fdiff; ddiff = iem_dp_calc_sum(x->x_coarse_left, x->x_fine_left) - iem_dp_calc_sum(x->x_coarse_right, x->x_fine_right); fdiff = iem_dp_cast_to_float(ddiff); outlet_float(x->x_out_fine, iem_dp_calc_residual(ddiff, fdiff)); outlet_float(x->x_out_coarse, fdiff); } static void sub___float(t_sub__ *x, t_floatarg f) { x->x_coarse_left = f; sub___bang(x); } static void *sub___new(t_symbol *s, int ac, t_atom *av) { t_sub__ *x = (t_sub__ *)pd_new(sub___class); floatinlet_new(&x->x_obj, &x->x_fine_left); floatinlet_new(&x->x_obj, &x->x_coarse_right); floatinlet_new(&x->x_obj, &x->x_fine_right); x->x_coarse_left = 0.0f; x->x_fine_left = 0.0f; if((ac > 0) && (IS_A_FLOAT(av, 0))) x->x_coarse_right = atom_getfloatarg(0, ac, av); else x->x_coarse_right = 0.0f; if((ac > 1) && (IS_A_FLOAT(av, 1))) x->x_fine_right = atom_getfloatarg(1, ac, av); else x->x_fine_right = 0.0f; x->x_out_coarse = outlet_new(&x->x_obj, &s_float); x->x_out_fine = outlet_new(&x->x_obj, &s_float); return (x); } static void sub___free(t_sub__ *x) { } void sub___setup(void) { sub___class = class_new(gensym("sub__"), (t_newmethod)sub___new, 0, sizeof(t_sub__), 0, A_GIMME, 0); class_addcreator((t_newmethod)sub___new, gensym("-__"), A_GIMME, 0); class_addcreator((t_newmethod)sub___new, gensym("-''"), A_GIMME, 0); class_addbang(sub___class, sub___bang); class_addfloat(sub___class, sub___float); } iem_utils-0.0.20240903/iem_dp/src/sub~~.c0000600000000000000000000002011114665566711014554 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- sub~~ ------------------------------ */ /* based on miller's -~ which is part of pd */ static t_class *sub_tilde_tilde_class, *scalarsub_tilde_tilde_class; typedef struct _sub_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_in2_coarse; t_sample *x_in2_fine; t_sample *x_out_coarse; t_sample *x_out_fine; } t_sub_tilde_tilde; typedef struct _scalarsub_tilde_tilde { t_object x_obj; t_float x_f; t_sample *x_in1_coarse; t_sample *x_in1_fine; t_sample *x_out_coarse; t_sample *x_out_fine; t_sample x_in2_coarse; t_sample x_in2_fine; } t_scalarsub_tilde_tilde; static void *sub_tilde_tilde_new(t_symbol *s, int argc, t_atom *argv) { if(((argc==1)&&(argv->a_type == A_FLOAT))||((argc>=2)&&(argv->a_type == A_FLOAT)&&((argv+1)->a_type == A_FLOAT))) { t_scalarsub_tilde_tilde *x = (t_scalarsub_tilde_tilde *)pd_new(scalarsub_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); floatinlet_new(&x->x_obj, &x->x_in2_coarse); floatinlet_new(&x->x_obj, &x->x_in2_fine); x->x_in2_coarse = atom_getfloatarg(0, argc, argv); if(argc>=2) x->x_in2_fine = atom_getfloatarg(1, argc, argv); else x->x_in2_fine = 0; outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } else /* either no arguments or symbols */ { t_sub_tilde_tilde *x = (t_sub_tilde_tilde *)pd_new(sub_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } } static t_int *sub_tilde_tilde_perform(t_int *w) { t_sub_tilde_tilde *x = (t_sub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d; t_float f; while(n--) { d = iem_dp_calc_sum(*in1c++, *in1f++) - iem_dp_calc_sum(*in2c++, *in2f++); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *sub_tilde_tilde_perf8(t_int *w) { t_sub_tilde_tilde *x = (t_sub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *in1c = x->x_in1_coarse; t_sample *in1f = x->x_in1_fine; t_sample *in2c = x->x_in2_coarse; t_sample *in2f = x->x_in2_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; for(; n; n -= 8, in1c += 8, in1f += 8, in2c += 8, in2f += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(in1c[0], in1f[0]) - iem_dp_calc_sum(in2c[0], in2f[0]); f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(in1c[1], in1f[1]) - iem_dp_calc_sum(in2c[1], in2f[1]); f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(in1c[2], in1f[2]) - iem_dp_calc_sum(in2c[2], in2f[2]); f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(in1c[3], in1f[3]) - iem_dp_calc_sum(in2c[3], in2f[3]); f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(in1c[4], in1f[4]) - iem_dp_calc_sum(in2c[4], in2f[4]); f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(in1c[5], in1f[5]) - iem_dp_calc_sum(in2c[5], in2f[5]); f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(in1c[6], in1f[6]) - iem_dp_calc_sum(in2c[6], in2f[6]); f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(in1c[7], in1f[7]) - iem_dp_calc_sum(in2c[7], in2f[7]); f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static t_int *scalarsub_tilde_tilde_perform(t_int *w) { t_scalarsub_tilde_tilde *x = (t_scalarsub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double d, g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); t_float f; while(n--) { d = iem_dp_calc_sum(*inc++, *inf++) - g; f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+3); } static t_int *scalarsub_tilde_tilde_perf8(t_int *w) { t_scalarsub_tilde_tilde *x = (t_scalarsub_tilde_tilde *)(w[1]); int n = (int)(w[2]); t_sample *inc = x->x_in1_coarse; t_sample *inf = x->x_in1_fine; t_sample *outc = x->x_out_coarse; t_sample *outf = x->x_out_fine; double g=iem_dp_calc_sum(x->x_in2_coarse, x->x_in2_fine); for(; n; n -= 8, inc += 8, inf += 8, outc += 8, outf += 8) { double d; t_float f; d = iem_dp_calc_sum(inc[0], inf[0]) - g; f = iem_dp_cast_to_float(d); outf[0] = iem_dp_calc_residual(d, f); outc[0] = f; d = iem_dp_calc_sum(inc[1], inf[1]) - g; f = iem_dp_cast_to_float(d); outf[1] = iem_dp_calc_residual(d, f); outc[1] = f; d = iem_dp_calc_sum(inc[2], inf[2]) - g; f = iem_dp_cast_to_float(d); outf[2] = iem_dp_calc_residual(d, f); outc[2] = f; d = iem_dp_calc_sum(inc[3], inf[3]) - g; f = iem_dp_cast_to_float(d); outf[3] = iem_dp_calc_residual(d, f); outc[3] = f; d = iem_dp_calc_sum(inc[4], inf[4]) - g; f = iem_dp_cast_to_float(d); outf[4] = iem_dp_calc_residual(d, f); outc[4] = f; d = iem_dp_calc_sum(inc[5], inf[5]) - g; f = iem_dp_cast_to_float(d); outf[5] = iem_dp_calc_residual(d, f); outc[5] = f; d = iem_dp_calc_sum(inc[6], inf[6]) - g; f = iem_dp_cast_to_float(d); outf[6] = iem_dp_calc_residual(d, f); outc[6] = f; d = iem_dp_calc_sum(inc[7], inf[7]) - g; f = iem_dp_cast_to_float(d); outf[7] = iem_dp_calc_residual(d, f); outc[7] = f; } return(w+3); } static void sub_tilde_tilde_dsp(t_sub_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_in2_coarse = sp[2]->s_vec; x->x_in2_fine = sp[3]->s_vec; x->x_out_coarse = sp[4]->s_vec; x->x_out_fine = sp[5]->s_vec; if(sp[0]->s_n&7) dsp_add(sub_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(sub_tilde_tilde_perf8, 2, x, sp[0]->s_n); } static void scalarsub_tilde_tilde_dsp(t_scalarsub_tilde_tilde *x, t_signal **sp) { x->x_in1_coarse = sp[0]->s_vec; x->x_in1_fine = sp[1]->s_vec; x->x_out_coarse = sp[2]->s_vec; x->x_out_fine = sp[3]->s_vec; if(sp[0]->s_n&7) dsp_add(scalarsub_tilde_tilde_perform, 2, x, sp[0]->s_n); else dsp_add(scalarsub_tilde_tilde_perf8, 2, x, sp[0]->s_n); } void sub_tilde_tilde_setup(void) { sub_tilde_tilde_class = class_new(gensym("-~~"), (t_newmethod)sub_tilde_tilde_new, 0, sizeof(t_sub_tilde_tilde), 0, A_GIMME, 0); class_addcreator((t_newmethod)sub_tilde_tilde_new, gensym("sub~~"), A_GIMME, 0); CLASS_MAINSIGNALIN(sub_tilde_tilde_class, t_sub_tilde_tilde, x_f); class_addmethod(sub_tilde_tilde_class, (t_method)sub_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); scalarsub_tilde_tilde_class = class_new(gensym("-~~"), 0, 0, sizeof(t_scalarsub_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(scalarsub_tilde_tilde_class, t_scalarsub_tilde_tilde, x_f); class_addmethod(scalarsub_tilde_tilde_class, (t_method)scalarsub_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/src/symtodp.c0000600000000000000000000000705014665566711015075 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2013 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" #include #include #include /* -------------------------- symtodp ------------------------------ */ /* symbol double precision number to double float converter */ /* double float is only internal used */ /* to transfer this value, we divide this double value into use one float casted value */ /* and into the difference to the accurate double value. */ /* double float (sign_1 + exp_12 + mant_51) */ static t_class *symtodp_class; typedef struct _symtodp { t_object x_obj; double x_inner_double_value; t_outlet *x_out_floatcasted; t_outlet *x_out_residual; } t_symtodp; static double symtodp_calc_list_sum(int ac, t_atom *av) { int i; char str[1000], buf[100], *dummy; str[0] = 0; for(i=0; ix_inner_double_value); outlet_float(x->x_out_residual, iem_dp_calc_residual(x->x_inner_double_value, float_casted_value)); outlet_float(x->x_out_floatcasted, float_casted_value); } static void symtodp_float(t_symtodp *x, t_floatarg f) { x->x_inner_double_value = (double)f; symtodp_bang(x); } static void symtodp_symbol(t_symtodp *x, t_symbol *s) { char *dummy; if((s->s_name[0] == '"') && (s->s_name[1])) { if((s->s_name[1] == '.') || (s->s_name[1] == '+') || (s->s_name[1] == '-') || ((s->s_name[1] >= '0') && (s->s_name[1] <= '9'))) { x->x_inner_double_value = strtod(s->s_name+1, &dummy); symtodp_bang(x); } } else if((s->s_name[0] == '.') || (s->s_name[0] == '+') || (s->s_name[0] == '-') || ((s->s_name[0] >= '0') && (s->s_name[0] <= '9'))) { x->x_inner_double_value = strtod(s->s_name, &dummy); symtodp_bang(x); } } static void symtodp_list(t_symtodp *x, t_symbol *s, int ac, t_atom *av) { if(ac > 0) { x->x_inner_double_value = symtodp_calc_list_sum(ac, av); // post("listtodp double: %.18g", x->x_inner_double_value); symtodp_bang(x); } } static void symtodp_anything(t_symtodp *x, t_symbol *s, int ac, t_atom *av) { char *dummy; if((s->s_name[0] == '"') && (s->s_name[1])) { if((s->s_name[1] == '.') || (s->s_name[1] == '+') || (s->s_name[1] == '-') || ((s->s_name[1] >= '0') && (s->s_name[1] <= '9'))) { x->x_inner_double_value = strtod(s->s_name+1, &dummy); symtodp_bang(x); } } } static void *symtodp_new(void) { t_symtodp *x = (t_symtodp *)pd_new(symtodp_class); x->x_inner_double_value = 0.0; x->x_out_floatcasted = outlet_new(&x->x_obj, &s_float); x->x_out_residual = outlet_new(&x->x_obj, &s_float); return (x); } static void symtodp_free(t_symtodp *x) { } void symtodp_setup(void) { symtodp_class = class_new(gensym("symtodp"), (t_newmethod)symtodp_new, (t_method)symtodp_free, sizeof(t_symtodp), 0, 0); class_addbang(symtodp_class, symtodp_bang); class_addfloat(symtodp_class, symtodp_float); class_addsymbol(symtodp_class, symtodp_symbol); class_addlist(symtodp_class, symtodp_list); class_addanything(symtodp_class, symtodp_anything); } iem_utils-0.0.20240903/iem_dp/src/tabread4_dp.c0000600000000000000000000000501114665566711015542 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread4__ ------------------------------ */ /* based on miller's tabread4 which is part of pd */ static t_class *tabread4_dp_class; typedef struct _tabread4_dp { t_object x_obj; t_symbol *x_arrayname; t_float x_residual; } t_tabread4_dp; static void *tabread4_dp_new(t_symbol *s) { t_tabread4_dp *x = (t_tabread4_dp *)pd_new(tabread4_dp_class); x->x_arrayname = s; floatinlet_new(&x->x_obj, &x->x_residual); outlet_new(&x->x_obj, &s_float); return (x); } static void tabread4_dp_float(t_tabread4_dp *x, t_floatarg f) { t_garray *ga; iemarray_t *vec; int npoints; if(!(ga = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) pd_error(x, "tabread4__: %s: no such array", x->x_arrayname->s_name); iemarray_setfloat(vec, 0, 0.0f); } else if (!iemarray_getarray(ga, &npoints, &vec)) { pd_error(x, "%s: bad template for tabread4__", x->x_arrayname->s_name); iemarray_setfloat(vec, 0, 0.0f); } else { double findex = iem_dp_calc_sum(f, x->x_residual); double frac; int index = findex; int maxindex = npoints - 3; t_sample a, b, c, d, cmb; if(index < 1) index = 1, frac = 0; else if (index > maxindex) index = maxindex, frac = 1; else frac = findex - index; vec += index; a = iemarray_getfloat(vec,-1); b = iemarray_getfloat(vec, 0); c = iemarray_getfloat(vec, 1); d = iemarray_getfloat(vec, 2); cmb = c-b; outlet_float(x->x_obj.ob_outlet, (npoints ? b+frac*(cmb-0.1666667f*(1.-frac)*((d-a-3.0f*cmb)*frac+(d+2.0f*a-3.0f*b))) : 0)); } } static void tabread4_dp_set(t_tabread4_dp *x, t_symbol *s) { x->x_arrayname = s; } static void tabread4_dp_free(t_tabread4_dp *x) { } void tabread4_dp_setup(void) { tabread4_dp_class = class_new(gensym("tabread4__"), (t_newmethod)tabread4_dp_new, (t_method)tabread4_dp_free, sizeof(t_tabread4_dp), 0, A_DEFSYM, 0); class_addcreator((t_newmethod)tabread4_dp_new, gensym("tabread4''"), A_DEFSYM, 0); class_addfloat(tabread4_dp_class, (t_method)tabread4_dp_float); class_addmethod(tabread4_dp_class, (t_method)tabread4_dp_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem_dp/src/tabread4~~.c0000600000000000000000000000711514665566711015462 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread4~~ ------------------------------ */ /* based on miller's tabread4~ which is part of pd */ static t_class *tabread4_tilde_tilde_class; typedef struct _tabread4_tilde_tilde { t_object x_obj; int x_npoints; iemarray_t *x_vec; t_symbol *x_arrayname; t_float x_f; } t_tabread4_tilde_tilde; static void *tabread4_tilde_tilde_new(t_symbol *s) { t_tabread4_tilde_tilde *x = (t_tabread4_tilde_tilde *)pd_new(tabread4_tilde_tilde_class); x->x_arrayname = s; x->x_vec = 0; x->x_npoints=0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return (x); } static t_int *tabread4_tilde_tilde_perform(t_int *w) { t_tabread4_tilde_tilde *x = (t_tabread4_tilde_tilde *)(w[1]); t_sample *in0 = (t_sample *)(w[2]); t_sample *in1 = (t_sample *)(w[3]); t_sample *out = (t_sample *)(w[4]); int n = (int)(w[5]); int maxindex; iemarray_t *buf = x->x_vec, *wp; int i; maxindex = x->x_npoints - 3; if (!buf){ while (n--) *out++ = 0; return (w+6); } // post("xxx"); for (i = 0; i < n; i++) { t_sample in0_s=*in0++; t_sample in1_s=*in1++; double findex = iem_dp_calc_sum(in0_s, in1_s); long int index = findex; double frac; t_sample a, b, c, d, cminusb; if (index < 1) index = 1, frac = 0; else if (index > maxindex) index = maxindex, frac = 1; else frac = findex - index; // post("%f + %f = %f", in0_s, in1_s, findex); // post("%f - %f = %d", findex, frac, index); wp = buf + index; a = iemarray_getfloat(wp,-1); b = iemarray_getfloat(wp, 0); c = iemarray_getfloat(wp, 1); d = iemarray_getfloat(wp, 2); cminusb = c-b; *out++ = b + frac * (cminusb - 0.1666667f * (1.-frac) * ((d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b))); } return (w+6); } static void tabread4_tilde_tilde_set(t_tabread4_tilde_tilde *x, t_symbol *s) { t_garray *a; x->x_arrayname = s; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*s->s_name) pd_error(x, "tabread4~~: %s: no such array", x->x_arrayname->s_name); iemarray_setfloat(x->x_vec, 0, 0.0f); } else if (!iemarray_getarray(a, &x->x_npoints, &x->x_vec)) { pd_error(x, "%s: bad template for tabread4~~", x->x_arrayname->s_name); iemarray_setfloat(x->x_vec, 0, 0.0f); } else garray_usedindsp(a); } static void tabread4_tilde_tilde_dsp(t_tabread4_tilde_tilde *x, t_signal **sp) { tabread4_tilde_tilde_set(x, x->x_arrayname); dsp_add(tabread4_tilde_tilde_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } static void tabread4_tilde_tilde_free(t_tabread4_tilde_tilde *x) { } void tabread4_tilde_tilde_setup(void) { tabread4_tilde_tilde_class = class_new(gensym("tabread4~~"), (t_newmethod)tabread4_tilde_tilde_new, (t_method)tabread4_tilde_tilde_free, sizeof(t_tabread4_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tabread4_tilde_tilde_class, t_tabread4_tilde_tilde, x_f); class_addmethod(tabread4_tilde_tilde_class, (t_method)tabread4_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tabread4_tilde_tilde_class, (t_method)tabread4_tilde_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem_dp/src/tabread_dp.c0000600000000000000000000000407514665566711015467 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread__ ------------------------------ */ /* based on miller's tabread which is part of pd */ static t_class *tabread_dp_class; typedef struct _tabread_dp { t_object x_obj; t_symbol *x_arrayname; t_float x_residual; } t_tabread_dp; static void *tabread_dp_new(t_symbol *s) { t_tabread_dp *x = (t_tabread_dp *)pd_new(tabread_dp_class); x->x_arrayname = s; floatinlet_new(&x->x_obj, &x->x_residual); outlet_new(&x->x_obj, &s_float); return (x); } static void tabread_dp_float(t_tabread_dp *x, t_floatarg f) { t_garray *a; iemarray_t *vec; int npoints; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*x->x_arrayname->s_name) pd_error(x, "tabread__: %s: no such array", x->x_arrayname->s_name); vec = 0; } else if (!iemarray_getarray(a, &npoints, &vec)) { pd_error(x, "%s: bad template for tabread__", x->x_arrayname->s_name); vec = 0; } else { double findex = iem_dp_calc_sum(f, x->x_residual); int n = findex; if(n < 0) n = 0; else if(n >= npoints) n = npoints - 1; outlet_float(x->x_obj.ob_outlet, (npoints ? iemarray_getfloat(vec, n) : 0)); } } static void tabread_dp_set(t_tabread_dp *x, t_symbol *s) { x->x_arrayname = s; } static void tabread_dp_free(t_tabread_dp *x) { } void tabread_dp_setup(void) { tabread_dp_class = class_new(gensym("tabread__"), (t_newmethod)tabread_dp_new, (t_method)tabread_dp_free, sizeof(t_tabread_dp), 0, A_DEFSYM, 0); class_addcreator((t_newmethod)tabread_dp_new, gensym("tabread''"), A_DEFSYM, 0); class_addfloat(tabread_dp_class, (t_method)tabread_dp_float); class_addmethod(tabread_dp_class, (t_method)tabread_dp_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem_dp/src/tabread~~.c0000600000000000000000000000626114665566711015377 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabread~~ ------------------------------ */ /* based on miller's tabread~ which is part of pd */ /******************** tabread~ ***********************/ static t_class *tabread_tilde_tilde_class; typedef struct _tabread_tilde_tilde { t_object x_obj; int x_npoints; iemarray_t *x_vec; t_symbol *x_arrayname; t_float x_f; } t_tabread_tilde_tilde; static void *tabread_tilde_tilde_new(t_symbol *s) { t_tabread_tilde_tilde *x = (t_tabread_tilde_tilde *)pd_new(tabread_tilde_tilde_class); x->x_arrayname = s; x->x_npoints=0; x->x_vec = 0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, gensym("signal")); x->x_f = 0; return (x); } static t_int *tabread_tilde_tilde_perform(t_int *w) { t_tabread_tilde_tilde *x = (t_tabread_tilde_tilde *)(w[1]); t_sample *in0 = (t_sample *)(w[2]); t_sample *in1 = (t_sample *)(w[3]); t_sample *out = (t_sample *)(w[4]); int n = (int)(w[5]); int maxindexminusone; iemarray_t *buf = x->x_vec; int i; maxindexminusone = x->x_npoints - 1; if(!buf) { while(n--) *out++ = 0; return(w+6); } for (i = 0; i < n; i++) { t_sample in0_s=*in0++; t_sample in1_s=*in1++; double findex = iem_dp_calc_sum(in0_s, in1_s); int index = (int)findex; if (index < 0) index = 0; else if (index > maxindexminusone) index = maxindexminusone; *out++ = iemarray_getfloat(buf, index); } return (w+6); } void tabread_tilde_tilde_set(t_tabread_tilde_tilde *x, t_symbol *s) { t_garray *a; x->x_arrayname = s; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*s->s_name) pd_error(x, "tabread~: %s: no such array", x->x_arrayname->s_name); x->x_vec = 0; } else if (!iemarray_getarray(a, &x->x_npoints, &x->x_vec)) { pd_error(x, "%s: bad template for tabread~", x->x_arrayname->s_name); x->x_vec = 0; } else garray_usedindsp(a); } static void tabread_tilde_tilde_dsp(t_tabread_tilde_tilde *x, t_signal **sp) { tabread_tilde_tilde_set(x, x->x_arrayname); dsp_add(tabread_tilde_tilde_perform, 5, x, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } static void tabread_tilde_tilde_free(t_tabread_tilde_tilde *x) { } void tabread_tilde_tilde_setup(void) { tabread_tilde_tilde_class = class_new(gensym("tabread~~"), (t_newmethod)tabread_tilde_tilde_new, (t_method)tabread_tilde_tilde_free, sizeof(t_tabread_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tabread_tilde_tilde_class, t_tabread_tilde_tilde, x_f); class_addmethod(tabread_tilde_tilde_class, (t_method)tabread_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tabread_tilde_tilde_class, (t_method)tabread_tilde_tilde_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem_dp/src/tabwrite_dp.c0000600000000000000000000000430214665566711015677 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabwrite__ ------------------------------ */ /* based on miller's tabwrite which is part of pd */ static t_class *tabwrite_dp_class; typedef struct _tabwrite_dp { t_object x_obj; t_symbol *x_arrayname; t_float x_float_casted_index; t_float x_residual_index; } t_tabwrite_dp; static void *tabwrite_dp_new(t_symbol *s) { t_tabwrite_dp *x = (t_tabwrite_dp *)pd_new(tabwrite_dp_class); x->x_arrayname = s; x->x_float_casted_index = 0.0f; x->x_residual_index = 0.0f; floatinlet_new(&x->x_obj, &x->x_float_casted_index); floatinlet_new(&x->x_obj, &x->x_residual_index); return (x); } static void tabwrite_dp_float(t_tabwrite_dp *x, t_floatarg fvalue) { t_garray *a; iemarray_t *vec; int npoints; if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if (*x->x_arrayname->s_name) pd_error(x, "tabwrite__: %s: no such array", x->x_arrayname->s_name); vec = 0; } else if (!iemarray_getarray(a, &npoints, &vec)) { pd_error(x, "%s: bad template for tabwrite__", x->x_arrayname->s_name); vec = 0; } else { double findex = iem_dp_calc_sum(x->x_float_casted_index, x->x_residual_index); int n = findex; if(n < 0) n = 0; else if(n >= npoints) n = npoints - 1; if(npoints) { iemarray_setfloat(vec, n, fvalue); garray_redraw(a); } } } static void tabwrite_dp_set(t_tabwrite_dp *x, t_symbol *s) { x->x_arrayname = s; } void tabwrite_dp_setup(void) { tabwrite_dp_class = class_new(gensym("tabwrite__"), (t_newmethod)tabwrite_dp_new, 0, sizeof(t_tabwrite_dp), 0, A_DEFSYM, 0); class_addcreator((t_newmethod)tabwrite_dp_new, gensym("tabwrite''"), A_DEFSYM, 0); class_addfloat(tabwrite_dp_class, (t_method)tabwrite_dp_float); class_addmethod(tabwrite_dp_class, (t_method)tabwrite_dp_set, gensym("set"), A_SYMBOL, 0); } iem_utils-0.0.20240903/iem_dp/src/tabwrite~~.c0000600000000000000000000001004314665566711015607 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- tabwrite~~ ------------------------------ */ /* based on miller's tabwrite~ which is part of pd */ static t_class *tabwrite_tilde_tilde_class; typedef struct _tabwrite_tilde_tilde { t_object x_obj; int x_phase; int x_nsampsintab; iemarray_t *x_vec; t_symbol *x_arrayname; t_float x_f; } t_tabwrite_tilde_tilde; static void *tabwrite_tilde_tilde_new(t_symbol *s) { t_tabwrite_tilde_tilde *x = (t_tabwrite_tilde_tilde *)pd_new(tabwrite_tilde_tilde_class); x->x_phase = 0x7fffffff; x->x_arrayname = s; x->x_vec = 0; x->x_nsampsintab=0; x->x_f = 0; return (x); } static void tabwrite_tilde_tilde_redraw(t_tabwrite_tilde_tilde *x) { t_garray *a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class); if(!a) bug("tabwrite~~_redraw"); else garray_redraw(a); } static t_int *tabwrite_tilde_tilde_perform(t_int *w) { t_tabwrite_tilde_tilde *x = (t_tabwrite_tilde_tilde *)(w[1]); t_sample *in = (t_sample *)(w[2]); int n = (int)(w[3]); int phase = x->x_phase, endphase = x->x_nsampsintab; iemarray_t *vec = x->x_vec; if(!x->x_vec) return(w+4); if(endphase > phase) { int nxfer = endphase - phase; int i; vec += phase; if(nxfer > n) nxfer = n; phase += nxfer; for(i=0; i= endphase) { tabwrite_tilde_tilde_redraw(x); phase = 0x7fffffff; } x->x_phase = phase; } else x->x_phase = 0x7fffffff; return (w+4); } static void tabwrite_tilde_tilde_set(t_tabwrite_tilde_tilde *x, t_symbol *s) { t_garray *a; x->x_arrayname = s; if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*s->s_name) pd_error(x, "tabwrite~~: %s: no such array", x->x_arrayname->s_name); x->x_vec = 0; } else if(!iemarray_getarray(a, &x->x_nsampsintab, &x->x_vec)) { pd_error(x, "%s: bad template for tabwrite~~", x->x_arrayname->s_name); x->x_vec = 0; } else garray_usedindsp(a); } static void tabwrite_tilde_tilde_dsp(t_tabwrite_tilde_tilde *x, t_signal **sp) { tabwrite_tilde_tilde_set(x, x->x_arrayname); dsp_add(tabwrite_tilde_tilde_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } static void tabwrite_tilde_tilde_bang(t_tabwrite_tilde_tilde *x) { x->x_phase = 0; } static void tabwrite_tilde_tilde_start(t_tabwrite_tilde_tilde *x, t_symbol *s, int ac, t_atom *av) { double fi=0; int ii=0; t_float f=0, c=0; if((ac > 0)&&((av+0)->a_type == A_FLOAT)) c = atom_getfloatarg(0, ac, av); if((ac > 1)&&((av+1)->a_type == A_FLOAT)) f = atom_getfloatarg(1, ac, av); fi = iem_dp_calc_sum(c, f); ii = (int)fi; x->x_phase = (ii > 0 ? ii : 0); } static void tabwrite_tilde_tilde_stop(t_tabwrite_tilde_tilde *x) { if(x->x_phase != 0x7fffffff) { tabwrite_tilde_tilde_redraw(x); x->x_phase = 0x7fffffff; } } void tabwrite_tilde_tilde_setup(void) { tabwrite_tilde_tilde_class = class_new(gensym("tabwrite~~"), (t_newmethod)tabwrite_tilde_tilde_new, 0, sizeof(t_tabwrite_tilde_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(tabwrite_tilde_tilde_class, t_tabwrite_tilde_tilde, x_f); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_set, gensym("set"), A_SYMBOL, 0); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_start, gensym("start"), A_GIMME, 0); class_addmethod(tabwrite_tilde_tilde_class, (t_method)tabwrite_tilde_tilde_stop, gensym("stop"), 0); class_addbang(tabwrite_tilde_tilde_class, tabwrite_tilde_tilde_bang); } iem_utils-0.0.20240903/iem_dp/src/vline~~.c0000600000000000000000000001610614665566711015111 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- vline~~ ------------------------------ */ /* based on miller's vline~ which is part of pd */ static t_class *vline_tilde_tilde_class; typedef struct _vseg_tt { double s_targettime; double s_starttime; double s_target; struct _vseg_tt *s_next; } t_vseg_tt; typedef struct _vline_tilde_tilde { t_object x_obj; double x_value; double x_inc; double x_referencetime; double x_samppermsec; double x_msecpersamp; double x_targettime; double x_target; t_float x_inlet2_fine_target; t_float x_inlet3_coarse_ramp_duration; t_float x_inlet4_fine_ramp_duration; t_float x_inlet5_coarse_delay; t_float x_inlet6_fine_delay; t_vseg_tt *x_list; } t_vline_tilde_tilde; static t_int *vline_tilde_tilde_perform(t_int *w) { t_vline_tilde_tilde *x = (t_vline_tilde_tilde *)(w[1]); t_float *out_float_cast = (t_float *)(w[2]); t_float *out_residual = (t_float *)(w[3]); t_float f_val; int n = (int)(w[4]), i; double d_val = x->x_value; double inc = x->x_inc; double msecpersamp = x->x_msecpersamp; double samppermsec = x->x_samppermsec; double timenow = clock_gettimesince(x->x_referencetime) - (double)n * msecpersamp; t_vseg_tt *seg_list = x->x_list; for(i = 0; i < n; i++) { double timenext = timenow + msecpersamp; checknext_tt: if(seg_list) { /* has starttime elapsed? If so update value and increment */ if(seg_list->s_starttime < timenext) { if(x->x_targettime <= timenext) d_val = x->x_target, inc = 0; /* if zero-length segment bash output value */ if(seg_list->s_targettime <= seg_list->s_starttime) { d_val = seg_list->s_target; inc = 0; } else { double incpermsec = (seg_list->s_target - d_val)/(seg_list->s_targettime - seg_list->s_starttime); d_val += incpermsec * (timenext - seg_list->s_starttime); inc = incpermsec * msecpersamp; } x->x_inc = inc; x->x_target = seg_list->s_target; x->x_targettime = seg_list->s_targettime; x->x_list = seg_list->s_next; t_freebytes(seg_list, sizeof(*seg_list)); seg_list = x->x_list; goto checknext_tt; } } if(x->x_targettime <= timenext) { d_val = x->x_target; inc = x->x_inc = 0; x->x_targettime = 1e20; } f_val = iem_dp_cast_to_float(d_val); *out_residual++ = iem_dp_calc_residual(d_val, f_val); *out_float_cast++ = f_val; d_val += inc; timenow = timenext; } x->x_value = d_val; return (w+5); } static void vline_tilde_tilde_stop(t_vline_tilde_tilde *x) { t_vseg_tt *s1, *s2; for (s1 = x->x_list; s1; s1 = s2) s2 = s1->s_next, t_freebytes(s1, sizeof(*s1)); x->x_list = 0; x->x_inc = 0; x->x_inlet2_fine_target = x->x_inlet3_coarse_ramp_duration = 0; x->x_inlet4_fine_ramp_duration = x->x_inlet5_coarse_delay = x->x_inlet6_fine_delay = 0; x->x_target = x->x_value; x->x_targettime = 1e20; } static void vline_tilde_tilde_float(t_vline_tilde_tilde *x, t_float inlet1_coarse_target) /* coarse target value */ { double timenow = clock_gettimesince(x->x_referencetime); double inlet12_target = iem_dp_calc_sum(inlet1_coarse_target, x->x_inlet2_fine_target); double inlet34_ramp_duration = iem_dp_calc_sum(x->x_inlet3_coarse_ramp_duration, x->x_inlet4_fine_ramp_duration); double inlet56_delay = iem_dp_calc_sum(x->x_inlet5_coarse_delay, x->x_inlet6_fine_delay); double starttime = timenow + inlet56_delay; t_vseg_tt *s1, *s2, *deletefrom = 0, *snew; if(inlet34_ramp_duration < 0) inlet34_ramp_duration = 0; /* if (PD_BIGORSMALL(inlet12_target)) inlet12_target = 0; */ /* negative delay input means stop and jump immediately to new value */ if (inlet56_delay < 0) { x->x_value = inlet12_target; vline_tilde_tilde_stop(x); return; } snew = (t_vseg_tt *)t_getbytes(sizeof(*snew)); /* check if we supplant the first item in the list. We supplant an item by having an earlier starttime, or an equal starttime unless the equal one was instantaneous and the new one isn't (in which case we'll do a jump-and-slide starting at that time.) */ if (!x->x_list || x->x_list->s_starttime > starttime || (x->x_list->s_starttime == starttime && (x->x_list->s_targettime > x->x_list->s_starttime || inlet34_ramp_duration <= 0))) { deletefrom = x->x_list; x->x_list = snew; } else { for (s1 = x->x_list; (s2 = s1->s_next); s1 = s2) { if (s2->s_starttime > starttime || (s2->s_starttime == starttime && (s2->s_targettime > s2->s_starttime || inlet34_ramp_duration <= 0))) { deletefrom = s2; s1->s_next = snew; goto vl_didit_tt; } } s1->s_next = snew; deletefrom = 0; vl_didit_tt: ; } while (deletefrom) { s1 = deletefrom->s_next; t_freebytes(deletefrom, sizeof(*deletefrom)); deletefrom = s1; } snew->s_next = 0; snew->s_target = inlet12_target; snew->s_starttime = starttime; snew->s_targettime = starttime + inlet34_ramp_duration; x->x_inlet3_coarse_ramp_duration = x->x_inlet4_fine_ramp_duration = 0; x->x_inlet5_coarse_delay = x->x_inlet6_fine_delay = 0; } static void vline_tilde_tilde_dsp(t_vline_tilde_tilde *x, t_signal **sp) { dsp_add(vline_tilde_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); x->x_samppermsec = ((double)(sp[0]->s_sr)) / 1000.0; x->x_msecpersamp = ((double)1000.0) / sp[0]->s_sr; } static void *vline_tilde_tilde_new(t_floatarg init_val) { t_vline_tilde_tilde *x = (t_vline_tilde_tilde *)pd_new(vline_tilde_tilde_class); outlet_new(&x->x_obj, gensym("signal")); outlet_new(&x->x_obj, gensym("signal")); floatinlet_new(&x->x_obj, &x->x_inlet2_fine_target); floatinlet_new(&x->x_obj, &x->x_inlet3_coarse_ramp_duration); floatinlet_new(&x->x_obj, &x->x_inlet4_fine_ramp_duration); floatinlet_new(&x->x_obj, &x->x_inlet5_coarse_delay); floatinlet_new(&x->x_obj, &x->x_inlet6_fine_delay); x->x_inlet2_fine_target = x->x_inlet3_coarse_ramp_duration = 0; x->x_inlet4_fine_ramp_duration = x->x_inlet5_coarse_delay = x->x_inlet6_fine_delay = 0; x->x_value = x->x_inc = 0; x->x_referencetime = clock_getlogicaltime(); x->x_list = 0; x->x_samppermsec = 0; x->x_targettime = 1e20; return (x); } void vline_tilde_tilde_setup(void) { vline_tilde_tilde_class = class_new(gensym("vline~~"), (t_newmethod)vline_tilde_tilde_new, (t_method)vline_tilde_tilde_stop, sizeof(t_vline_tilde_tilde), 0, 0); class_addfloat(vline_tilde_tilde_class, (t_method)vline_tilde_tilde_float); class_addmethod(vline_tilde_tilde_class, (t_method)vline_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(vline_tilde_tilde_class, (t_method)vline_tilde_tilde_stop, gensym("stop"), 0); } iem_utils-0.0.20240903/iem_dp/src/wrap~~.c0000600000000000000000000000367214665566711014751 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_dp written by IOhannes m zmoelnig, Thomas Musil, Copyright (c) IEM KUG Graz Austria 1999 - 2007 */ /* double precision library */ #include "m_pd.h" #include "iemlib.h" #include "iem_dp.h" /* -------------------------- wrap~~ ------------------------------ */ /* based on miller's wrap~ which is part of pd */ static t_class *wrap_tilde_tilde_class; typedef struct _wrap_tilde_tilde { t_object x_obj; t_float x_f; } t_wrap_tilde_tilde; static void *wrap_tilde_tilde_new(void) { t_wrap_tilde_tilde *x = (t_wrap_tilde_tilde *)pd_new(wrap_tilde_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_f = 0; return(x); } static t_int *wrap_tilde_tilde_perform(t_int *w) { t_sample *inc = (t_sample *)(w[1]); t_sample *inf = (t_sample *)(w[2]); t_sample *outc = (t_sample *)(w[3]); t_sample *outf = (t_sample *)(w[4]); int n = (int)(w[5]); while(n--) { double coarse = *inc++; double fine = *inf++; double d=iem_dp_calc_sum(coarse, fine); int k=(int)d; t_float f; if(d > 0) d -= (double)k; else d -= (double)(k-1); f = iem_dp_cast_to_float(d); *outf++ = iem_dp_calc_residual(d, f); *outc++ = f; } return(w+6); } static void wrap_tilde_tilde_dsp(t_wrap_tilde_tilde *x, t_signal **sp) { dsp_add(wrap_tilde_tilde_perform, 5, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, sp[0]->s_n); } void wrap_tilde_tilde_setup(void) { wrap_tilde_tilde_class = class_new(gensym("wrap~~"), (t_newmethod)wrap_tilde_tilde_new, 0, sizeof(t_wrap_tilde_tilde), 0, 0); CLASS_MAINSIGNALIN(wrap_tilde_tilde_class, t_wrap_tilde_tilde, x_f); class_addmethod(wrap_tilde_tilde_class, (t_method)wrap_tilde_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_dp/sub__-help0000600000000000000000000000260714665566711014406 0ustar00#N canvas 224 167 932 536 10; #X symbolatom 167 326 25 0 0 0 - - -; #X text 104 453 IEM KUG; #X text 88 441 musil; #X text 125 441 @; #X text 134 441 iem.at; #X text 87 463 Graz \, Austria; #X text 147 415 @; #X text 156 415 iem.at; #X text 88 415 zmoelnig; #X floatatom 251 245 11 0 0 0 - - -; #X floatatom 227 273 11 0 0 0 - - -; #X text 337 244 difference; #X text 311 272 float casted; #X text 14 12 -__; #X text 70 13 double precision subtraction; #X obj 165 209 -__ 0 0; #X text 359 326 difference displayed via a symbol; #X text 203 83 = symbol selector of an anything; #X msg 70 71 "9.9999999999999; #X msg 292 108 "8.7654321234567; #X text 90 341 should be "1.2345678765432; #X text 193 72 double precision number beginning with a "double quote" =; #X text 422 119 = symbol selector of an anything; #X text 412 108 double precision number beginning with a "double quote" =; #X obj 166 303 dptosym; #X text 14 32 sub__; #X text 14 57 -''; #X obj 239 209 sub__ 0 0; #X obj 316 209 -'' 0 0; #X text 294 13 15 digits accurate; #X text 39 402 (c) IOhannes m zmoelnig 1999 - 2013; #X text 39 430 (c) Thomas Musil 2000 - 2013; #X obj 71 97 symtodp; #X obj 292 130 symtodp; #X connect 15 0 10 0; #X connect 15 0 24 0; #X connect 15 1 9 0; #X connect 15 1 24 1; #X connect 18 0 32 0; #X connect 19 0 33 0; #X connect 24 0 0 0; #X connect 32 0 15 0; #X connect 32 1 15 1; #X connect 33 0 15 2; #X connect 33 1 15 3; iem_utils-0.0.20240903/iem_dp/sub~~-help.pd0000600000000000000000000000511614665566711015104 0ustar00#N canvas 291 113 856 539 10; #X symbolatom 196 376 25 0 0 0 - - -; #X text 133 473 IEM KUG; #X text 117 461 musil; #X text 154 461 @; #X text 163 461 iem.at; #X text 116 483 Graz \, Austria; #X text 176 435 @; #X text 185 435 iem.at; #X text 117 435 zmoelnig; #X obj 139 97 sig~; #X obj 99 97 sig~; #X obj 360 144 sig~; #X obj 320 144 sig~; #X msg 11 91 \; pd dsp \$1; #X obj 11 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 195 260 pd sunsig~~; #X text 14 12 -~~; #X text 70 13 double precision signal subtraction; #X obj 194 202 -~~ #######; #X text 383 376 difference displayed via a symbol; #X text 119 391 should be "1.2345678765432; #X msg 99 48 "9.9999999999999; #X msg 320 94 "8.7654321234567; #X text 452 105 = symbol selector of an anything; #X text 442 94 double precision number beginning with a "double quote" =; #X text 231 60 = symbol selector of an anything; #X text 221 49 double precision number beginning with a "double quote" =; #X text 14 34 sub~~; #X obj 282 202 sub~~; #X text 355 12 15 digits accurate; #X text 68 422 (c) IOhannes m zmoelnig 1999 - 2013; #X text 68 450 (c) Thomas Musil 2000 - 2013; #X obj 99 72 symtodp; #X obj 319 115 symtodp; #X symbolatom 439 307 25 0 0 0 - - -; #N canvas 0 22 330 356 sunsig~~ 0; #X obj 22 195 snapshot~; #X obj 47 103 metro 300; #X obj 46 81 loadbang; #X obj 22 18 inlet~; #X obj 122 18 inlet~; #X obj 122 195 snapshot~; #X obj 47 136 t b b; #X obj 36 277 outlet; #X obj 35 248 dptosym; #X connect 0 0 8 0; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 5 0; #X connect 5 0 8 1; #X connect 6 0 0 0; #X connect 6 1 5 0; #X connect 8 0 7 0; #X restore 439 281 pd sunsig~~; #X obj 440 226 sig~; #X floatatom 439 206 5 0 0 0 - - -; #X obj 440 256 -~~ 100 0; #X obj 517 255 sub~~ 100 0; #X connect 9 0 18 1; #X connect 10 0 18 0; #X connect 11 0 18 3; #X connect 12 0 18 2; #X connect 14 0 13 0; #X connect 15 0 0 0; #X connect 18 0 15 0; #X connect 18 1 15 1; #X connect 21 0 32 0; #X connect 22 0 33 0; #X connect 32 0 10 0; #X connect 32 1 9 0; #X connect 33 0 12 0; #X connect 33 1 11 0; #X connect 35 0 34 0; #X connect 36 0 38 0; #X connect 37 0 36 0; #X connect 38 0 35 0; #X connect 38 1 35 1; iem_utils-0.0.20240903/iem_dp/symtodp-help.pd0000600000000000000000000000410214665566711015410 0ustar00#N canvas 175 36 767 494 10; #X text 169 289 output is a symbol of sum of both double casted inputs ; #X text 294 13 (only for help and debugging purpose); #X symbolatom 110 346 25 0 0 0 - - -; #X text 147 461 IEM KUG; #X text 131 449 musil; #X text 168 449 @; #X text 177 449 iem.at; #X text 130 471 Graz \, Austria; #X text 191 388 @; #X text 200 388 iem.at; #X text 131 423 zmoelnig; #X text 33 365 should be "1.2345678765432; #X floatatom 166 184 11 0 0 0 - - -; #X floatatom 143 211 11 0 0 0 - - -; #X text 168 235 the inputs are two floats \, left one is the float-casted value of a double value \, the right one is the float difference between double value and the float-casted.; #X text 227 210 float-casted; #X text 252 183 difference to double; #X obj 110 288 dptosym; #X text 81 13 symbol to double converter; #X text 14 12 symtodp; #X obj 61 157 symtodp; #X obj 61 86 makefilename %g67890; #X text 82 410 (c) IOhannes m zmoelnig 1999 - 2013; #X text 82 438 (c) Thomas Musil 2000 - 2013; #X text 59 47 symbol; #X msg 168 58 "1.234567890123456; #X msg 61 64 123.45; #X obj 61 109 makefilename %s123456; #X text 165 40 double quotes number selector; #X msg 620 78 1e+11; #X msg 619 102 1e+12; #X msg 378 103 1 0 0 0 0 0 0 0 0 0 0 0; #X msg 381 131 1 0 0 0 0 0 0 0 0 0 0 0 0; #X msg 379 77 3.14 15 926 535 89 79; #X obj 345 70 t l; #X text 378 44 space separated number list; #X text 619 51 float; #X obj 573 74 t f; #X text 403 57 (list of floats); #X text 386 152 the input needs a list of floats and integers \, which present a human readable double precision float; #X text 385 189 the outputs are two floats \, left one is the float-truncated value of internal double value \, the right one is the difference between internal value and left output.; #X connect 17 0 2 0; #X connect 20 0 13 0; #X connect 20 0 17 0; #X connect 20 1 12 0; #X connect 20 1 17 1; #X connect 21 0 27 0; #X connect 25 0 20 0; #X connect 26 0 21 0; #X connect 27 0 20 0; #X connect 29 0 37 0; #X connect 30 0 37 0; #X connect 31 0 34 0; #X connect 32 0 34 0; #X connect 33 0 34 0; #X connect 34 0 20 0; #X connect 37 0 20 0; iem_utils-0.0.20240903/iem_dp/tabread4__-help.pd0000600000000000000000000000523714665566711015707 0ustar00#N canvas 95 60 892 632 10; #X obj 406 74 loadbang; #X text 425 271 see also:; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 64 graph; #X floatatom 41 537 0 0 0 0 - - -; #X obj 497 55 table array98 1.7e+07; #X floatatom 293 537 0 0 0 0 - - -; #X floatatom 155 376 0 0 0 0 - - -; #X obj 293 452 + 0; #X obj 158 357 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 3500 1; #X obj 306 432 r \$0_offset; #X obj 145 428 r \$0_offset; #X obj 312 485 r \$0_which_table; #X obj 40 467 r \$0_which_table; #N canvas 0 22 470 320 select_table 0; #X obj 55 24 inlet; #X msg 55 112 0; #X msg 109 180 1.698e+07; #X obj 55 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 109 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 133 s \$0_offset; #X obj 109 201 s \$0_offset; #X obj 186 200 s \$0_which_table; #X msg 186 178 set array98; #X obj 127 133 s \$0_which_table; #X msg 127 111 set array99; #X obj 55 47 sel 0 1; #X connect 0 0 11 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 10 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 4 0 8 0; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 11 1 4 0; #X restore 275 390 pd select_table; #X obj 275 356 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1 1; #X text 294 354 array99 offset=0; #X text 293 369 array98 offset=1.698e+07; #X text 604 566 IEM KUG; #X text 588 554 musil; #X text 625 554 @; #X text 634 554 iem.at; #X text 587 576 Graz \, Austria; #X text 647 528 @; #X text 656 528 iem.at; #X text 588 528 zmoelnig; #X text 13 11 tabread4__; #X obj 493 271 tabread4; #X msg 406 95 \; array98 const 0 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5 \; array98 1.698e+07 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5; #X obj 293 511 tabread4 array99; #X obj 41 508 tabread4__ array99; #X obj 77 533 tabread4'' array99; #X text 14 26 tabread4''; #X text 41 292 tabread4 is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial.; #X text 539 515 (c) IOhannes m zmoelnig 1999 - 2013; #X text 539 543 (c) Thomas Musil 2000 - 2013; #X text 116 10 4-point-interpolating table lookup with double precision index (15 digits accurate); #X connect 0 0 27 0; #X connect 6 0 7 0; #X connect 6 0 29 0; #X connect 7 0 28 0; #X connect 8 0 6 0; #X connect 9 0 7 1; #X connect 10 0 29 1; #X connect 11 0 28 0; #X connect 12 0 29 0; #X connect 14 0 13 0; #X connect 28 0 5 0; #X connect 29 0 3 0; iem_utils-0.0.20240903/iem_dp/tabread4~~-help.pd0000600000000000000000000000751114665566711016002 0ustar00#N canvas 78 22 892 632 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X obj 468 27 loadbang; #X text 425 251 see also:; #X obj 493 251 tabread4~; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 44 graph; #X text 116 -15 4-point-interpolating table lookup; #X obj 41 523 snapshot~; #X obj 194 489 metro 200; #X obj 40 426 sig~; #X floatatom 41 549 0 0 0 0 - - -; #X text 42 272 Tabread4~ is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial. ; #X text 13 -15 tabread4~~; #X obj 41 488 tabread4~~ array99; #X obj 194 444 loadbang; #X obj 194 468 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 158 10 table array98 1.7e+07; #X obj 294 530 snapshot~; #X obj 293 454 sig~; #X floatatom 294 556 0 0 0 0 - - -; #X obj 293 491 tabread4~ array99; #X floatatom 155 356 0 0 0 0 - - -; #X obj 145 430 sig~; #N canvas 0 22 470 320 copy_99_into_98 0; #X obj 55 199 tabwrite~ array98; #X msg 80 105 start 1.698e+07; #X obj 55 128 tabplay~ array99; #X obj 55 62 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 146 150 stop; #X obj 55 83 t b b; #X obj 55 24 inlet; #X connect 1 0 0 0; #X connect 2 0 0 0; #X connect 2 1 4 0; #X connect 3 0 5 0; #X connect 4 0 0 0; #X connect 5 0 2 0; #X connect 5 1 1 0; #X connect 6 0 3 0; #X restore 408 222 pd copy_99_into_98; #X obj 408 50 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 293 432 + 0; #X obj 408 69 t b b; #X obj 158 337 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 6000 1; #X obj 306 412 r \$0_offset; #X obj 145 408 r \$0_offset; #X obj 334 467 r \$0_which_table; #X obj 47 461 r \$0_which_table; #X msg 433 92 \; array98 const 0 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5; #N canvas 0 22 470 320 select_table 0; #X obj 55 24 inlet; #X msg 55 112 0; #X msg 109 180 1.698e+07; #X obj 55 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 109 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 133 s \$0_offset; #X obj 109 201 s \$0_offset; #X obj 186 200 s \$0_which_table; #X msg 186 178 set array98; #X obj 127 133 s \$0_which_table; #X msg 127 111 set array99; #X obj 55 47 sel 0 1; #X connect 0 0 11 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 10 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 4 0 8 0; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 11 1 4 0; #X restore 275 370 pd select_table; #X obj 275 336 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1 1; #X text 294 334 array99 offset=0; #X text 293 349 array98 offset=1.698e+07; #X text 604 546 IEM KUG; #X text 588 534 musil; #X text 625 534 @; #X text 634 534 iem.at; #X text 587 556 Graz \, Austria; #X text 647 508 @; #X text 656 508 iem.at; #X text 588 508 zmoelnig; #X obj 408 29 sel 1; #X text 539 495 (c) IOhannes m zmoelnig 1999 - 2013; #X text 539 523 (c) Thomas Musil 2000 - 2013; #X connect 0 0 3 0; #X connect 0 0 47 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 4 0 26 0; #X connect 9 0 12 0; #X connect 10 0 9 0; #X connect 10 0 19 0; #X connect 11 0 15 0; #X connect 15 0 9 0; #X connect 16 0 17 0; #X connect 17 0 10 0; #X connect 19 0 21 0; #X connect 20 0 22 0; #X connect 22 0 19 0; #X connect 23 0 11 0; #X connect 23 0 27 0; #X connect 24 0 15 1; #X connect 26 0 28 0; #X connect 27 0 20 0; #X connect 28 0 25 0; #X connect 28 1 34 0; #X connect 29 0 23 0; #X connect 30 0 27 1; #X connect 31 0 24 0; #X connect 32 0 22 0; #X connect 33 0 15 0; #X connect 36 0 35 0; #X connect 47 0 26 0; iem_utils-0.0.20240903/iem_dp/tabread__-help.pd0000600000000000000000000000522614665566711015621 0ustar00#N canvas 460 141 892 632 10; #X obj 406 74 loadbang; #X text 425 271 see also:; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 64 graph; #X floatatom 41 537 0 0 0 0 - - -; #X obj 497 55 table array98 1.7e+07; #X floatatom 293 537 0 0 0 0 - - -; #X floatatom 155 376 0 0 0 0 - - -; #X obj 293 452 + 0; #X obj 158 357 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 306 432 r \$0_offset; #X obj 145 428 r \$0_offset; #X obj 312 485 r \$0_which_table; #X obj 40 467 r \$0_which_table; #N canvas 0 22 470 320 select_table 0; #X obj 55 24 inlet; #X msg 55 112 0; #X msg 109 180 1.698e+07; #X obj 55 90 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 109 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 133 s \$0_offset; #X obj 109 201 s \$0_offset; #X obj 186 200 s \$0_which_table; #X msg 186 178 set array98; #X obj 127 133 s \$0_which_table; #X msg 127 111 set array99; #X obj 55 47 sel 0 1; #X connect 0 0 11 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 10 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 4 0 8 0; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 11 1 4 0; #X restore 275 390 pd select_table; #X obj 275 356 vradio 15 1 0 2 empty empty empty 0 -6 0 8 -262144 -1 -1 0; #X text 294 354 array99 offset=0; #X text 293 369 array98 offset=1.698e+07; #X text 604 566 IEM KUG; #X text 588 554 musil; #X text 625 554 @; #X text 634 554 iem.at; #X text 587 576 Graz \, Austria; #X text 647 528 @; #X text 656 528 iem.at; #X text 588 528 zmoelnig; #X msg 406 95 \; array98 const 0 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5 \; array98 1.698e+07 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5; #X text 13 11 tabread__; #X text 14 27 tabread''; #X obj 41 508 tabread__ array99; #X obj 77 533 tabread'' array99; #X obj 293 511 tabread array99; #X obj 493 271 tabread; #X text 41 291 tabread is used to build samplers and other table lookup algorithms. The interpolation scheme is rounding down integer.; #X text 539 515 (c) IOhannes m zmoelnig 1999 - 2013; #X text 539 543 (c) Thomas Musil 2000 - 2013; #X text 116 10 non-interpolating table lookup with double precision index (15 digits accurate); #X connect 0 0 25 0; #X connect 6 0 7 0; #X connect 6 0 28 0; #X connect 7 0 30 0; #X connect 8 0 6 0; #X connect 9 0 7 1; #X connect 10 0 28 1; #X connect 11 0 30 0; #X connect 12 0 28 0; #X connect 14 0 13 0; #X connect 28 0 3 0; #X connect 30 0 5 0; iem_utils-0.0.20240903/iem_dp/tabread~~-help.pd0000600000000000000000000000376514665566711015725 0ustar00#N canvas 78 22 896 636 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X obj 408 27 loadbang; #X text 417 231 see also:; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 13 float 0; #X coords 0 5.5 12 -5.5 250 200 1; #X restore 121 44 graph; #X obj 41 523 snapshot~; #X obj 176 507 metro 200; #X obj 40 408 sig~; #X floatatom 41 549 0 0 0 0 - - -; #X obj 176 462 loadbang; #X obj 176 486 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X floatatom 40 369 0 0 0 0 - - -; #X obj 408 50 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 43 350 hsl 101 15 1 11 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X text 498 548 IEM KUG; #X text 482 536 musil; #X text 519 536 @; #X text 528 536 iem.at; #X text 481 558 Graz \, Austria; #X text 541 510 @; #X text 550 510 iem.at; #X text 482 510 zmoelnig; #X msg 408 72 \; array99 resize 13 \; array99 0 -5 -5 -4 -3 -2 -1 0 1 2 3 4 5 5 \; array99 bounds 0 5.5 12 -5.5 \; array99 xticks 0 1 2 \; array99 yticks 0 0.5 5 \; array99 xlabel -6 0 2 4 6 8 10 12 \; array99 ylabel -0.4 -5 -4 -3 -2 -1 0 1 2 3 4 5; #X obj 484 230 tabread~; #X obj 41 488 tabread~~ array99; #X obj 84 427 sig~; #X text 71 408 first part of float inlet sum; #X text 113 426 second part of float inlet sum; #X text 13 -15 tabread~~; #X text 434 497 (c) IOhannes m zmoelnig 1999 - 2013; #X text 433 525 (c) Thomas Musil 2000 - 2013; #X text 117 -13 non-interpolating table lookup with double precision index (15 digits accurate); #X text 118 -37; #X text 44 272 tabread is used to build samplers and other table lookup algorithms. The interpolation scheme is rounding down integer.; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 4 0 14 0; #X connect 7 0 10 0; #X connect 8 0 7 0; #X connect 9 0 26 0; #X connect 11 0 12 0; #X connect 12 0 8 0; #X connect 13 0 9 0; #X connect 14 0 24 0; #X connect 15 0 13 0; #X connect 26 0 7 0; #X connect 27 0 26 1; iem_utils-0.0.20240903/iem_dp/tabwrite__-help.pd0000600000000000000000000000314114665566711016032 0ustar00#N canvas 41 42 639 550 10; #X text 334 93 see also:; #X obj 128 82 table array98 1.7e+07; #X text 206 462 IEM KUG; #X text 190 450 musil; #X text 227 450 @; #X text 236 450 iem.at; #X text 189 472 Graz \, Austria; #X text 249 424 @; #X text 258 424 iem.at; #X text 190 424 zmoelnig; #X obj 403 92 tabwrite; #X floatatom 121 191 5 0 0 0 - - -; #X obj 199 240 t f b f; #X msg 218 271 1.698e+07; #X obj 121 219 t f f; #X msg 49 283 1.698e+07; #X obj 49 254 t b f; #X floatatom 49 331 0 0 0 0 - - -; #X obj 49 307 tabread__ array98; #X obj 166 307 tabwrite__ array98; #X floatatom 393 173 5 0 0 0 - - -; #X obj 393 201 t f f; #X msg 312 282 1.698e+07; #X obj 312 253 t b f; #X floatatom 312 330 0 0 0 0 - - -; #X obj 475 225 t f b f; #X msg 493 251 1.698e+07; #X obj 499 273 +; #X obj 129 107 table array99 1.7e+07; #X obj 312 307 tabread__ array99; #X obj 435 307 tabwrite array99; #X text 13 11 tabwrite__; #X text 14 27 tabwrite''; #X text 116 10 write number in a lookup table with double precision index (15 digits accurate); #X text 141 411 (c) IOhannes m zmoelnig 1999 - 2013; #X text 141 439 (c) Thomas Musil 2000 - 2013; #X connect 11 0 14 0; #X connect 12 0 19 0; #X connect 12 1 13 0; #X connect 12 2 19 2; #X connect 13 0 19 1; #X connect 14 0 16 0; #X connect 14 1 12 0; #X connect 15 0 18 0; #X connect 16 0 15 0; #X connect 16 1 18 1; #X connect 18 0 17 0; #X connect 20 0 21 0; #X connect 21 0 23 0; #X connect 21 1 25 0; #X connect 22 0 29 0; #X connect 23 0 22 0; #X connect 23 1 29 1; #X connect 25 0 30 0; #X connect 25 1 26 0; #X connect 25 2 27 1; #X connect 26 0 27 0; #X connect 27 0 30 1; #X connect 29 0 24 0; iem_utils-0.0.20240903/iem_dp/tabwrite~~-help.pd0000600000000000000000000000241414665566711016132 0ustar00#N canvas 78 22 863 399 10; #X obj 28 14 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 28 81 5 0 0 0 - - -; #X floatatom 44 59 3 0 0 0 - - -; #X obj 28 36 dsp; #X text 420 277 see also:; #X text 658 295 IEM KUG; #X text 642 283 musil; #X text 679 283 @; #X text 688 283 iem.at; #X text 641 305 Graz \, Austria; #X text 701 257 @; #X text 710 257 iem.at; #X text 642 257 zmoelnig; #X obj 479 276 tabwrite~; #X msg 47 210 bang; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 1000 float 0; #X coords 0 1 999 -1 200 100 1; #X restore 390 77 graph; #X text 190 318 creation argument initializes array name; #X msg 45 288 set array99; #X msg 48 260 stop; #X text 153 261 stop recording; #X text 175 234 start in middle of table; #X obj 27 187 phasor~ 200; #X text 148 209 start recording; #X text 149 286 set destination array; #X text 15 -11 tabwrite~~; #X obj 28 318 tabwrite~~ array99; #X msg 47 236 start 500 5; #X text 593 244 (c) IOhannes m zmoelnig 1999 - 2013; #X text 593 272 (c) Thomas Musil 2000 - 2013; #X text 109 -12 - write a signal in an array with a double precision start onset; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 14 0 25 0; #X connect 17 0 25 0; #X connect 18 0 25 0; #X connect 21 0 25 0; #X connect 26 0 25 0; iem_utils-0.0.20240903/iem_dp/vd~~-help.pd0000600000000000000000000000166214665566711014726 0ustar00#N canvas 248 216 633 323 10; #X obj 32 25 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 33 48 \; pd dsp \$1; #X obj 175 65 sig~; #X floatatom 174 40 5 0 0 0 - - -; #X obj 178 197 delread~~ abc 1234 0; #X obj 178 224 unsig~; #X floatatom 178 248 5 0 0 0 - - -; #X obj 176 91 delwrite~~ abc 9876 0; #X msg 221 166 2345 0; #X msg 242 145 3456 0; #X floatatom 163 148 5 0 0 0 - - -; #X floatatom 310 144 5 0 0 0 - - -; #X obj 390 226 unsig~; #X floatatom 390 250 5 0 0 0 - - -; #X floatatom 382 122 5 0 0 0 - - -; #X floatatom 437 122 5 0 0 0 - - -; #X obj 390 199 vd~~ abc; #X obj 382 141 sig~; #X obj 436 144 sig~; #X connect 0 0 1 0; #X connect 2 0 7 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 8 0 4 0; #X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 1; #X connect 12 0 13 0; #X connect 14 0 17 0; #X connect 15 0 18 0; #X connect 16 0 12 0; #X connect 17 0 16 0; #X connect 18 0 16 1; iem_utils-0.0.20240903/iem_dp/vline~~-help.pd0000600000000000000000000000573514665566711015437 0ustar00#N canvas 84 36 1151 705 10; #X obj 30 19 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 30 86 5 0 0 0 - - -; #X floatatom 46 64 3 0 0 0 - - -; #X obj 30 41 dsp; #X text 416 24 see also:; #X text 381 117 IEM KUG; #X text 365 105 musil; #X text 402 105 @; #X text 411 105 iem.at; #X text 364 127 Graz \, Austria; #X text 424 79 @; #X text 433 79 iem.at; #X text 365 79 zmoelnig; #X obj 489 25 vline~; #X text 15 -10 vline~~; #X obj 35 579 snapshot~; #X floatatom 35 602 5 0 0 0 - - -; #X obj 45 552 metro 100; #X msg 87 477 stop; #X text 189 185 ramp up; #X text 198 204 ramp down; #X text 115 148 jump down; #X text 130 476 "stop" message freezes vline~ at its current value ; #X obj 45 527 loadbang; #X msg 66 149 0 0.1; #X obj 35 504 vline~~ #####; #X msg 60 130 1 0.1; #X text 109 129 jump up; #X text 275 290 delayed ramp up; #X text 284 309 delayed ramp down; #X msg 81 185 1 0.1 2000 20; #X msg 89 204 0 0.1 2000 20; #X msg 114 290 1 0.1 2000 20 1000 10; #X msg 122 309 0 0.1 2000 20 1000 10; #X text 242 238 delayed jump up; #X text 251 257 delayed jump down; #X msg 123 258 0 0.1 0 0 1000 10; #X text 133 330 ramp up \, stay at top \, jump down \, ramp up again \, stay top \, ramp down; #X msg 115 238 1 0.1 0 0 1000 10; #X msg 130 358 1 0.1 2000 20 0 0 \, 0 0.1 0 0 2500 25 \, 1 0.1 2000 20 2500 25 \, 0 0.1 2000 20 5000 50; #X msg 136 422 1 0.1 2000 20 0 0 \, 0 0.1 0 0 2000 20 \, 1 0.1 2000 20 2000 20 \, 0 0.1 2000 20 4000 40; #X text 135 402 ramp up \, jump down \, ramp up again \, ramp down ; #X obj 1002 61 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array array99 200 float 0; #X coords 0 1.1 199 -0.1 250 200 1; #X restore 664 35 graph; #X obj 691 422 vline~~; #X obj 657 455 tabwrite~ array99; #X obj 656 325 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 656 349 t b b; #X msg 690 396 \$1 0 \$2 0 \$3 0; #X msg 689 372 1 1 0 \, 0 0 1.3 \, 1 1 1.6 \, 0 1 2.8; #X text 800 397 add to each parameter the fine offset of zero; #X msg 1001 84 \; array99 const 0 \; array99 resize 200 \; array99 bounds 0 1.1 199 -0.1 \; array99 xticks 0 5 4 \; array99 yticks 0 0.1 1 \; array99 xlabel -0.15 0 20 40 60 80 100 120 140 160 180 200 \; array99 ylabel -9 0 0.2 0.4 0.6 0.8 1; #X text 82 -11 - double precision audio ramp generator; #X text 316 67 (c) IOhannes m zmoelnig 1999 - 2013; #X text 316 94 (c) Thomas Musil 2000 - 2013; #X obj 139 579 snapshot~; #X floatatom 139 602 9 0 0 0 - - -; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 15 0 16 0; #X connect 17 0 15 0; #X connect 18 0 25 0; #X connect 23 0 17 0; #X connect 24 0 25 0; #X connect 25 0 15 0; #X connect 25 1 55 0; #X connect 26 0 25 0; #X connect 30 0 25 0; #X connect 31 0 25 0; #X connect 32 0 25 0; #X connect 33 0 25 0; #X connect 36 0 25 0; #X connect 38 0 25 0; #X connect 39 0 25 0; #X connect 40 0 25 0; #X connect 42 0 51 0; #X connect 44 0 45 0; #X connect 46 0 47 0; #X connect 47 0 45 0; #X connect 47 1 49 0; #X connect 48 0 44 0; #X connect 49 0 48 0; #X connect 55 0 56 0; iem_utils-0.0.20240903/iem_dp/wrap~~-help.pd0000600000000000000000000000243114665566711015261 0ustar00#N canvas 78 22 598 414 10; #X obj 30 19 tgl 15 0 empty empty empty 20 8 0 10 -262144 -1 -1 0 1 ; #X floatatom 30 86 5 0 0 0 - - -; #X floatatom 46 64 3 0 0 0 - - -; #X obj 30 41 dsp; #X text 290 39 see also:; #X text 360 283 IEM KUG; #X text 344 271 musil; #X text 381 271 @; #X text 390 271 iem.at; #X text 343 293 Graz \, Austria; #X text 403 245 @; #X text 412 245 iem.at; #X text 344 245 zmoelnig; #X obj 357 40 wrap~; #X obj 145 292 metro 500; #X floatatom 34 116 0 0 0 0 - - -; #X floatatom 36 360 0 0 0 0 - - -; #X obj 36 327 snapshot~; #X obj 34 142 sig~; #X text 86 -9 - remainder modulo 1; #X text 65 115 <-- shift-drag here to get non-integers to try; #X text 15 -10 wrap~~; #X obj 145 267 loadbang; #X obj 34 221 wrap~~; #X text 83 208 <-- fine inlet; #X text 83 237 <-- fine outlet; #X obj 72 182 *~ 0.01; #X floatatom 104 360 0 0 0 0 - - -; #X obj 104 327 snapshot~; #X text 295 232 (c) IOhannes m zmoelnig 1999 - 2013; #X text 295 260 (c) Thomas Musil 2000 - 2013; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 1 2 0; #X connect 14 0 17 0; #X connect 14 0 28 0; #X connect 15 0 18 0; #X connect 17 0 16 0; #X connect 18 0 23 0; #X connect 18 0 26 0; #X connect 22 0 14 0; #X connect 22 0 14 0; #X connect 23 0 17 0; #X connect 23 1 28 0; #X connect 26 0 23 1; #X connect 28 0 27 0; iem_utils-0.0.20240903/iem_roomsim/0000700000000000000000000000000014665566711013521 5ustar00iem_utils-0.0.20240903/iem_roomsim/CONTENT.txt0000600000000000000000000000245114665566711015400 0ustar00 content of iem_roomsim Release 1.21 from March 2018 ----------------- block~, room-simulation, delay~ stuff ------------------------------- block_delay~ delays a signal by blocksize samples block_lp1~ this lowpass recursive filter forms the current spectrum bin by bin isolated to the previous spectrum bin by bin (time shape filtering of spectrum) block_peak_env~ this peak envelope recursive filter forms the current spectrum bin by bin isolated to the previous spectrum bin by bin (time shape filtering of spectrum) cart2del_damp_2d calculates the delay time, distance damping factor, azimuth angle of an acoustical mirror source up to the 2nd reflections cart2del_damp_3d calculates the delay time, distance damping factor, elevation and azimuth angles of an acoustical mirror source up to the 2nd reflections n_delay1p_line~ delays a signal to n taps with no interpolation n_delay2p_line~ delays a signal to n taps with a 2-point interpolation postscriptum: "cart2del_damp_2d" and "cart2del_damp_3d". this are 2 mirror image source method rendering objects, they calculate the radius distance, the delay time and the spheric coordinates in case of 3D or the polar coordinates in case of 2D of all the first and second reflections between an subjekt and an object in a cuboid room.iem_utils-0.0.20240903/iem_roomsim/GnuLGPL.txt0000600000000000000000000006346714665566711015514 0ustar00 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! iem_utils-0.0.20240903/iem_roomsim/LICENSE.txt0000600000000000000000000000250214665566711015345 0ustar00This library extends the performance of Miller S. Puckette's realtime-computermusic-environment puredata (pd). iem_roomsim contains 1 external library "iem_roomsim.dll" with 7 objects and their help files. iem_roomsim is published under the Gnu Lesser General Public License that is included (GnuLGPL.txt). Copyright (C) 2000-2018 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details ( GnuLGPL.txt ). (e.g. http://www.gnu.org/copyleft/lesser.html) You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Graz, March 1st 2018 Thomas Musil iem_utils-0.0.20240903/iem_roomsim/Makefile0000600000000000000000000000323114665566711015162 0ustar00#!/usr/bin/make -f # Makefile to the 'iem_roomsim' library for Pure Data. # Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build # settings and rules (https://github.com/pure-data/pd-lib-builder). lib.name = iem_roomsim ## iemlib.h lives in include/ cflags = -Iinclude # special file that does not provide a class lib.setup.sources = src/$(lib.name).c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) # class.sources = $(filter-out $(lib.setup.sources),$(wildcard src/*.c)) class.sources = \ src/early_reflections_3d.c \ src/early_reflections_2d.c \ src/cart2del_damp_2d.c \ src/cart2del_damp_3d.c \ src/n_delay1p_line~.c \ src/n_delay2p_line~.c \ src/nz~.c \ src/block_delay~.c \ src/block_lp1~.c \ src/block_peak_env~.c \ $(empty) datafiles = \ $(wildcard *.txt) \ $(wildcard *.pdf) \ $(wildcard *.pd) \ $(wildcard *.gif) \ $(wildcard *.bat) \ $(wildcard *.sh) \ $(wildcard *.wav) \ $(empty) #cflags = -DVERSION=$(shell cat VERSION.txt) ## build a multi-object library make-lib-executable=yes ## suppress "unused" warnings #suppress-wunused=yes ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # This Makefile is based on the Makefile from pd-lib-builder written by # Katja Vetter. You can get it from: # https://github.com/pure-data/pd-lib-builder PDLIBBUILDER_DIR=pd-lib-builder/ include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder)) iem_utils-0.0.20240903/iem_roomsim/READ_ME.txt0000600000000000000000000000405214665566711015361 0ustar00This library extends the performance of Miller S. Puckette's realtime-computermusic-environment puredata (pd). iem_roomsim contains 1 external library "iem_roomsim.dll" with 7 objects and their help files (see CONTENT.txt). The main topics are various kinds of delays, signal-block-manipulations and mirror image source method rendering for acoustical room simulation. iem_roomsim is published under the Gnu Lesser General Public License (see LICENSE.txt and GnuLGPL.txt). iem_roomsim (Release 1.21) is written by Thomas Musil from IEM KUG Graz Austria and it is compiled against pd-0.48-1. You have to add the library -lib iem_roomsim (Menue: File: Preferences: Startup...: New...). For Windows "install_path" could be: "C:/Users/xx_ME_xx/AppData/Roaming/Pd" or "C:/Program Files (x86)/Common Files/Pd" or "C:/Users/xx_ME_xx/Documents/Pd/externals" or "C:/Program Files (x86)/pd/extra". For Apple OSX: "install_path" could be: "~/Library/Pd" or "/Library/Pd" or "/Applications/Pd.app/Contents/Resources/extra". For Linux: "install_path" could be: "~/.local/lib/pd/extra" or "~/pd-externals" or "/usr/local/lib/pd-externals" or "/usr/local/lib/pd/extra" or "/usr/lib/pd/extra". Make sure that you get the desired version of iem_roomsim if there are multiple installations on your computer (-verbose). Copyright (C) 2000-2018 Thomas MUSIL [musil_at_iem.at] THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-0.0.20240903/iem_roomsim/block_delay~-help.pd0000600000000000000000000001162114665566711017445 0ustar00#N canvas 456 157 568 471 10; #X text 119 399 IEM KUG; #X text 93 387 musil; #X text 131 387 @; #X text 139 387 iem.at; #X text 102 409 Graz \, Austria; #X obj 21 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 21 111 5 0 0 0 - - -; #X floatatom 51 91 5 0 0 0 - - -; #N canvas 0 22 450 300 (subpatch) 0; #X array array101 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 404 223 graph; #X obj 187 258 tabwrite~ array101; #N canvas 0 22 450 300 (subpatch) 0; #X array array100 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 404 153 graph; #X obj 226 192 tabwrite~ array100; #X text 250 220 no initial arguments; #X obj 162 220 block_delay~; #X obj 160 97 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 405 274 hsl 100 15 0 99 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 6400 1; #X floatatom 402 295 5 0 0 0 - - -; #X text 21 11 block_delay~; #X text 52 376 (c) Thomas Musil 2000 - 2011; #N canvas 0 22 450 300 dirac 0; #X obj 103 44 inlet; #X obj 103 65 t b b; #X obj 71 100 del 2; #X msg 126 112 1; #X msg 70 122 0; #X obj 92 151 biquad~ 0 0 1 -1 0; #X obj 92 176 max~ 0; #X obj 92 197 outlet~; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 4 0; #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X restore 161 139 pd dirac; #N canvas 0 22 528 567 dsp 0; #X obj 20 65 inlet; #X obj 20 406 outlet; #X msg 31 88 \; pd dsp \$1; #X obj 20 199 cputime; #X obj 20 178 t b b; #X text 15 11 dsp; #X text 59 65 1/0 = ON/OFF; #X text 97 313 CPU-load; #X obj 62 126 loadbang; #X obj 20 126 sel 1; #X text 64 12 turn dsp-kernel on & off \,; #X obj 20 240 t f f; #X obj 211 405 outlet; #X text 65 408 average; #X text 177 405 peak; #X obj 211 154 f; #X obj 146 179 > -1; #X obj 169 155 f -1; #X obj 179 91 t f b f; #X obj 146 204 sel 1; #X obj 192 132 f -1; #X obj 20 154 metro 500; #X obj 20 220 * 0.2; #X text 74 37 -dsp-load in %; #X text 65 24 measure average- and peak-; #X obj 20 292 1p1z 0.1 0 0.9; #X obj 20 315 * 100; #X obj 20 360 int; #X obj 20 338 + 0.499; #X obj 20 383 * 0.01; #X obj 246 207 r pd; #X obj 246 231 route dsp; #X text 245 318 to toggle input; #X msg 246 283 \; dsp_tgl set \$1; #X obj 247 341 r dsp_tgl; #X obj 246 257 route float; #X obj 146 227 del 3990; #X text 179 455 IEM KUG; #X text 153 443 musil; #X text 190 443 @; #X text 199 443 iem.at; #X text 162 465 Graz \, Austria; #X msg 275 108 \; pd audio-dialog 0 0 0 0 64 0 0 0 0 0 0 0 64 0 0 0 44100 \$1; #X obj 275 81 inlet; #X text 271 56 system delay time in ms; #N canvas 0 22 486 468 once 0; #X obj 89 162 spigot; #X obj 34 59 inlet; #X obj 89 111 t a b; #X obj 126 140 f 1; #X obj 89 194 t a b; #X obj 119 216 f 0; #X obj 89 247 outlet; #X obj 207 56 inlet; #X obj 207 79 bang; #X obj 207 102 f 1; #X text 8 6 once; #X text 64 7 only the first message passes through; #X text 29 37 message in; #X text 29 289 message out (only once); #X text 203 36 anything to init once; #X obj 34 80 route bang; #X obj 34 110 t b b; #X obj 34 162 spigot; #X obj 34 194 t b b; #X text 98 377 IEM KUG; #X text 73 363 musil; #X text 110 365 @; #X text 118 365 iem.at; #X text 81 387 Graz \, Austria; #X text 120 339 @; #X text 128 339 iem.at; #X text 33 338 (c) zmoelnig; #X text 33 352 (c) Thomas Musil 2000 - 2011; #X connect 0 0 4 0; #X connect 1 0 15 0; #X connect 2 0 0 0; #X connect 2 1 3 0; #X connect 3 0 0 1; #X connect 3 0 17 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 3 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 9 0 3 1; #X connect 15 0 16 0; #X connect 15 1 2 0; #X connect 16 0 17 0; #X connect 16 1 3 0; #X connect 17 0 18 0; #X connect 18 0 6 0; #X connect 18 1 5 0; #X restore 69 270 pd once; #X text 112 430 (c) Thomas Musil 2000 - 2011; #X connect 0 0 2 0; #X connect 0 0 9 0; #X connect 3 0 22 0; #X connect 4 0 3 0; #X connect 4 1 3 1; #X connect 8 0 21 0; #X connect 9 0 21 0; #X connect 11 0 25 0; #X connect 11 1 45 0; #X connect 15 0 17 1; #X connect 15 0 12 0; #X connect 16 0 19 0; #X connect 17 0 16 1; #X connect 18 0 16 0; #X connect 18 1 17 0; #X connect 18 2 15 1; #X connect 19 0 15 0; #X connect 19 0 36 0; #X connect 20 0 17 1; #X connect 21 0 4 0; #X connect 22 0 11 0; #X connect 22 0 18 0; #X connect 25 0 26 0; #X connect 26 0 28 0; #X connect 27 0 29 0; #X connect 28 0 27 0; #X connect 29 0 1 0; #X connect 30 0 31 0; #X connect 31 0 35 0; #X connect 35 0 33 0; #X connect 36 0 20 0; #X connect 43 0 42 0; #X connect 45 0 25 5; #X connect 45 0 25 4; #X restore 21 65 pd dsp; #X obj 21 261 block~ 64 1 1; #X msg 21 239 set \$1 1 1; #X floatatom 20 220 5 0 0 0 - - -; #X msg 20 163 32; #X msg 20 188 64; #X text 130 10 Constant signal delay of one blocksize.; #X connect 5 0 20 0; #X connect 13 0 9 0; #X connect 14 0 11 0; #X connect 14 0 9 0; #X connect 14 0 19 0; #X connect 15 0 16 0; #X connect 19 0 11 0; #X connect 19 0 13 0; #X connect 20 0 6 0; #X connect 20 1 7 0; #X connect 22 0 21 0; #X connect 23 0 22 0; #X connect 24 0 23 0; #X connect 25 0 23 0; iem_utils-0.0.20240903/iem_roomsim/block_lp1~-help.pd0000600000000000000000000001203414665566711017042 0ustar00#N canvas 456 157 568 471 10; #X text 119 399 IEM KUG; #X text 93 387 musil; #X text 131 387 @; #X text 139 387 iem.at; #X text 102 409 Graz \, Austria; #X obj 21 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 21 111 5 0 0 0 - - -, f 5; #X floatatom 51 91 5 0 0 0 - - -, f 5; #N canvas 0 22 450 300 (subpatch) 0; #X array array100 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 404 153 graph; #X obj 192 49 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 405 274 hsl 100 15 0 99 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X floatatom 402 295 5 0 0 0 - - -, f 5; #X text 52 376 (c) Thomas Musil 2000 - 2011; #N canvas 0 22 450 300 dirac 0; #X obj 103 44 inlet; #X obj 103 65 t b b; #X obj 71 100 del 2; #X msg 126 112 1; #X msg 70 122 0; #X obj 92 151 biquad~ 0 0 1 -1 0; #X obj 92 176 max~ 0; #X obj 92 197 outlet~; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 4 0; #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X restore 192 73 pd dirac; #N canvas 0 22 528 567 dsp 0; #X obj 20 65 inlet; #X obj 20 406 outlet; #X msg 31 88 \; pd dsp \$1; #X obj 20 199 cputime; #X obj 20 178 t b b; #X text 15 11 dsp; #X text 59 65 1/0 = ON/OFF; #X text 97 313 CPU-load; #X obj 62 126 loadbang; #X obj 20 126 sel 1; #X text 64 12 turn dsp-kernel on & off \,; #X obj 20 240 t f f; #X obj 211 405 outlet; #X text 65 408 average; #X text 177 405 peak; #X obj 211 154 f; #X obj 146 179 > -1; #X obj 169 155 f -1; #X obj 179 91 t f b f; #X obj 146 204 sel 1; #X obj 192 132 f -1; #X obj 20 154 metro 500; #X obj 20 220 * 0.2; #X text 74 37 -dsp-load in %; #X text 65 24 measure average- and peak-; #X obj 20 292 1p1z 0.1 0 0.9; #X obj 20 315 * 100; #X obj 20 360 int; #X obj 20 338 + 0.499; #X obj 20 383 * 0.01; #X obj 246 207 r pd; #X obj 246 231 route dsp; #X text 245 318 to toggle input; #X msg 246 283 \; dsp_tgl set \$1; #X obj 247 341 r dsp_tgl; #X obj 246 257 route float; #X obj 146 227 del 3990; #X text 179 455 IEM KUG; #X text 153 443 musil; #X text 190 443 @; #X text 199 443 iem.at; #X text 162 465 Graz \, Austria; #X msg 275 108 \; pd audio-dialog 0 0 0 0 64 0 0 0 0 0 0 0 64 0 0 0 44100 \$1; #X obj 275 81 inlet; #X text 271 56 system delay time in ms; #N canvas 0 22 486 468 once 0; #X obj 89 162 spigot; #X obj 34 59 inlet; #X obj 89 111 t a b; #X obj 126 140 f 1; #X obj 89 194 t a b; #X obj 119 216 f 0; #X obj 89 247 outlet; #X obj 207 56 inlet; #X obj 207 79 bang; #X obj 207 102 f 1; #X text 8 6 once; #X text 64 7 only the first message passes through; #X text 29 37 message in; #X text 29 289 message out (only once); #X text 203 36 anything to init once; #X obj 34 80 route bang; #X obj 34 110 t b b; #X obj 34 162 spigot; #X obj 34 194 t b b; #X text 98 377 IEM KUG; #X text 73 363 musil; #X text 110 365 @; #X text 118 365 iem.at; #X text 81 387 Graz \, Austria; #X text 120 339 @; #X text 128 339 iem.at; #X text 33 338 (c) zmoelnig; #X text 33 352 (c) Thomas Musil 2000 - 2011; #X connect 0 0 4 0; #X connect 1 0 15 0; #X connect 2 0 0 0; #X connect 2 1 3 0; #X connect 3 0 0 1; #X connect 3 0 17 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 3 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 9 0 3 1; #X connect 15 0 16 0; #X connect 15 1 2 0; #X connect 16 0 17 0; #X connect 16 1 3 0; #X connect 17 0 18 0; #X connect 18 0 6 0; #X connect 18 1 5 0; #X restore 69 270 pd once; #X text 112 430 (c) Thomas Musil 2000 - 2011; #X connect 0 0 2 0; #X connect 0 0 9 0; #X connect 3 0 22 0; #X connect 4 0 3 0; #X connect 4 1 3 1; #X connect 8 0 21 0; #X connect 9 0 21 0; #X connect 11 0 25 0; #X connect 11 1 45 0; #X connect 15 0 17 1; #X connect 15 0 12 0; #X connect 16 0 19 0; #X connect 17 0 16 1; #X connect 18 0 16 0; #X connect 18 1 17 0; #X connect 18 2 15 1; #X connect 19 0 15 0; #X connect 19 0 36 0; #X connect 20 0 17 1; #X connect 21 0 4 0; #X connect 22 0 11 0; #X connect 22 0 18 0; #X connect 25 0 26 0; #X connect 26 0 28 0; #X connect 27 0 29 0; #X connect 28 0 27 0; #X connect 29 0 1 0; #X connect 30 0 31 0; #X connect 31 0 35 0; #X connect 35 0 33 0; #X connect 36 0 20 0; #X connect 43 0 42 0; #X connect 45 0 25 5; #X connect 45 0 25 4; #X restore 21 65 pd dsp; #X obj 21 261 block~ 64 1 1; #X msg 21 239 set \$1 1 1; #X floatatom 20 220 5 0 0 0 - - -, f 5; #X msg 20 163 32; #X msg 20 188 64; #X text 130 10 Constant signal delay of one blocksize.; #X text 21 11 block_lp1~; #X obj 173 244 block_lp1~ 0.999; #X text 283 244 1st argument:; #X obj 191 281 tabsend~ array100; #X obj 192 104 biquad~ 0 0 0 0 4; #X obj 192 128 biquad~ 0 0 0 0 4; #X obj 192 152 biquad~ 0 0 0 0 4; #X obj 192 174 biquad~ 0 0 0 0 4; #X msg 263 203 0.999; #X msg 316 216 0.998; #X msg 204 215 0.9995; #X connect 5 0 14 0; #X connect 9 0 13 0; #X connect 10 0 11 0; #X connect 13 0 25 0; #X connect 14 0 6 0; #X connect 14 1 7 0; #X connect 16 0 15 0; #X connect 17 0 16 0; #X connect 18 0 17 0; #X connect 19 0 17 0; #X connect 22 0 24 0; #X connect 25 0 26 0; #X connect 26 0 27 0; #X connect 27 0 28 0; #X connect 28 0 22 0; #X connect 29 0 22 1; #X connect 30 0 22 1; #X connect 31 0 22 1; iem_utils-0.0.20240903/iem_roomsim/block_peak_env~-help.pd0000600000000000000000000001205614665566711020142 0ustar00#N canvas 456 157 568 471 10; #X text 119 399 IEM KUG; #X text 93 387 musil; #X text 131 387 @; #X text 139 387 iem.at; #X text 102 409 Graz \, Austria; #X obj 21 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 21 111 5 0 0 0 - - -, f 5; #X floatatom 51 91 5 0 0 0 - - -, f 5; #N canvas 0 22 450 300 (subpatch) 0; #X array array100 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 404 153 graph; #X obj 192 49 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 405 274 hsl 100 15 0 99 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X floatatom 402 295 5 0 0 0 - - -, f 5; #X text 52 376 (c) Thomas Musil 2000 - 2011; #N canvas 0 22 450 300 dirac 0; #X obj 103 44 inlet; #X obj 103 65 t b b; #X obj 71 100 del 2; #X msg 126 112 1; #X msg 70 122 0; #X obj 92 151 biquad~ 0 0 1 -1 0; #X obj 92 176 max~ 0; #X obj 92 197 outlet~; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 4 0; #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X restore 192 73 pd dirac; #N canvas 0 22 528 567 dsp 0; #X obj 20 65 inlet; #X obj 20 406 outlet; #X msg 31 88 \; pd dsp \$1; #X obj 20 199 cputime; #X obj 20 178 t b b; #X text 15 11 dsp; #X text 59 65 1/0 = ON/OFF; #X text 97 313 CPU-load; #X obj 62 126 loadbang; #X obj 20 126 sel 1; #X text 64 12 turn dsp-kernel on & off \,; #X obj 20 240 t f f; #X obj 211 405 outlet; #X text 65 408 average; #X text 177 405 peak; #X obj 211 154 f; #X obj 146 179 > -1; #X obj 169 155 f -1; #X obj 179 91 t f b f; #X obj 146 204 sel 1; #X obj 192 132 f -1; #X obj 20 154 metro 500; #X obj 20 220 * 0.2; #X text 74 37 -dsp-load in %; #X text 65 24 measure average- and peak-; #X obj 20 292 1p1z 0.1 0 0.9; #X obj 20 315 * 100; #X obj 20 360 int; #X obj 20 338 + 0.499; #X obj 20 383 * 0.01; #X obj 246 207 r pd; #X obj 246 231 route dsp; #X text 245 318 to toggle input; #X msg 246 283 \; dsp_tgl set \$1; #X obj 247 341 r dsp_tgl; #X obj 246 257 route float; #X obj 146 227 del 3990; #X text 179 455 IEM KUG; #X text 153 443 musil; #X text 190 443 @; #X text 199 443 iem.at; #X text 162 465 Graz \, Austria; #X msg 275 108 \; pd audio-dialog 0 0 0 0 64 0 0 0 0 0 0 0 64 0 0 0 44100 \$1; #X obj 275 81 inlet; #X text 271 56 system delay time in ms; #N canvas 0 22 486 468 once 0; #X obj 89 162 spigot; #X obj 34 59 inlet; #X obj 89 111 t a b; #X obj 126 140 f 1; #X obj 89 194 t a b; #X obj 119 216 f 0; #X obj 89 247 outlet; #X obj 207 56 inlet; #X obj 207 79 bang; #X obj 207 102 f 1; #X text 8 6 once; #X text 64 7 only the first message passes through; #X text 29 37 message in; #X text 29 289 message out (only once); #X text 203 36 anything to init once; #X obj 34 80 route bang; #X obj 34 110 t b b; #X obj 34 162 spigot; #X obj 34 194 t b b; #X text 98 377 IEM KUG; #X text 73 363 musil; #X text 110 365 @; #X text 118 365 iem.at; #X text 81 387 Graz \, Austria; #X text 120 339 @; #X text 128 339 iem.at; #X text 33 338 (c) zmoelnig; #X text 33 352 (c) Thomas Musil 2000 - 2011; #X connect 0 0 4 0; #X connect 1 0 15 0; #X connect 2 0 0 0; #X connect 2 1 3 0; #X connect 3 0 0 1; #X connect 3 0 17 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 3 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 9 0 3 1; #X connect 15 0 16 0; #X connect 15 1 2 0; #X connect 16 0 17 0; #X connect 16 1 3 0; #X connect 17 0 18 0; #X connect 18 0 6 0; #X connect 18 1 5 0; #X restore 69 270 pd once; #X text 112 430 (c) Thomas Musil 2000 - 2011; #X connect 0 0 2 0; #X connect 0 0 9 0; #X connect 3 0 22 0; #X connect 4 0 3 0; #X connect 4 1 3 1; #X connect 8 0 21 0; #X connect 9 0 21 0; #X connect 11 0 25 0; #X connect 11 1 45 0; #X connect 15 0 17 1; #X connect 15 0 12 0; #X connect 16 0 19 0; #X connect 17 0 16 1; #X connect 18 0 16 0; #X connect 18 1 17 0; #X connect 18 2 15 1; #X connect 19 0 15 0; #X connect 19 0 36 0; #X connect 20 0 17 1; #X connect 21 0 4 0; #X connect 22 0 11 0; #X connect 22 0 18 0; #X connect 25 0 26 0; #X connect 26 0 28 0; #X connect 27 0 29 0; #X connect 28 0 27 0; #X connect 29 0 1 0; #X connect 30 0 31 0; #X connect 31 0 35 0; #X connect 35 0 33 0; #X connect 36 0 20 0; #X connect 43 0 42 0; #X connect 45 0 25 5; #X connect 45 0 25 4; #X restore 21 65 pd dsp; #X obj 21 261 block~ 64 1 1; #X msg 21 239 set \$1 1 1; #X floatatom 20 220 5 0 0 0 - - -, f 5; #X msg 20 163 32; #X msg 20 188 64; #X text 130 10 Constant signal delay of one blocksize.; #X text 306 243 1st argument:; #X obj 191 281 tabsend~ array100; #X text 21 11 block_peak_env~; #X obj 162 243 block_peak_env~ 0.999; #X obj 192 104 biquad~ 0 0 0 0 1.2; #X obj 192 129 biquad~ 0 0 0 0 1.2; #X obj 192 153 biquad~ 0 0 0 0 1.2; #X obj 192 177 biquad~ 0 0 0 0 1.2; #X msg 288 203 0.999; #X msg 341 216 0.998; #X msg 229 215 0.9995; #X connect 5 0 14 0; #X connect 9 0 13 0; #X connect 10 0 11 0; #X connect 13 0 25 0; #X connect 14 0 6 0; #X connect 14 1 7 0; #X connect 16 0 15 0; #X connect 17 0 16 0; #X connect 18 0 17 0; #X connect 19 0 17 0; #X connect 24 0 22 0; #X connect 25 0 26 0; #X connect 26 0 27 0; #X connect 27 0 28 0; #X connect 28 0 24 0; #X connect 29 0 24 1; #X connect 30 0 24 1; #X connect 31 0 24 1; iem_utils-0.0.20240903/iem_roomsim/cart2del_damp_2d-help.pd0000600000000000000000000002044514665566711020071 0ustar00#N canvas 11 8 974 613 10; #X text 11 9 cart2del_damp_2d; #X obj 48 288 cart2del_damp_2d; #X msg 59 83 sonic_speed 340; #X msg 67 104 r_ambi 1.4; #X obj 105 154 pack; #X obj 139 154 t b f; #X floatatom 98 137 5 -20 20 0 - - -; #X floatatom 141 137 5 -20 20 0 - - -; #X text 183 136 m x m; #X obj 151 225 pack; #X obj 185 225 t b f; #X floatatom 144 208 5 -20 20 0 - - -; #X floatatom 187 208 5 -20 20 0 - - -; #X text 229 207 m x m; #X obj 48 313 print; #X msg 105 175 head_xy \$1 \$2; #X msg 151 246 src_xy \$1 \$2; #X obj 96 314 s xxx; #X obj 368 19 r xxx; #X obj 368 41 route direct early1 early2; #X obj 368 424 route del damp index_phi; #X floatatom 368 508 5 0 0 0 - - -; #X floatatom 414 485 5 0 0 0 - - -; #X floatatom 460 465 5 0 0 0 - - -; #X obj 418 241 route del damp index_phi; #X floatatom 510 290 5 0 0 0 - - -; #X floatatom 551 290 5 0 0 0 - - -; #X obj 418 358 unpack 0 0 0 0; #X floatatom 418 380 5 0 0 0 - - -; #X floatatom 460 380 5 0 0 0 - - -; #X floatatom 502 380 5 0 0 0 - - -; #X floatatom 545 380 5 0 0 0 - - -; #X obj 464 309 unpack 0 0 0 0; #X floatatom 464 339 5 0 0 0 - - -; #X floatatom 506 339 5 0 0 0 - - -; #X floatatom 548 339 5 0 0 0 - - -; #X floatatom 591 339 5 0 0 0 - - -; #X obj 460 444 route 1; #X obj 510 265 route 1 2 3 4; #X floatatom 592 290 5 0 0 0 - - -; #X floatatom 633 290 5 0 0 0 - - -; #X obj 468 62 route del damp index_phi; #X floatatom 560 112 5 0 0 0 - - -; #X floatatom 601 112 5 0 0 0 - - -; #X floatatom 468 204 5 0 0 0 - - -; #X floatatom 510 204 5 0 0 0 - - -; #X floatatom 552 204 5 0 0 0 - - -; #X floatatom 595 204 5 0 0 0 - - -; #X floatatom 642 112 5 0 0 0 - - -; #X floatatom 683 112 5 0 0 0 - - -; #X obj 560 87 route 1 2 3 4 5 6 7 8; #X floatatom 724 112 5 0 0 0 - - -; #X floatatom 765 112 5 0 0 0 - - -; #X floatatom 806 112 5 0 0 0 - - -; #X floatatom 847 112 5 0 0 0 - - -; #X text 673 290 degree; #X text 587 379 ms; #X text 499 466 degree; #X text 409 508 ms; #X text 808 204 ms; #X obj 468 181 unpack 0 0 0 0 0 0 0 0; #X floatatom 637 204 5 0 0 0 - - -; #X floatatom 679 204 5 0 0 0 - - -; #X floatatom 721 204 5 0 0 0 - - -; #X floatatom 764 204 5 0 0 0 - - -; #X floatatom 514 156 5 0 0 0 - - -; #X floatatom 556 156 5 0 0 0 - - -; #X floatatom 598 156 5 0 0 0 - - -; #X floatatom 641 156 5 0 0 0 - - -; #X obj 514 133 unpack 0 0 0 0 0 0 0 0; #X floatatom 683 156 5 0 0 0 - - -; #X floatatom 725 156 5 0 0 0 - - -; #X floatatom 767 156 5 0 0 0 - - -; #X floatatom 810 156 5 0 0 0 - - -; #X text 885 110 degree; #X text 78 385 IEM KUG; #X text 62 373 musil; #X text 92 373 @; #X text 98 373 iem.at; #X text 61 395 Graz \, Austria; #X text 13 362 (c) Thomas Musil 2000 - 2006; #X text 163 81 sonic speed in meter per second; #X text 148 105 minimum raduis in meter; #X text 149 64 room dimensions in meter; #X text 237 250 object coordinates; #X text 194 174 subject coordinates; #X text 847 156 linear rms; #X text 629 338 linear rms; #X text 452 483 linear rms; #X text 684 378 |; #X text 684 386 |; #X text 684 394 |; #X text 684 402 |; #X text 720 378 |; #X text 720 386 |; #X text 720 394 |; #X text 720 402 |; #X text 756 378 |; #X text 756 386 |; #X text 756 394 |; #X text 756 402 |; #X text 792 378 |; #X text 792 386 |; #X text 792 394 |; #X text 792 402 |; #X text 828 378 |; #X text 828 386 |; #X text 828 394 |; #X text 828 402 |; #X text 768 322 + y; #X text 671 371 --+-----+-----+-----+-----+-----+--; #X text 864 378 |; #X text 864 386 |; #X text 864 394 |; #X text 864 402 |; #X text 684 416 |; #X text 684 424 |; #X text 684 432 |; #X text 684 440 |; #X text 720 416 |; #X text 720 424 |; #X text 720 432 |; #X text 720 440 |; #X text 756 416 |; #X text 756 424 |; #X text 756 432 |; #X text 756 440 |; #X text 792 416 |; #X text 792 424 |; #X text 792 432 |; #X text 792 440 |; #X text 828 416 |; #X text 828 424 |; #X text 828 432 |; #X text 828 440 |; #X text 671 409 --+-----+-----+-----+-----+-----+--; #X text 864 416 |; #X text 864 424 |; #X text 864 432 |; #X text 864 440 |; #X text 684 454 |; #X text 684 462 |; #X text 684 470 |; #X text 684 478 |; #X text 720 454 |; #X text 720 462 |; #X text 720 470 |; #X text 720 478 |; #X text 756 454 |; #X text 756 462 |; #X text 756 470 |; #X text 756 478 |; #X text 792 454 |; #X text 792 462 |; #X text 792 470 |; #X text 792 478 |; #X text 828 454 |; #X text 828 462 |; #X text 828 470 |; #X text 828 478 |; #X text 671 447 --+-----+-----+-----+-----+-----+--; #X text 864 454 |; #X text 864 462 |; #X text 864 470 |; #X text 864 478 |; #X text 684 492 |; #X text 684 500 |; #X text 684 508 |; #X text 684 516 |; #X text 720 492 |; #X text 720 500 |; #X text 720 508 |; #X text 720 516 |; #X text 756 492 |; #X text 756 500 |; #X text 756 508 |; #X text 756 516 |; #X text 792 492 |; #X text 792 500 |; #X text 792 508 |; #X text 792 516 |; #X text 828 492 |; #X text 828 500 |; #X text 828 508 |; #X text 828 516 |; #X text 671 485 --+-----+-----+-----+-----+-----+--; #X text 864 492 |; #X text 864 500 |; #X text 864 508 |; #X text 864 516 |; #X text 684 530 |; #X text 684 538 |; #X text 684 546 |; #X text 684 554 |; #X text 720 530 |; #X text 720 538 |; #X text 720 546 |; #X text 720 554 |; #X text 756 530 |; #X text 756 538 |; #X text 756 546 |; #X text 756 554 |; #X text 792 530 |; #X text 792 538 |; #X text 792 546 |; #X text 792 554 |; #X text 828 530 |; #X text 828 538 |; #X text 828 546 |; #X text 828 554 |; #X text 671 523 --+-----+-----+-----+-----+-----+--; #X text 864 530 |; #X text 864 538 |; #X text 864 546 |; #X text 864 554 |; #X text 671 561 --+-----+-----+-----+-----+-----+--; #X text 750 461 ___________________________; #X text 911 466 > + x; #X text 774 338 |; #X text 774 345 |; #X text 774 352 |; #X text 774 359 |; #X text 774 366 |; #X text 774 373 |; #X text 774 380 |; #X text 774 387 |; #X text 774 394 |; #X text 774 401 |; #X text 774 408 |; #X text 774 415 |; #X text 774 414 |; #X text 774 421 |; #X text 774 428 |; #X text 774 435 |; #X text 774 441 |; #X text 774 448 |; #X text 774 455 |; #X text 774 462 |; #X text 774 469 |; #X text 774 476 |; #X text 774 483 |; #X text 774 490 |; #X text 774 334 ^; #X text 799 474 e1_1; #X text 762 429 e1_2; #X text 728 474 e1_3; #X text 763 507 e1_4; #X text 835 474 e2_1; #X text 762 389 e2_2; #X text 692 474 e2_3; #X text 763 543 e2_4; #X text 800 429 e2_5; #X text 728 429 e2_8; #X text 728 505 e2_6; #X text 800 505 e2_7; #X text 767 474 d_1; #X text 799 246 d .. direct; #X text 794 258 e1 .. early 1; #X text 794 270 e2 .. early 2; #X text 793 345 mirror source rooms; #X msg 48 63 room_dim 20 10; #X text 564 6 renders the delay time \, the damping and the direction of direct \, early_1 and early_2 reflections in a cuboid room model (2 dimensional); #X connect 1 0 14 0; #X connect 1 0 17 0; #X connect 2 0 1 0; #X connect 3 0 1 0; #X connect 4 0 15 0; #X connect 5 0 4 0; #X connect 5 1 4 1; #X connect 6 0 4 0; #X connect 7 0 5 0; #X connect 9 0 16 0; #X connect 10 0 9 0; #X connect 10 1 9 1; #X connect 11 0 9 0; #X connect 12 0 10 0; #X connect 15 0 1 0; #X connect 16 0 1 0; #X connect 18 0 19 0; #X connect 19 0 20 0; #X connect 19 1 24 0; #X connect 19 2 41 0; #X connect 20 0 21 0; #X connect 20 1 22 0; #X connect 20 2 37 0; #X connect 24 0 27 0; #X connect 24 1 32 0; #X connect 24 2 38 0; #X connect 27 0 28 0; #X connect 27 1 29 0; #X connect 27 2 30 0; #X connect 27 3 31 0; #X connect 32 0 33 0; #X connect 32 1 34 0; #X connect 32 2 35 0; #X connect 32 3 36 0; #X connect 37 0 23 0; #X connect 38 0 25 0; #X connect 38 1 26 0; #X connect 38 2 39 0; #X connect 38 3 40 0; #X connect 41 0 60 0; #X connect 41 1 69 0; #X connect 41 2 50 0; #X connect 50 0 42 0; #X connect 50 1 43 0; #X connect 50 2 48 0; #X connect 50 3 49 0; #X connect 50 4 51 0; #X connect 50 5 52 0; #X connect 50 6 53 0; #X connect 50 7 54 0; #X connect 60 0 44 0; #X connect 60 1 45 0; #X connect 60 2 46 0; #X connect 60 3 47 0; #X connect 60 4 61 0; #X connect 60 5 62 0; #X connect 60 6 63 0; #X connect 60 7 64 0; #X connect 69 0 65 0; #X connect 69 1 66 0; #X connect 69 2 67 0; #X connect 69 3 68 0; #X connect 69 4 70 0; #X connect 69 5 71 0; #X connect 69 6 72 0; #X connect 69 7 73 0; #X connect 260 0 1 0; iem_utils-0.0.20240903/iem_roomsim/cart2del_damp_3d-help.pd0000600000000000000000000003571114665566711020074 0ustar00#N canvas 65 59 947 553 10; #X msg 28 87 sonic_speed 340; #X msg 36 108 r_ambi 1.4; #X obj 17 339 print; #X obj 65 340 s xxx; #X obj 307 27 r xxx; #X obj 307 49 route direct early1 early2; #X floatatom 307 520 5 0 0 0 - - -; #X floatatom 365 504 5 0 0 0 - - -; #X floatatom 423 487 5 0 0 0 - - -; #X floatatom 535 493 5 0 0 0 - - -; #X floatatom 555 512 5 0 0 0 - - -; #X floatatom 576 493 5 0 0 0 - - -; #X floatatom 596 512 5 0 0 0 - - -; #X obj 423 466 route 1; #X floatatom 318 270 5 0 0 0 - - -; #X floatatom 332 287 5 0 0 0 - - -; #X floatatom 347 304 5 0 0 0 - - -; #X floatatom 361 270 5 0 0 0 - - -; #X text 873 514 degree; #X text 659 495 ms; #X text 462 488 degree; #X text 344 520 ms; #X text 603 304 ms; #X floatatom 376 287 5 0 0 0 - - -; #X floatatom 390 304 5 0 0 0 - - -; #X floatatom 405 270 5 0 0 0 - - -; #X floatatom 419 287 5 0 0 0 - - -; #X text 15 7 cart2del_damp_3d; #X obj 17 314 cart2del_damp_3d; #X obj 172 261 t b f; #X floatatom 81 244 5 -20 20 0 - - -; #X floatatom 174 244 5 -20 20 0 - - -; #X obj 88 261 pack 0 0 0; #X obj 222 261 t b f; #X floatatom 224 244 5 0 30 0 - - -; #X text 147 224 m x m x m; #X obj 143 179 t b f; #X floatatom 52 162 5 -20 20 0 - - -; #X floatatom 145 162 5 -20 20 0 - - -; #X obj 59 179 pack 0 0 0; #X obj 193 179 t b f; #X floatatom 195 162 5 0 30 0 - - -; #X text 108 140 m x m x m; #X msg 88 282 src_xyz \$1 \$2 \$3; #X msg 59 200 head_xyz \$1 \$2 \$3; #X msg 17 66 room_dim 20 10 5; #X obj 322 72 route del damp index_theta_phi; #X obj 535 351 route del damp index_theta_phi; #X obj 307 445 route del damp index_theta_phi; #X obj 535 472 unpack 0 0 0 0 0 0; #X floatatom 617 493 5 0 0 0 - - -; #X floatatom 638 512 5 0 0 0 - - -; #X obj 753 398 route 1 2 3 4 5 6; #X floatatom 434 304 5 0 0 0 - - -; #X floatatom 448 270 5 0 0 0 - - -; #X floatatom 463 287 5 0 0 0 - - -; #X floatatom 477 304 5 0 0 0 - - -; #X floatatom 492 270 5 0 0 0 - - -; #X floatatom 506 287 5 0 0 0 - - -; #X floatatom 521 304 5 0 0 0 - - -; #X floatatom 535 270 5 0 0 0 - - -; #X floatatom 550 287 5 0 0 0 - - -; #X floatatom 565 304 5 0 0 0 - - -; #X obj 318 247 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X obj 378 102 route 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; #X text 90 404 IEM KUG; #X text 74 392 musil; #X text 104 392 @; #X text 110 392 iem.at; #X text 73 414 Graz \, Austria; #X text 25 381 (c) Thomas Musil 2000 - 2006; #X text 127 87 sonic speed in meter per second; #X text 111 108 minimum raduis in meter; #X text 118 68 room dimensions in meter; #X text 194 281 object coordinates; #X text 171 199 subject coordinates; #X text 594 658 |; #X text 594 666 |; #X text 594 674 |; #X text 594 682 |; #X text 630 658 |; #X text 630 666 |; #X text 630 674 |; #X text 630 682 |; #X text 666 658 |; #X text 666 666 |; #X text 666 674 |; #X text 666 682 |; #X text 702 658 |; #X text 702 666 |; #X text 702 674 |; #X text 702 682 |; #X text 738 658 |; #X text 738 666 |; #X text 738 674 |; #X text 738 682 |; #X text 678 602 + y; #X text 581 651 --+-----+-----+-----+-----+-----+--; #X text 774 658 |; #X text 774 666 |; #X text 774 674 |; #X text 774 682 |; #X text 594 696 |; #X text 594 704 |; #X text 594 712 |; #X text 594 720 |; #X text 630 696 |; #X text 630 704 |; #X text 630 712 |; #X text 630 720 |; #X text 666 696 |; #X text 666 704 |; #X text 666 712 |; #X text 666 720 |; #X text 702 696 |; #X text 702 704 |; #X text 702 712 |; #X text 702 720 |; #X text 738 696 |; #X text 738 704 |; #X text 738 712 |; #X text 738 720 |; #X text 581 689 --+-----+-----+-----+-----+-----+--; #X text 774 696 |; #X text 774 704 |; #X text 774 712 |; #X text 774 720 |; #X text 594 734 |; #X text 594 742 |; #X text 594 750 |; #X text 594 758 |; #X text 630 734 |; #X text 630 742 |; #X text 630 750 |; #X text 630 758 |; #X text 666 734 |; #X text 666 742 |; #X text 666 750 |; #X text 666 758 |; #X text 702 734 |; #X text 702 742 |; #X text 702 750 |; #X text 702 758 |; #X text 738 734 |; #X text 738 742 |; #X text 738 750 |; #X text 738 758 |; #X text 581 727 --+-----+-----+-----+-----+-----+--; #X text 774 734 |; #X text 774 742 |; #X text 774 750 |; #X text 774 758 |; #X text 594 772 |; #X text 594 780 |; #X text 594 788 |; #X text 594 796 |; #X text 630 772 |; #X text 630 780 |; #X text 630 788 |; #X text 630 796 |; #X text 666 772 |; #X text 666 780 |; #X text 666 788 |; #X text 666 796 |; #X text 702 772 |; #X text 702 780 |; #X text 702 788 |; #X text 702 796 |; #X text 738 772 |; #X text 738 780 |; #X text 738 788 |; #X text 738 796 |; #X text 581 765 --+-----+-----+-----+-----+-----+--; #X text 774 772 |; #X text 774 780 |; #X text 774 788 |; #X text 774 796 |; #X text 594 810 |; #X text 594 818 |; #X text 594 826 |; #X text 594 834 |; #X text 630 810 |; #X text 630 818 |; #X text 630 826 |; #X text 630 834 |; #X text 666 810 |; #X text 666 818 |; #X text 666 826 |; #X text 666 834 |; #X text 702 810 |; #X text 702 818 |; #X text 702 826 |; #X text 702 834 |; #X text 738 810 |; #X text 738 818 |; #X text 738 826 |; #X text 738 834 |; #X text 581 803 --+-----+-----+-----+-----+-----+--; #X text 774 810 |; #X text 774 818 |; #X text 774 826 |; #X text 774 834 |; #X text 581 841 --+-----+-----+-----+-----+-----+--; #X text 660 741 ___________________________; #X text 821 746 > + x; #X text 684 618 |; #X text 684 625 |; #X text 684 632 |; #X text 684 639 |; #X text 684 646 |; #X text 684 653 |; #X text 684 660 |; #X text 684 667 |; #X text 684 674 |; #X text 684 681 |; #X text 684 688 |; #X text 684 695 |; #X text 684 694 |; #X text 684 701 |; #X text 684 708 |; #X text 684 715 |; #X text 684 721 |; #X text 684 728 |; #X text 684 735 |; #X text 684 742 |; #X text 684 749 |; #X text 684 756 |; #X text 684 763 |; #X text 684 770 |; #X text 684 614 ^; #X text 709 754 e1_1; #X text 672 709 e1_2; #X text 745 754 e2_1; #X text 672 669 e2_2; #X text 677 758 d_1; #X text 239 738 d .. direct; #X text 234 750 e1 .. early 1; #X text 234 762 e2 .. early 2; #X text 710 630 mirror source rooms; #X text 400 504 linear rms; #X floatatom 545 397 5 0 0 0 - - -; #X floatatom 565 416 5 0 0 0 - - -; #X floatatom 586 397 5 0 0 0 - - -; #X floatatom 606 416 5 0 0 0 - - -; #X obj 545 376 unpack 0 0 0 0 0 0; #X floatatom 627 397 5 0 0 0 - - -; #X floatatom 648 416 5 0 0 0 - - -; #X text 665 396 linear rms; #X obj 753 420 unpack; #X floatatom 753 457 5 0 0 0 - - -; #X floatatom 761 440 5 0 0 0 - - -; #X obj 769 477 unpack; #X floatatom 769 514 5 0 0 0 - - -; #X floatatom 777 497 5 0 0 0 - - -; #X obj 785 420 unpack; #X floatatom 785 457 5 0 0 0 - - -; #X floatatom 793 440 5 0 0 0 - - -; #X obj 801 477 unpack; #X floatatom 801 514 5 0 0 0 - - -; #X floatatom 809 497 5 0 0 0 - - -; #X obj 817 420 unpack; #X floatatom 817 457 5 0 0 0 - - -; #X floatatom 825 440 5 0 0 0 - - -; #X obj 833 477 unpack; #X floatatom 833 514 5 0 0 0 - - -; #X floatatom 841 497 5 0 0 0 - - -; #X text 879 497 degree; #X text 857 456 degree; #X text 863 439 degree; #X text 694 456 elevation; #X text 706 440 azimuth; #X text 709 512 elevation; #X text 723 495 azimuth; #X floatatom 617 275 5 0 0 0 - - -; #X floatatom 631 292 5 0 0 0 - - -; #X floatatom 646 309 5 0 0 0 - - -; #X floatatom 660 275 5 0 0 0 - - -; #X floatatom 675 292 5 0 0 0 - - -; #X floatatom 689 309 5 0 0 0 - - -; #X floatatom 704 275 5 0 0 0 - - -; #X floatatom 718 292 5 0 0 0 - - -; #X floatatom 733 309 5 0 0 0 - - -; #X floatatom 747 275 5 0 0 0 - - -; #X floatatom 762 292 5 0 0 0 - - -; #X floatatom 776 309 5 0 0 0 - - -; #X floatatom 791 275 5 0 0 0 - - -; #X floatatom 805 292 5 0 0 0 - - -; #X floatatom 820 309 5 0 0 0 - - -; #X floatatom 834 275 5 0 0 0 - - -; #X floatatom 849 292 5 0 0 0 - - -; #X floatatom 864 309 5 0 0 0 - - -; #X obj 617 252 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X text 872 273 linear rms; #X obj 378 124 unpack; #X floatatom 378 161 5 0 0 0 - - -; #X floatatom 386 144 5 0 0 0 - - -; #X obj 410 124 unpack; #X floatatom 410 161 5 0 0 0 - - -; #X floatatom 418 144 5 0 0 0 - - -; #X obj 443 124 unpack; #X floatatom 443 161 5 0 0 0 - - -; #X floatatom 451 144 5 0 0 0 - - -; #X obj 394 181 unpack; #X floatatom 394 218 5 0 0 0 - - -; #X floatatom 402 201 5 0 0 0 - - -; #X obj 427 181 unpack; #X floatatom 427 218 5 0 0 0 - - -; #X floatatom 435 201 5 0 0 0 - - -; #X obj 459 181 unpack; #X floatatom 459 218 5 0 0 0 - - -; #X floatatom 467 201 5 0 0 0 - - -; #X obj 477 124 unpack; #X floatatom 477 161 5 0 0 0 - - -; #X floatatom 485 144 5 0 0 0 - - -; #X obj 509 124 unpack; #X floatatom 509 161 5 0 0 0 - - -; #X floatatom 517 144 5 0 0 0 - - -; #X obj 542 124 unpack; #X floatatom 542 161 5 0 0 0 - - -; #X floatatom 550 144 5 0 0 0 - - -; #X obj 493 181 unpack; #X floatatom 493 218 5 0 0 0 - - -; #X floatatom 501 201 5 0 0 0 - - -; #X obj 526 181 unpack; #X floatatom 526 218 5 0 0 0 - - -; #X floatatom 534 201 5 0 0 0 - - -; #X obj 558 181 unpack; #X floatatom 558 218 5 0 0 0 - - -; #X floatatom 566 201 5 0 0 0 - - -; #X obj 577 124 unpack; #X floatatom 577 161 5 0 0 0 - - -; #X floatatom 585 144 5 0 0 0 - - -; #X obj 609 124 unpack; #X floatatom 609 161 5 0 0 0 - - -; #X floatatom 617 144 5 0 0 0 - - -; #X obj 642 124 unpack; #X floatatom 642 161 5 0 0 0 - - -; #X floatatom 650 144 5 0 0 0 - - -; #X obj 593 181 unpack; #X floatatom 593 218 5 0 0 0 - - -; #X floatatom 601 201 5 0 0 0 - - -; #X obj 626 181 unpack; #X floatatom 626 218 5 0 0 0 - - -; #X floatatom 634 201 5 0 0 0 - - -; #X obj 658 181 unpack; #X floatatom 658 218 5 0 0 0 - - -; #X floatatom 666 201 5 0 0 0 - - -; #X text 694 218 degree; #X text 700 201 degree; #X text 678 160 degree; #X text 684 143 degree; #X text 319 160 elevation; #X text 331 144 azimuth; #X text 334 216 elevation; #X text 348 199 azimuth; #X text 564 6 renders the delay time \, the damping and the direction of direct \, early_1 and early_2 reflections in a cuboid room model (3 dimensional); #X text 679 746 (; #X text 689 746 ); #X text 684 741 -; #X text 684 751 -; #X text 687 740 .; #X text 682 740 .; #X text 682 748 .; #X text 687 748 .; #X text 685 744 .; #X text 684 744 .; #X text 684 745 .; #X text 685 745 .; #X text 685 743 .; #X text 684 743 .; #X text 689 737 +z; #X text 683 743 .; #X text 683 744 .; #X text 683 745 .; #X text 72 500 e2_3; #X text 74 560 e1_3; #X text 107 560 e2_8; #X text 74 543 e2_9; #X text 36 562 e2_17; #X text 74 579 e2_18; #X text 77 651 d_1; #X text 110 651 e1_1; #X text 77 634 e1_2; #X text 77 670 e1_5; #X text 39 653 e1_4; #X text 143 650 e2_1; #X text 75 619 e2_2; #X text 8 653 e2_4; #X text 78 685 e2_5; #X text 110 633 e2_7; #X text 36 670 e2_10; #X text 108 669 e2_13; #X text 37 636 e2_16; #X text 494 638 z-axe shows out of the display; #X text 78 745 e1_6; #X text 40 747 e2_11; #X text 78 764 e2_12; #X text 111 745 e2_14; #X text 78 728 e2_15; #X text 82 808 e2_6; #X text 635 708 e2_16; #X text 710 709 e2_7; #X text 638 754 e1_4; #X text 601 754 e2_4; #X text 635 786 e2_10; #X text 673 787 e1_5; #X text 708 786 e2_13; #X text 673 823 e2_5; #X text 70 851 bottom (-z); #X text 69 463 top (+z); #X text 489 656 shows only; #X text 487 676 the x/y-plane; #X text 52 449 mirror source rooms (3D); #X connect 0 0 28 0; #X connect 1 0 28 0; #X connect 4 0 5 0; #X connect 5 0 48 0; #X connect 5 1 47 0; #X connect 5 2 46 0; #X connect 13 0 8 0; #X connect 28 0 2 0; #X connect 28 0 3 0; #X connect 29 0 32 0; #X connect 29 1 32 1; #X connect 30 0 32 0; #X connect 31 0 29 0; #X connect 32 0 43 0; #X connect 33 0 32 0; #X connect 33 1 32 2; #X connect 34 0 33 0; #X connect 36 0 39 0; #X connect 36 1 39 1; #X connect 37 0 39 0; #X connect 38 0 36 0; #X connect 39 0 44 0; #X connect 40 0 39 0; #X connect 40 1 39 2; #X connect 41 0 40 0; #X connect 43 0 28 0; #X connect 44 0 28 0; #X connect 45 0 28 0; #X connect 46 0 63 0; #X connect 46 1 291 0; #X connect 46 2 64 0; #X connect 47 0 49 0; #X connect 47 1 244 0; #X connect 47 2 52 0; #X connect 48 0 6 0; #X connect 48 1 7 0; #X connect 48 2 13 0; #X connect 49 0 9 0; #X connect 49 1 10 0; #X connect 49 2 11 0; #X connect 49 3 12 0; #X connect 49 4 50 0; #X connect 49 5 51 0; #X connect 52 0 248 0; #X connect 52 1 251 0; #X connect 52 2 254 0; #X connect 52 3 257 0; #X connect 52 4 260 0; #X connect 52 5 263 0; #X connect 63 0 14 0; #X connect 63 1 15 0; #X connect 63 2 16 0; #X connect 63 3 17 0; #X connect 63 4 23 0; #X connect 63 5 24 0; #X connect 63 6 25 0; #X connect 63 7 26 0; #X connect 63 8 53 0; #X connect 63 9 54 0; #X connect 63 10 55 0; #X connect 63 11 56 0; #X connect 63 12 57 0; #X connect 63 13 58 0; #X connect 63 14 59 0; #X connect 63 15 60 0; #X connect 63 16 61 0; #X connect 63 17 62 0; #X connect 64 0 293 0; #X connect 64 1 302 0; #X connect 64 2 296 0; #X connect 64 3 305 0; #X connect 64 4 299 0; #X connect 64 5 308 0; #X connect 64 6 311 0; #X connect 64 7 320 0; #X connect 64 8 314 0; #X connect 64 9 323 0; #X connect 64 10 317 0; #X connect 64 11 326 0; #X connect 64 12 329 0; #X connect 64 13 338 0; #X connect 64 14 332 0; #X connect 64 15 341 0; #X connect 64 16 335 0; #X connect 64 17 344 0; #X connect 244 0 240 0; #X connect 244 1 241 0; #X connect 244 2 242 0; #X connect 244 3 243 0; #X connect 244 4 245 0; #X connect 244 5 246 0; #X connect 248 0 249 0; #X connect 248 1 250 0; #X connect 251 0 252 0; #X connect 251 1 253 0; #X connect 254 0 255 0; #X connect 254 1 256 0; #X connect 257 0 258 0; #X connect 257 1 259 0; #X connect 260 0 261 0; #X connect 260 1 262 0; #X connect 263 0 264 0; #X connect 263 1 265 0; #X connect 291 0 273 0; #X connect 291 1 274 0; #X connect 291 2 275 0; #X connect 291 3 276 0; #X connect 291 4 277 0; #X connect 291 5 278 0; #X connect 291 6 279 0; #X connect 291 7 280 0; #X connect 291 8 281 0; #X connect 291 9 282 0; #X connect 291 10 283 0; #X connect 291 11 284 0; #X connect 291 12 285 0; #X connect 291 13 286 0; #X connect 291 14 287 0; #X connect 291 15 288 0; #X connect 291 16 289 0; #X connect 291 17 290 0; #X connect 293 0 294 0; #X connect 293 1 295 0; #X connect 296 0 297 0; #X connect 296 1 298 0; #X connect 299 0 300 0; #X connect 299 1 301 0; #X connect 302 0 303 0; #X connect 302 1 304 0; #X connect 305 0 306 0; #X connect 305 1 307 0; #X connect 308 0 309 0; #X connect 308 1 310 0; #X connect 311 0 312 0; #X connect 311 1 313 0; #X connect 314 0 315 0; #X connect 314 1 316 0; #X connect 317 0 318 0; #X connect 317 1 319 0; #X connect 320 0 321 0; #X connect 320 1 322 0; #X connect 323 0 324 0; #X connect 323 1 325 0; #X connect 326 0 327 0; #X connect 326 1 328 0; #X connect 329 0 330 0; #X connect 329 1 331 0; #X connect 332 0 333 0; #X connect 332 1 334 0; #X connect 335 0 336 0; #X connect 335 1 337 0; #X connect 338 0 339 0; #X connect 338 1 340 0; #X connect 341 0 342 0; #X connect 341 1 343 0; #X connect 344 0 345 0; #X connect 344 1 346 0; iem_utils-0.0.20240903/iem_roomsim/include/0000700000000000000000000000000014665566711015144 5ustar00iem_utils-0.0.20240903/iem_roomsim/include/iem_roomsim.h0000600000000000000000000000046614665566711017644 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #ifndef __IEMROOMSIM_H__ #define __IEMROOMSIM_H__ #define DELLINE_DEF_VEC_SIZE 64 #endif iem_utils-0.0.20240903/iem_roomsim/include/iemlib.h0000600000000000000000000001360714665566711016567 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2018 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) #ifdef _WIN32 //t_symbol *iemgui_key_sym=0; #include #else //extern t_symbol *iemgui_key_sym; #include #endif extern int sys_noloadbang; //millers m_pd.h beg /* Microsoft Visual Studio is not C99, it does not provide stdint.h */ #ifdef _MSC_VER typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else # include #endif #if !defined(PD_FLOATSIZE) /* if compiled pd version < 0.47*/ # define PD_FLOATSIZE 32 #endif typedef union { float f; unsigned int ui; }t_iemdenormal_f; typedef union { double f; unsigned int ui[2]; }t_iemdenormal_d; #ifndef _MSC_VER /* Micrsoft compiler can't handle "inline" function/macros */ #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) /* a test for NANs and denormals. Should only be necessary on x86 variants. */ /* on arm, the impact is less noticeable, but...why not? */ static inline int IEM_DENORMAL_F(float f) /* malformed float 32 */ { t_iemdenormal_f pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } static inline int IEM_DENORMAL_D(double f) /* malformed double 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 typedef union { t_float f; unsigned int ui; }t_iemdenormal_t32; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 32 */ { t_iemdenormal_t32 pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } #elif PD_FLOATSIZE == 64 typedef union { t_float f; unsigned int ui[2]; }t_iemdenormal_t64; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif /* PD_FLOATSIZE */ #else /* not INTEL or ARM */ #define IEM_DENORMAL_T(f) 0 #define IEM_DENORMAL_D(f) 0 #endif #else /* _MSC_VER */ #define IEM_DENORMAL_F(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) static int IEM_DENORMAL_D(double f) /* malformed t_float 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 #define IEM_DENORMAL_T(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) #else /* 64 bits... don't know what to do here */ //#define IEM_DENORMAL_T(f) (!(((f) >= 0) || ((f) <= 0))) int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif #endif /* _MSC_VER */ //millers m_pd.h end /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #ifndef BUILD_DATE # define BUILD_DATE "" __DATE__ " : " __TIME__ #endif #if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43) # define iem_open sys_open # define iem_close sys_close # define iem_fopen sys_fopen # define iem_fclose sys_fclose #else # define iem_open open # define iem_close close # define iem_fopen fopen # define iem_fclose fclose #endif // millers d_osc.c beg #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) \ || defined(__OpenBSD__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \ defined(ANDROID) #include #endif #ifdef __MINGW32__ #include #endif #ifdef _MSC_VER /* _MSVC lacks BYTE_ORDER and LITTLE_ENDIAN */ #define LITTLE_ENDIAN 0x0001 #define BYTE_ORDER LITTLE_ENDIAN #endif #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 #else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ #endif union tabfudge { double tf_d; int32_t tf_i[2]; }; // millers d_osc.c end // millers d_delay.c beg #define IEMDEFDELVS 64 #define IEMXTRASAMPS 4 #define IEMSAMPBLK 4 // millers d_delay.c end #endif iem_utils-0.0.20240903/iem_roomsim/n_delay1p_line~-help.pd0000600000000000000000000001521214665566711020060 0ustar00#N canvas 22 22 973 526 10; #X msg 454 136 100; #X msg 489 139 1000; #X msg 532 139 3000; #X obj 305 182 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array array101 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 186 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array array102 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 256 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array array103 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 326 graph; #X obj 203 309 tabwrite~ array101; #X obj 250 355 tabwrite~ array103; #X obj 225 332 tabwrite~ array102; #N canvas 0 22 450 300 (subpatch) 0; #X array array100 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 116 graph; #X obj 304 254 tabwrite~ array100; #X obj 202 283 n_delay1p_line~ 3 5 100; #X text 21 13 n_delay1p_line~; #N canvas 0 22 450 300 dirac 0; #X obj 103 44 inlet; #X obj 103 65 t b b; #X obj 71 100 del 2; #X msg 126 112 1; #X msg 70 122 0; #X obj 92 151 biquad~ 0 0 1 -1 0; #X obj 92 176 max~ 0; #X obj 92 197 outlet~; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 4 0; #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X restore 212 222 pd dirac; #X text 113 442 IEM KUG; #X text 87 430 musil; #X text 125 430 @; #X text 133 430 iem.at; #X text 96 452 Graz \, Austria; #X text 46 419 (c) Thomas Musil 2000 - 2011; #X obj 24 46 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 24 110 5 0 0 0 - - -; #X floatatom 42 93 5 0 0 0 - - -; #N canvas 0 22 528 567 dsp 0; #X obj 20 65 inlet; #X obj 20 406 outlet; #X msg 31 88 \; pd dsp \$1; #X obj 20 199 cputime; #X obj 20 178 t b b; #X text 15 11 dsp; #X text 59 65 1/0 = ON/OFF; #X text 97 313 CPU-load; #X obj 62 126 loadbang; #X obj 20 126 sel 1; #X text 64 12 turn dsp-kernel on & off \,; #X obj 20 240 t f f; #X obj 211 405 outlet; #X text 65 408 average; #X text 177 405 peak; #X obj 211 154 f; #X obj 146 179 > -1; #X obj 169 155 f -1; #X obj 179 91 t f b f; #X obj 146 204 sel 1; #X obj 192 132 f -1; #X obj 20 154 metro 500; #X obj 20 220 * 0.2; #X text 74 37 -dsp-load in %; #X text 65 24 measure average- and peak-; #X obj 20 292 1p1z 0.1 0 0.9; #X obj 20 315 * 100; #X obj 20 360 int; #X obj 20 338 + 0.499; #X obj 20 383 * 0.01; #X obj 246 207 r pd; #X obj 246 231 route dsp; #X text 245 318 to toggle input; #X msg 246 283 \; dsp_tgl set \$1; #X obj 247 341 r dsp_tgl; #X obj 246 257 route float; #X obj 146 227 del 3990; #X text 179 455 IEM KUG; #X text 153 443 musil; #X text 190 443 @; #X text 199 443 iem.at; #X text 162 465 Graz \, Austria; #X msg 275 108 \; pd audio-dialog 0 0 0 0 64 0 0 0 0 0 0 0 64 0 0 0 44100 \$1; #X obj 275 81 inlet; #X text 271 56 system delay time in ms; #N canvas 0 22 486 468 once 0; #X obj 89 162 spigot; #X obj 34 59 inlet; #X obj 89 111 t a b; #X obj 126 140 f 1; #X obj 89 194 t a b; #X obj 119 216 f 0; #X obj 89 247 outlet; #X obj 207 56 inlet; #X obj 207 79 bang; #X obj 207 102 f 1; #X text 8 6 once; #X text 64 7 only the first message passes through; #X text 29 37 message in; #X text 29 289 message out (only once); #X text 203 36 anything to init once; #X obj 34 80 route bang; #X obj 34 110 t b b; #X obj 34 162 spigot; #X obj 34 194 t b b; #X text 98 377 IEM KUG; #X text 73 363 musil; #X text 110 365 @; #X text 118 365 iem.at; #X text 81 387 Graz \, Austria; #X text 120 339 @; #X text 128 339 iem.at; #X text 33 338 (c) zmoelnig; #X text 33 352 (c) Thomas Musil 2000 - 2011; #X connect 0 0 4 0; #X connect 1 0 15 0; #X connect 2 0 0 0; #X connect 2 1 3 0; #X connect 3 0 0 1; #X connect 3 0 17 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 3 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 9 0 3 1; #X connect 15 0 16 0; #X connect 15 1 2 0; #X connect 16 0 17 0; #X connect 16 1 3 0; #X connect 17 0 18 0; #X connect 18 0 6 0; #X connect 18 1 5 0; #X restore 69 270 pd once; #X text 112 430 (c) Thomas Musil 2000 - 2011; #X connect 0 0 2 0; #X connect 0 0 9 0; #X connect 3 0 22 0; #X connect 4 0 3 0; #X connect 4 1 3 1; #X connect 8 0 21 0; #X connect 9 0 21 0; #X connect 11 0 25 0; #X connect 11 1 45 0; #X connect 15 0 17 1; #X connect 15 0 12 0; #X connect 16 0 19 0; #X connect 17 0 16 1; #X connect 18 0 16 0; #X connect 18 1 17 0; #X connect 18 2 15 1; #X connect 19 0 15 0; #X connect 19 0 36 0; #X connect 20 0 17 1; #X connect 21 0 4 0; #X connect 22 0 11 0; #X connect 22 0 18 0; #X connect 25 0 26 0; #X connect 26 0 28 0; #X connect 27 0 29 0; #X connect 28 0 27 0; #X connect 29 0 1 0; #X connect 30 0 31 0; #X connect 31 0 35 0; #X connect 35 0 33 0; #X connect 36 0 20 0; #X connect 43 0 42 0; #X connect 45 0 25 5; #X connect 45 0 25 4; #X restore 24 69 pd dsp; #X text 161 12 One signal inlet and n delay tap outlets. Delay times change every sample without interpolation and are given in ms.; #X text 420 465 3.) initial argument: interpolation time in ms; #X text 421 449 2.) inital argument: maximum delay time in ms; #X text 421 433 1.) inital argument: number of delay taps = outlets; #X msg 428 194 time \$1; #X floatatom 428 168 5 0 0 0 - - -; #X msg 420 137 0; #X text 20 146 of n delay times in ms; #X text 472 174 interpolation time in ms; #X msg 96 165 0.1 0.2 0.3; #X msg 76 190 1.8 1.7 1.6; #X obj 299 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 300 117 sel 0 1; #X obj 300 92 t f b; #X msg 578 136 6000; #N canvas 0 22 472 410 del_chain 0; #X obj 158 58 inlet; #X obj 128 341 outlet; #X obj 207 86 del 10; #X obj 207 106 del 990; #X obj 207 127 del 990; #X obj 207 148 del 990; #X obj 207 169 del 990; #X obj 207 190 del 990; #X obj 207 211 del 990; #X obj 207 233 del 990; #X obj 207 254 del 990; #X connect 0 0 2 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 4 0; #X connect 3 0 1 0; #X connect 4 0 5 0; #X connect 4 0 1 0; #X connect 5 0 6 0; #X connect 5 0 1 0; #X connect 6 0 7 0; #X connect 6 0 1 0; #X connect 7 0 8 0; #X connect 7 0 1 0; #X connect 8 0 1 0; #X connect 8 0 9 0; #X connect 9 0 10 0; #X connect 9 0 1 0; #X connect 10 0 1 0; #X restore 326 154 pd del_chain; #X connect 0 0 30 0; #X connect 1 0 30 0; #X connect 2 0 30 0; #X connect 3 0 7 0; #X connect 3 0 9 0; #X connect 3 0 8 0; #X connect 3 0 11 0; #X connect 3 0 14 0; #X connect 12 0 7 0; #X connect 12 1 9 0; #X connect 12 2 8 0; #X connect 14 0 12 0; #X connect 14 0 11 0; #X connect 21 0 24 0; #X connect 24 0 22 0; #X connect 24 1 23 0; #X connect 29 0 12 0; #X connect 30 0 29 0; #X connect 31 0 30 0; #X connect 34 0 12 0; #X connect 35 0 12 0; #X connect 36 0 38 0; #X connect 37 0 34 0; #X connect 37 1 35 0; #X connect 38 0 37 0; #X connect 38 1 39 0; #X connect 38 1 40 0; #X connect 39 0 30 0; #X connect 40 0 3 0; iem_utils-0.0.20240903/iem_roomsim/n_delay2p_line~-help.pd0000600000000000000000000001522214665566711020062 0ustar00#N canvas 22 22 973 526 10; #X msg 454 136 100; #X msg 489 139 1000; #X msg 532 139 3000; #X obj 305 182 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array array101 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 186 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array array102 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 256 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array array103 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 326 graph; #X obj 203 309 tabwrite~ array101; #X obj 250 355 tabwrite~ array103; #X obj 225 332 tabwrite~ array102; #N canvas 0 22 450 300 (subpatch) 0; #X array array100 100 float 0; #X coords 0 1.1 99 -0.1 100 50 1; #X restore 845 116 graph; #X obj 304 254 tabwrite~ array100; #N canvas 0 22 450 300 dirac 0; #X obj 103 44 inlet; #X obj 103 65 t b b; #X obj 71 100 del 2; #X msg 126 112 1; #X msg 70 122 0; #X obj 92 151 biquad~ 0 0 1 -1 0; #X obj 92 176 max~ 0; #X obj 92 197 outlet~; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 4 0; #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X restore 212 222 pd dirac; #X text 113 442 IEM KUG; #X text 87 430 musil; #X text 125 430 @; #X text 133 430 iem.at; #X text 96 452 Graz \, Austria; #X text 46 419 (c) Thomas Musil 2000 - 2011; #X obj 24 46 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 24 110 5 0 0 0 - - -; #X floatatom 42 93 5 0 0 0 - - -; #N canvas 0 22 528 567 dsp 0; #X obj 20 65 inlet; #X obj 20 406 outlet; #X msg 31 88 \; pd dsp \$1; #X obj 20 199 cputime; #X obj 20 178 t b b; #X text 15 11 dsp; #X text 59 65 1/0 = ON/OFF; #X text 97 313 CPU-load; #X obj 62 126 loadbang; #X obj 20 126 sel 1; #X text 64 12 turn dsp-kernel on & off \,; #X obj 20 240 t f f; #X obj 211 405 outlet; #X text 65 408 average; #X text 177 405 peak; #X obj 211 154 f; #X obj 146 179 > -1; #X obj 169 155 f -1; #X obj 179 91 t f b f; #X obj 146 204 sel 1; #X obj 192 132 f -1; #X obj 20 154 metro 500; #X obj 20 220 * 0.2; #X text 74 37 -dsp-load in %; #X text 65 24 measure average- and peak-; #X obj 20 292 1p1z 0.1 0 0.9; #X obj 20 315 * 100; #X obj 20 360 int; #X obj 20 338 + 0.499; #X obj 20 383 * 0.01; #X obj 246 207 r pd; #X obj 246 231 route dsp; #X text 245 318 to toggle input; #X msg 246 283 \; dsp_tgl set \$1; #X obj 247 341 r dsp_tgl; #X obj 246 257 route float; #X obj 146 227 del 3990; #X text 179 455 IEM KUG; #X text 153 443 musil; #X text 190 443 @; #X text 199 443 iem.at; #X text 162 465 Graz \, Austria; #X msg 275 108 \; pd audio-dialog 0 0 0 0 64 0 0 0 0 0 0 0 64 0 0 0 44100 \$1; #X obj 275 81 inlet; #X text 271 56 system delay time in ms; #N canvas 0 22 486 468 once 0; #X obj 89 162 spigot; #X obj 34 59 inlet; #X obj 89 111 t a b; #X obj 126 140 f 1; #X obj 89 194 t a b; #X obj 119 216 f 0; #X obj 89 247 outlet; #X obj 207 56 inlet; #X obj 207 79 bang; #X obj 207 102 f 1; #X text 8 6 once; #X text 64 7 only the first message passes through; #X text 29 37 message in; #X text 29 289 message out (only once); #X text 203 36 anything to init once; #X obj 34 80 route bang; #X obj 34 110 t b b; #X obj 34 162 spigot; #X obj 34 194 t b b; #X text 98 377 IEM KUG; #X text 73 363 musil; #X text 110 365 @; #X text 118 365 iem.at; #X text 81 387 Graz \, Austria; #X text 120 339 @; #X text 128 339 iem.at; #X text 33 338 (c) zmoelnig; #X text 33 352 (c) Thomas Musil 2000 - 2011; #X connect 0 0 4 0; #X connect 1 0 15 0; #X connect 2 0 0 0; #X connect 2 1 3 0; #X connect 3 0 0 1; #X connect 3 0 17 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 3 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 9 0 3 1; #X connect 15 0 16 0; #X connect 15 1 2 0; #X connect 16 0 17 0; #X connect 16 1 3 0; #X connect 17 0 18 0; #X connect 18 0 6 0; #X connect 18 1 5 0; #X restore 69 270 pd once; #X text 112 430 (c) Thomas Musil 2000 - 2011; #X connect 0 0 2 0; #X connect 0 0 9 0; #X connect 3 0 22 0; #X connect 4 0 3 0; #X connect 4 1 3 1; #X connect 8 0 21 0; #X connect 9 0 21 0; #X connect 11 0 25 0; #X connect 11 1 45 0; #X connect 15 0 17 1; #X connect 15 0 12 0; #X connect 16 0 19 0; #X connect 17 0 16 1; #X connect 18 0 16 0; #X connect 18 1 17 0; #X connect 18 2 15 1; #X connect 19 0 15 0; #X connect 19 0 36 0; #X connect 20 0 17 1; #X connect 21 0 4 0; #X connect 22 0 11 0; #X connect 22 0 18 0; #X connect 25 0 26 0; #X connect 26 0 28 0; #X connect 27 0 29 0; #X connect 28 0 27 0; #X connect 29 0 1 0; #X connect 30 0 31 0; #X connect 31 0 35 0; #X connect 35 0 33 0; #X connect 36 0 20 0; #X connect 43 0 42 0; #X connect 45 0 25 5; #X connect 45 0 25 4; #X restore 24 69 pd dsp; #X text 420 465 3.) initial argument: interpolation time in ms; #X text 421 449 2.) inital argument: maximum delay time in ms; #X text 421 433 1.) inital argument: number of delay taps = outlets; #X msg 428 194 time \$1; #X floatatom 428 168 5 0 0 0 - - -; #X msg 420 137 0; #X text 20 146 of n delay times in ms; #X text 472 174 interpolation time in ms; #X msg 96 165 0.1 0.2 0.3; #X msg 76 190 1.8 1.7 1.6; #X obj 299 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 300 117 sel 0 1; #X obj 300 92 t f b; #X msg 578 136 6000; #N canvas 0 22 472 410 del_chain 0; #X obj 158 58 inlet; #X obj 128 341 outlet; #X obj 207 86 del 10; #X obj 207 106 del 990; #X obj 207 127 del 990; #X obj 207 148 del 990; #X obj 207 169 del 990; #X obj 207 190 del 990; #X obj 207 211 del 990; #X obj 207 233 del 990; #X obj 207 254 del 990; #X connect 0 0 2 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 4 0; #X connect 3 0 1 0; #X connect 4 0 5 0; #X connect 4 0 1 0; #X connect 5 0 6 0; #X connect 5 0 1 0; #X connect 6 0 7 0; #X connect 6 0 1 0; #X connect 7 0 8 0; #X connect 7 0 1 0; #X connect 8 0 1 0; #X connect 8 0 9 0; #X connect 9 0 10 0; #X connect 9 0 1 0; #X connect 10 0 1 0; #X restore 326 154 pd del_chain; #X text 21 13 n_delay2p_line~; #X obj 202 283 n_delay2p_line~ 3 5 100; #X text 161 12 One signal inlet and n delay tap outlets. Delay times change every sample with a 2-point interpolation and are given in ms. ; #X connect 0 0 27 0; #X connect 1 0 27 0; #X connect 2 0 27 0; #X connect 3 0 7 0; #X connect 3 0 9 0; #X connect 3 0 8 0; #X connect 3 0 11 0; #X connect 3 0 12 0; #X connect 12 0 11 0; #X connect 12 0 39 0; #X connect 19 0 22 0; #X connect 22 0 20 0; #X connect 22 1 21 0; #X connect 26 0 39 0; #X connect 27 0 26 0; #X connect 28 0 27 0; #X connect 31 0 39 0; #X connect 32 0 39 0; #X connect 33 0 35 0; #X connect 34 0 31 0; #X connect 34 1 32 0; #X connect 35 0 34 0; #X connect 35 1 36 0; #X connect 35 1 37 0; #X connect 36 0 27 0; #X connect 37 0 3 0; #X connect 39 0 7 0; #X connect 39 1 9 0; #X connect 39 2 8 0; iem_utils-0.0.20240903/iem_roomsim/pd-lib-builder/0000700000000000000000000000000014665566711016314 5ustar00iem_utils-0.0.20240903/iem_roomsim/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711020350 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/iem_roomsim/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711022424 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/iem_roomsim/pd-lib-builder/README.md0000600000000000000000000001314614665566711017602 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/iem_roomsim/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711021110 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/iem_roomsim/src/0000700000000000000000000000000014665566711014310 5ustar00iem_utils-0.0.20240903/iem_roomsim/src/VC6/0000700000000000000000000000000014665566711014706 5ustar00iem_utils-0.0.20240903/iem_roomsim/src/VC6/iem_roomsim.dsp0000600000000000000000000000505114665566711017740 0ustar00# Microsoft Developer Studio Project File - Name="iem_roomsim" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_roomsim - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak" CFG="iem_roomsim - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_roomsim - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_roomsim - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_roomsim - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_roomsim - Win32 Release" # Name "iem_roomsim - Win32 Debug" !IF "$(CFG)" == "iem_roomsim - Win32 Release" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_roomsim/src/VC6/iem_roomsim.dsw0000600000000000000000000000107514665566711017751 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_roomsim"=.\iem_roomsim.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_roomsim/src/VC6/makefile_win0000600000000000000000000000202014665566711017257 0ustar00 all: ..\iem_roomsim.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_roomsim.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_roomsim_setup \ /out:..\iem_roomsim.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_roomsim/src/VC7/0000700000000000000000000000000014665566711014707 5ustar00iem_utils-0.0.20240903/iem_roomsim/src/VC7/iem_roomsim.vcproj0000600000000000000000000000244114665566711020456 0ustar00 iem_utils-0.0.20240903/iem_roomsim/src/VC7/makefile_vc7proj0000600000000000000000000000200314665566711020056 0ustar00TARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_roomsim/src/VC9/0000700000000000000000000000000014665566711014711 5ustar00iem_utils-0.0.20240903/iem_roomsim/src/VC9/iem_roomsim.sln0000600000000000000000000000156714665566711017761 0ustar00 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_roomsim", "iem_roomsim.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_roomsim/src/VC9/iem_roomsim.vcproj0000600000000000000000000000360514665566711020463 0ustar00 iem_utils-0.0.20240903/iem_roomsim/src/VC9/makefile_vc9proj0000600000000000000000000000176114665566711020074 0ustar00TARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_roomsim/src/block_delay~.c0000600000000000000000000000603514665566711017130 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include "iem_roomsim.h" /* -------------------------- block_delay~ ------------------------------ */ /* ----------------- delys a signal by blocksize samples ---------------- */ static t_class *block_delay_tilde_class; typedef struct _block_delay_tilde { t_object x_obj; t_sample *x_begmem; int x_blocksize; t_float x_scalar_sig_in; } t_block_delay_tilde; static t_int *block_delay_tilde_perform(t_int *w) { t_sample *in = (float *)(w[1]); t_sample *out = (float *)(w[2]); t_block_delay_tilde *x = (t_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_sample *rw_vec, f; rw_vec = x->x_begmem; for(i=0; ix_begmem; while(n) { f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; out[0] = rw_vec[0]; out[1] = rw_vec[1]; out[2] = rw_vec[2]; out[3] = rw_vec[3]; out[4] = rw_vec[4]; out[5] = rw_vec[5]; out[6] = rw_vec[6]; out[7] = rw_vec[7]; rw_vec[0] = f[0]; rw_vec[1] = f[1]; rw_vec[2] = f[2]; rw_vec[3] = f[3]; rw_vec[4] = f[4]; rw_vec[5] = f[5]; rw_vec[6] = f[6]; rw_vec[7] = f[7]; rw_vec += 8; in += 8; out += 8; n -= 8; } return(w+5); } static void block_delay_tilde_dsp(t_block_delay_tilde *x, t_signal **sp) { int n = sp[0]->s_n; if(!x->x_blocksize)/*first time*/ x->x_begmem = (t_sample *)getbytes(n * sizeof(t_sample)); else if(x->x_blocksize != n) x->x_begmem = (t_sample *)resizebytes(x->x_begmem, x->x_blocksize*sizeof(t_sample), n*sizeof(t_sample)); x->x_blocksize = n; if(n&7) dsp_add(block_delay_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); else dsp_add(block_delay_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); } static void *block_delay_tilde_new(void) { t_block_delay_tilde *x = (t_block_delay_tilde *)pd_new(block_delay_tilde_class); x->x_blocksize = 0; x->x_begmem = (t_sample *)0; outlet_new(&x->x_obj, &s_signal); x->x_scalar_sig_in = (t_float)0.0; return (x); } static void block_delay_tilde_free(t_block_delay_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, x->x_blocksize * sizeof(t_sample)); } void block_delay_tilde_setup(void) { block_delay_tilde_class = class_new(gensym("block_delay~"), (t_newmethod)block_delay_tilde_new, (t_method)block_delay_tilde_free, sizeof(t_block_delay_tilde), 0, 0); CLASS_MAINSIGNALIN(block_delay_tilde_class, t_block_delay_tilde, x_scalar_sig_in); class_addmethod(block_delay_tilde_class, (t_method)block_delay_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/block_lp1~.c0000600000000000000000000001004614665566711016523 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include "iem_roomsim.h" /* -------------------------- block_lp1~ ------------------------------ */ static t_class *block_lp1_tilde_class; typedef struct _block_lp1_tilde { t_object x_obj; t_sample *x_begmem; int x_blocksize; t_float x_a; t_float x_b; t_float x_scalar_sig_in; } t_block_lp1_tilde; static void block_lp1_tilde_clear_mem(t_sample *vec, int n) { int i; for(i=0; i 1.0f) f = 1.0f; x->x_b = (t_float)f; x->x_a = 1.0f - x->x_b; } static void block_lp1_tilde_ft1(t_block_lp1_tilde *x, t_floatarg f) { block_lp1_tilde_float(x, f); } static t_int *block_lp1_tilde_perform(t_int *w) { // for each freq-bin-index n and for each block-time-index m : y(m,n) = b*y(m,n-1) + a*x(m,n) t_sample *in = (float *)(w[1]); t_sample *out = (float *)(w[2]); t_block_lp1_tilde *x = (t_block_lp1_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_sample *old_block, fin=0.0f; t_float a=x->x_a, b=x->x_b; old_block = x->x_begmem; for(i=0; ix_a, b=x->x_b; old_block = x->x_begmem; while(n) { fin[0] = in[0]; fin[1] = in[1]; fin[2] = in[2]; fin[3] = in[3]; fin[4] = in[4]; fin[5] = in[5]; fin[6] = in[6]; fin[7] = in[7]; out[0] = b*old_block[0] + a*fin[0]; out[1] = b*old_block[1] + a*fin[1]; out[2] = b*old_block[2] + a*fin[2]; out[3] = b*old_block[3] + a*fin[3]; out[4] = b*old_block[4] + a*fin[4]; out[5] = b*old_block[5] + a*fin[5]; out[6] = b*old_block[6] + a*fin[6]; out[7] = b*old_block[7] + a*fin[7]; old_block[0] = out[0]; old_block[1] = out[1]; old_block[2] = out[2]; old_block[3] = out[3]; old_block[4] = out[4]; old_block[5] = out[5]; old_block[6] = out[6]; old_block[7] = out[7]; old_block += 8; in += 8; out += 8; n -= 8; } return(w+5); } static void block_lp1_tilde_dsp(t_block_lp1_tilde *x, t_signal **sp) { int n = sp[0]->s_n; if(!x->x_blocksize)/*first time*/ { x->x_begmem = (t_sample *)getbytes(n * sizeof(t_sample)); block_lp1_tilde_clear_mem(x->x_begmem, n); } else if(x->x_blocksize != n) { x->x_begmem = (t_sample *)resizebytes(x->x_begmem, x->x_blocksize*sizeof(t_sample), n*sizeof(t_sample)); block_lp1_tilde_clear_mem(x->x_begmem, n); } x->x_blocksize = n; if(n&7) dsp_add(block_lp1_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); else dsp_add(block_lp1_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); } static void *block_lp1_tilde_new(t_floatarg f) { t_block_lp1_tilde *x = (t_block_lp1_tilde *)pd_new(block_lp1_tilde_class); block_lp1_tilde_float(x, f); x->x_blocksize = 0; x->x_begmem = (t_sample *)0; outlet_new(&x->x_obj, &s_signal); x->x_scalar_sig_in = (t_float)0.0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); return (x); } static void block_lp1_tilde_free(t_block_lp1_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, x->x_blocksize * sizeof(t_sample)); } void block_lp1_tilde_setup(void) { block_lp1_tilde_class = class_new(gensym("block_lp1~"), (t_newmethod)block_lp1_tilde_new, (t_method)block_lp1_tilde_free, sizeof(t_block_lp1_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(block_lp1_tilde_class, t_block_lp1_tilde, x_scalar_sig_in); class_addmethod(block_lp1_tilde_class, (t_method)block_lp1_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(block_lp1_tilde_class, (t_method)block_lp1_tilde_ft1, gensym("ft1"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/block_peak_env~.c0000600000000000000000000001151514665566711017621 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include "iem_roomsim.h" /* -------------------------- block_peak_env~ ------------------------------ */ static t_class *block_peak_env_tilde_class; typedef struct _block_peak_env_tilde { t_object x_obj; t_sample *x_begmem; int x_blocksize; t_float x_b; t_float x_scalar_sig_in; } t_block_peak_env_tilde; static void block_peak_env_tilde_clear_mem(t_sample *vec, int n) { int i; for(i=0; i 1.0f) f = 1.0f; x->x_b = (t_float)f; } static void block_peak_env_tilde_ft1(t_block_peak_env_tilde *x, t_floatarg f) { block_peak_env_tilde_float(x, f); } static t_int *block_peak_env_tilde_perform(t_int *w) { // for each freq-bin-index n and for each block-time-index m : y(m,n) = b*y(m,n-1) + a*x(m,n) t_sample *in = (float *)(w[1]); t_sample *out = (float *)(w[2]); t_block_peak_env_tilde *x = (t_block_peak_env_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_sample *old_block, fin=0.0f, gout=0.0f; t_float b=x->x_b; old_block = x->x_begmem; for(i=0; i= gout) out[i] = fin; else out[i] = gout; old_block[i] = out[i]; } return(w+5); } static t_int *block_peak_env_tilde_perf8(t_int *w) { t_sample *in = (float *)(w[1]); t_sample *out = (float *)(w[2]); t_block_peak_env_tilde *x = (t_block_peak_env_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_sample *old_block, fin[8], gout[8]; t_float b=x->x_b; old_block = x->x_begmem; while(n) { fin[0] = in[0]; fin[1] = in[1]; fin[2] = in[2]; fin[3] = in[3]; fin[4] = in[4]; fin[5] = in[5]; fin[6] = in[6]; fin[7] = in[7]; gout[0] = b*old_block[0]; gout[1] = b*old_block[1]; gout[2] = b*old_block[2]; gout[3] = b*old_block[3]; gout[4] = b*old_block[4]; gout[5] = b*old_block[5]; gout[6] = b*old_block[6]; gout[7] = b*old_block[7]; if(fin[0] >= gout[0]) out[0] = fin[0]; else out[0] = gout[0]; if(fin[1] >= gout[1]) out[1] = fin[1]; else out[1] = gout[1]; if(fin[2] >= gout[2]) out[2] = fin[2]; else out[2] = gout[2]; if(fin[3] >= gout[3]) out[3] = fin[3]; else out[3] = gout[3]; if(fin[4] >= gout[4]) out[4] = fin[4]; else out[4] = gout[4]; if(fin[5] >= gout[5]) out[5] = fin[5]; else out[5] = gout[5]; if(fin[6] >= gout[6]) out[6] = fin[6]; else out[6] = gout[6]; if(fin[7] >= gout[7]) out[7] = fin[7]; else out[7] = gout[7]; old_block[0] = out[0]; old_block[1] = out[1]; old_block[2] = out[2]; old_block[3] = out[3]; old_block[4] = out[4]; old_block[5] = out[5]; old_block[6] = out[6]; old_block[7] = out[7]; old_block += 8; in += 8; out += 8; n -= 8; } return(w+5); } static void block_peak_env_tilde_dsp(t_block_peak_env_tilde *x, t_signal **sp) { int n = sp[0]->s_n; if(!x->x_blocksize)/*first time*/ { x->x_begmem = (t_sample *)getbytes(n * sizeof(t_sample)); block_peak_env_tilde_clear_mem(x->x_begmem, n); } else if(x->x_blocksize != n) { x->x_begmem = (t_sample *)resizebytes(x->x_begmem, x->x_blocksize*sizeof(t_sample), n*sizeof(t_sample)); block_peak_env_tilde_clear_mem(x->x_begmem, n); } x->x_blocksize = n; if(n&7) dsp_add(block_peak_env_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); else dsp_add(block_peak_env_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); } static void *block_peak_env_tilde_new(t_floatarg f) { t_block_peak_env_tilde *x = (t_block_peak_env_tilde *)pd_new(block_peak_env_tilde_class); block_peak_env_tilde_float(x, f); x->x_blocksize = 0; x->x_begmem = (t_sample *)0; outlet_new(&x->x_obj, &s_signal); x->x_scalar_sig_in = (t_float)0.0; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); return (x); } static void block_peak_env_tilde_free(t_block_peak_env_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, x->x_blocksize * sizeof(t_sample)); } void block_peak_env_tilde_setup(void) { block_peak_env_tilde_class = class_new(gensym("block_peak_env~"), (t_newmethod)block_peak_env_tilde_new, (t_method)block_peak_env_tilde_free, sizeof(t_block_peak_env_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(block_peak_env_tilde_class, t_block_peak_env_tilde, x_scalar_sig_in); class_addmethod(block_peak_env_tilde_class, (t_method)block_peak_env_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(block_peak_env_tilde_class, (t_method)block_peak_env_tilde_ft1, gensym("ft1"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/cart2del_damp_2d.c0000600000000000000000000002541214665566711017550 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- cart2del_damp_2d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden aenderungen: src-index von 1 .. n auf 0 .. (n-1) aenderungen: azimuth von rad auf degree */ /* Reihenfolge der bundle-sektoren: index phi: 1 0 2 45 3 90 4 135 5 180 6 225 7 270 8 315 1. und 2. reflexionen: +x 5 9 1 11 +y 6 2 0 4 8 12 3 10 7 */ typedef struct _cart2del_damp_2d { t_object x_obj; t_symbol *x_s_direct; t_symbol *x_s_early1; t_symbol *x_s_early2; t_symbol *x_s_del; t_symbol *x_s_damp; t_symbol *x_s_index_phi; t_float x_room_x; t_float x_room_y; t_float x_head_x; t_float x_head_y; t_float x_src_x; t_float x_src_y; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; void *x_clock; } t_cart2del_damp_2d; static t_class *cart2del_damp_2d_class; static t_float cart2del_damp_2d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy) { t_float r = (t_float)sqrt(dx*dx + dy*dy); if(r < r_ambi) return(r_ambi); else return(r); } static t_float cart2del_damp_2d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy)/*changes*/ { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static void cart2del_damp_2d_doit(t_cart2del_damp_2d *x) { t_float diff_x, diff_y; t_float sum_x, sum_y; t_float lx, wy; t_float x0, y0_; t_float xp1, yp1; t_float xn1, yn1; t_float xp2, yp2; t_float xn2, yn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float rad[20]; t_atom at[20]; lx = x->x_room_x; wy = x->x_room_y; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; x0 = diff_x; y0_ = diff_y; xp1 = lx - sum_x; yp1 = wy - sum_y; xn1 = -lx - sum_x; yn1 = -wy - sum_y; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; rad[0] = cart2del_damp_2d_calc_radius(r_ambi, x0, y0_); rad[1] = cart2del_damp_2d_calc_radius(r_ambi, xp1, y0_); rad[2] = cart2del_damp_2d_calc_radius(r_ambi, x0, yp1); rad[3] = cart2del_damp_2d_calc_radius(r_ambi, xn1, y0_); rad[4] = cart2del_damp_2d_calc_radius(r_ambi, x0, yn1); rad[5] = cart2del_damp_2d_calc_radius(r_ambi, xp2, y0_); rad[6] = cart2del_damp_2d_calc_radius(r_ambi, x0, yp2); rad[7] = cart2del_damp_2d_calc_radius(r_ambi, xn2, y0_); rad[8] = cart2del_damp_2d_calc_radius(r_ambi, x0, yn2); rad[9] = cart2del_damp_2d_calc_radius(r_ambi, xp1, yp1); rad[10] = cart2del_damp_2d_calc_radius(r_ambi, xn1, yn1); rad[11] = cart2del_damp_2d_calc_radius(r_ambi, xp1, yn1); rad[12] = cart2del_damp_2d_calc_radius(r_ambi, xn1, yp1); /* delay-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_del); SETFLOAT(at+1, rad[0] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, rad[1] *m2ms); SETFLOAT(at+2, rad[2] *m2ms); SETFLOAT(at+3, rad[3] *m2ms); SETFLOAT(at+4, rad[4] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, rad[5] *m2ms); SETFLOAT(at+2, rad[6] *m2ms); SETFLOAT(at+3, rad[7] *m2ms); SETFLOAT(at+4, rad[8] *m2ms); SETFLOAT(at+5, rad[9] *m2ms); SETFLOAT(at+6, rad[10] *m2ms); SETFLOAT(at+7, rad[11] *m2ms); SETFLOAT(at+8, rad[12] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); /* daempfungs-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_damp); SETFLOAT(at+1, r_ambi / rad[0]); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, r_ambi / rad[1]); SETFLOAT(at+2, r_ambi / rad[2]); SETFLOAT(at+3, r_ambi / rad[3]); SETFLOAT(at+4, r_ambi / rad[4]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, r_ambi / rad[5]); SETFLOAT(at+2, r_ambi / rad[6]); SETFLOAT(at+3, r_ambi / rad[7]); SETFLOAT(at+4, r_ambi / rad[8]); SETFLOAT(at+5, r_ambi / rad[9]); SETFLOAT(at+6, r_ambi / rad[10]); SETFLOAT(at+7, r_ambi / rad[11]); SETFLOAT(at+8, r_ambi / rad[12]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_index_phi); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 3, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp1, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn1, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 3, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp2, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yp2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn2, y0_)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, x0, yn2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 5.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp1, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 6.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn1, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 7.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xp1, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); SETFLOAT(at+1, 8.0f); SETFLOAT(at+2, cart2del_damp_2d_calc_azimuth(x_180_over_pi, xn1, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 3, at); } static void cart2del_damp_2d_src_xy(t_cart2del_damp_2d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_src_x = atom_getfloat(argv++); x->x_src_y = atom_getfloat(argv); if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_2d_head_xy(t_cart2del_damp_2d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv); if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_2d_room_dim(t_cart2del_damp_2d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv); if(x->x_room_x < 0.5f) x->x_room_x = 0.5f; if(x->x_room_y < 0.5f) x->x_room_y = 0.5f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_2d_r_ambi(t_cart2del_damp_2d *x, t_floatarg r_ambi) { if(r_ambi < 0.1f) r_ambi = 0.1f; x->x_r_ambi = r_ambi; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_2d_sonic_speed(t_cart2del_damp_2d *x, t_floatarg speed) { if(speed < 10.0f) speed = 10.0f; if(speed > 2000.0f) speed = 2000.0f; x->x_speed = speed; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_2d_free(t_cart2del_damp_2d *x) { clock_free(x->x_clock); } static void *cart2del_damp_2d_new(t_symbol *s, int argc, t_atom *argv) { t_cart2del_damp_2d *x = (t_cart2del_damp_2d *)pd_new(cart2del_damp_2d_class); x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_src_x = 3.0f; x->x_src_y = 0.5f; x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_direct = gensym("direct"); x->x_s_early1 = gensym("early1"); x->x_s_early2 = gensym("early2"); x->x_s_damp = gensym("damp"); x->x_s_del = gensym("del"); x->x_s_index_phi = gensym("index_phi"); outlet_new(&x->x_obj, &s_list); x->x_clock = clock_new(x, (t_method)cart2del_damp_2d_doit); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); return (x); } void cart2del_damp_2d_setup(void) { cart2del_damp_2d_class = class_new(gensym("cart2del_damp_2d"), (t_newmethod)cart2del_damp_2d_new, (t_method)cart2del_damp_2d_free, sizeof(t_cart2del_damp_2d), 0, A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_src_xy, gensym("src_xy"), A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_head_xy, gensym("head_xy"), A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_room_dim, gensym("room_dim"), A_GIMME, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(cart2del_damp_2d_class, (t_method)cart2del_damp_2d_r_ambi, gensym("r_ambi"), A_FLOAT, 0); // class_sethelpsymbol(cart2del_damp_2d_class, gensym("iemhelp2/cart2del_damp_2d-help")); } iem_utils-0.0.20240903/iem_roomsim/src/cart2del_damp_3d.c0000600000000000000000000004465714665566711017565 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- cart2del_damp_3d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden */ /* Reihenfolge der bundle-sektoren: index delta phi: 1 90 0 2 45 45 3 45 135 4 45 225 5 45 315 6 0 0 7 0 45 8 0 90 9 0 135 10 0 180 11 0 225 12 0 270 13 0 315 14 -45 45 15 -45 135 16 -45 225 17 -45 315 top +x +y 9 +x 15 +y 23 3 14 24 +x 8 22 2 13 +y 10 4 0 1 7 16 5 19 11 +x 21 +y 17 6 20 18 +x +y 12 */ typedef struct _cart2del_damp_3d { t_object x_obj; t_symbol *x_s_direct; t_symbol *x_s_early1; t_symbol *x_s_early2; t_symbol *x_s_del; t_symbol *x_s_damp; t_symbol *x_s_index_theta_phi; t_float x_room_x; t_float x_room_y; t_float x_room_z; t_float x_head_x; t_float x_head_y; t_float x_head_z; t_float x_src_x; t_float x_src_y; t_float x_src_z; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; void *x_clock; } t_cart2del_damp_3d; static t_class *cart2del_damp_3d_class; static t_float cart2del_damp_3d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { t_float r = (t_float)sqrt(dx*dx + dy*dy + dz*dz); if(r < r_ambi) return(r_ambi); else return(r); } static t_float cart2del_damp_3d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float cart2del_damp_3d_calc_elevation(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { t_float dxy = sqrt(dx*dx + dy*dy); if(dxy == 0.0f) { if(dz < 0.0f) return(-90.0f); else return(90.0f); } else { return(x_180_over_pi * (t_float)atan(dz / dxy)); } } static void cart2del_damp_3d_doit(t_cart2del_damp_3d *x) { t_float diff_x, diff_y, diff_z; t_float sum_x, sum_y, sum_z; t_float lx, wy, hz; t_float x0, y0_, z0; t_float xp1, yp1, zp1; t_float xn1, yn1, zn1; t_float xp2, yp2, zp2; t_float xn2, yn2, zn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float rad[30]; t_atom at[30]; lx = x->x_room_x; wy = x->x_room_y; hz = x->x_room_z; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; diff_z = x->x_src_z - x->x_head_z; sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; sum_z = x->x_src_z + x->x_head_z - hz; x0 = diff_x; y0_ = diff_y; z0 = diff_z; xp1 = lx - sum_x; yp1 = wy - sum_y; zp1 = hz - sum_z; xn1 = -lx - sum_x; yn1 = -wy - sum_y; zn1 = -hz - sum_z; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; zp2 = 2.0f*hz + diff_z; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; zn2 = -2.0f*hz + diff_z; rad[0] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, z0); rad[1] = cart2del_damp_3d_calc_radius(r_ambi, xp1, y0_, z0); rad[2] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp1, z0); rad[3] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zp1); rad[4] = cart2del_damp_3d_calc_radius(r_ambi, xn1, y0_, z0); rad[5] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn1, z0); rad[6] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zn1); rad[7] = cart2del_damp_3d_calc_radius(r_ambi, xp2, y0_, z0); rad[8] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp2, z0); rad[9] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zp2); rad[10] = cart2del_damp_3d_calc_radius(r_ambi, xn2, y0_, z0); rad[11] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn2, z0); rad[12] = cart2del_damp_3d_calc_radius(r_ambi, x0, y0_, zn2); rad[13] = cart2del_damp_3d_calc_radius(r_ambi, xp1, yp1, z0); rad[14] = cart2del_damp_3d_calc_radius(r_ambi, xp1, y0_, zp1); rad[15] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp1, zp1); rad[16] = cart2del_damp_3d_calc_radius(r_ambi, xn1, yn1, z0); rad[17] = cart2del_damp_3d_calc_radius(r_ambi, xn1, y0_, zn1); rad[18] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn1, zn1); rad[19] = cart2del_damp_3d_calc_radius(r_ambi, xp1, yn1, z0); rad[20] = cart2del_damp_3d_calc_radius(r_ambi, xp1, y0_, zn1); rad[21] = cart2del_damp_3d_calc_radius(r_ambi, x0, yp1, zn1); rad[22] = cart2del_damp_3d_calc_radius(r_ambi, xn1, yp1, z0); rad[23] = cart2del_damp_3d_calc_radius(r_ambi, xn1, y0_, zp1); rad[24] = cart2del_damp_3d_calc_radius(r_ambi, x0, yn1, zp1); /* delay-reihenfolge: 0 auslassen, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ SETSYMBOL(at, x->x_s_del); SETFLOAT(at+1, rad[0] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, rad[1] *m2ms); SETFLOAT(at+2, rad[2] *m2ms); SETFLOAT(at+3, rad[3] *m2ms); SETFLOAT(at+4, rad[4] *m2ms); SETFLOAT(at+5, rad[5] *m2ms); SETFLOAT(at+6, rad[6] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, rad[7] *m2ms); SETFLOAT(at+2, rad[8] *m2ms); SETFLOAT(at+3, rad[9] *m2ms); SETFLOAT(at+4, rad[10] *m2ms); SETFLOAT(at+5, rad[11] *m2ms); SETFLOAT(at+6, rad[12] *m2ms); SETFLOAT(at+7, rad[13] *m2ms); SETFLOAT(at+8, rad[14] *m2ms); SETFLOAT(at+9, rad[15] *m2ms); SETFLOAT(at+10, rad[16] *m2ms); SETFLOAT(at+11, rad[17] *m2ms); SETFLOAT(at+12, rad[18] *m2ms); SETFLOAT(at+13, rad[19] *m2ms); SETFLOAT(at+14, rad[20] *m2ms); SETFLOAT(at+15, rad[21] *m2ms); SETFLOAT(at+16, rad[22] *m2ms); SETFLOAT(at+17, rad[23] *m2ms); SETFLOAT(at+18, rad[24] *m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); /* daempfungs-reihenfolge: 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ SETSYMBOL(at, x->x_s_damp); SETFLOAT(at+1, r_ambi / rad[0]); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, r_ambi / rad[1]); SETFLOAT(at+2, r_ambi / rad[2]); SETFLOAT(at+3, r_ambi / rad[3]); SETFLOAT(at+4, r_ambi / rad[4]); SETFLOAT(at+5, r_ambi / rad[5]); SETFLOAT(at+6, r_ambi / rad[6]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, r_ambi / rad[7]); SETFLOAT(at+2, r_ambi / rad[8]); SETFLOAT(at+3, r_ambi / rad[9]); SETFLOAT(at+4, r_ambi / rad[10]); SETFLOAT(at+5, r_ambi / rad[11]); SETFLOAT(at+6, r_ambi / rad[12]); SETFLOAT(at+7, r_ambi / rad[13]); SETFLOAT(at+8, r_ambi / rad[14]); SETFLOAT(at+9, r_ambi / rad[15]); SETFLOAT(at+10, r_ambi / rad[16]); SETFLOAT(at+11, r_ambi / rad[17]); SETFLOAT(at+12, r_ambi / rad[18]); SETFLOAT(at+13, r_ambi / rad[19]); SETFLOAT(at+14, r_ambi / rad[20]); SETFLOAT(at+15, r_ambi / rad[21]); SETFLOAT(at+16, r_ambi / rad[22]); SETFLOAT(at+17, r_ambi / rad[23]); SETFLOAT(at+18, r_ambi / rad[24]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ SETSYMBOL(at, x->x_s_index_theta_phi); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 4, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 5.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 6.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 4, at); SETFLOAT(at+1, 1.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp2, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp2, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 2.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp2, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp2, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 3.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zp2)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 4.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn2, y0_, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn2, y0_, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 5.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn2, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn2, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 6.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, y0_, zn2)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 7.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, yp1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, yp1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 8.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, y0_, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 9.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp1, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp1, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 10.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, yn1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, yn1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 11.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, y0_, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 12.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn1, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn1, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 13.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, yn1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, yn1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 14.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xp1, y0_, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 15.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yp1, zn1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yp1, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 16.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, yp1, z0)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, yp1, z0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 17.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, xn1, y0_, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); SETFLOAT(at+1, 18.0f); SETFLOAT(at+2, cart2del_damp_3d_calc_elevation(x_180_over_pi, x0, yn1, zp1)); SETFLOAT(at+3, cart2del_damp_3d_calc_azimuth(x_180_over_pi, x0, yn1, zp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 4, at); } static void cart2del_damp_3d_src_xyz(t_cart2del_damp_3d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_src_x = atom_getfloat(argv++); x->x_src_y = atom_getfloat(argv++); x->x_src_z = atom_getfloat(argv); if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; if(x->x_src_z > x->x_room_z) x->x_src_z = x->x_room_z; if(x->x_src_z < 0.0f) x->x_src_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_3d_head_xyz(t_cart2del_damp_3d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); x->x_head_z = atom_getfloat(argv); if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; if(x->x_head_z > x->x_room_z) x->x_head_z = x->x_room_z; if(x->x_head_z < 0.0f) x->x_head_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_3d_room_dim(t_cart2del_damp_3d *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_room_z = atom_getfloat(argv); if(x->x_room_x < 0.5f) x->x_room_x = 0.5f; if(x->x_room_y < 0.5f) x->x_room_y = 0.5f; if(x->x_room_z < 0.5f) x->x_room_z = 0.5f; clock_delay(x->x_clock, 0.0f); } } static void cart2del_damp_3d_r_ambi(t_cart2del_damp_3d *x, t_floatarg r_ambi) { if(r_ambi < 0.1f) r_ambi = 0.1f; x->x_r_ambi = r_ambi; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_3d_sonic_speed(t_cart2del_damp_3d *x, t_floatarg speed) { if(speed < 10.0f) speed = 10.0f; if(speed > 2000.0f) speed = 2000.0f; x->x_speed = speed; clock_delay(x->x_clock, 0.0f); } static void cart2del_damp_3d_free(t_cart2del_damp_3d *x) { clock_free(x->x_clock); } static void *cart2del_damp_3d_new(t_symbol *s, int argc, t_atom *argv) { t_cart2del_damp_3d *x = (t_cart2del_damp_3d *)pd_new(cart2del_damp_3d_class); x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_room_z = 4.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_head_z = 1.7f; x->x_src_x = 3.0f; x->x_src_y = 0.5f; x->x_src_z = 2.5f; x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_direct = gensym("direct"); x->x_s_early1 = gensym("early1"); x->x_s_early2 = gensym("early2"); x->x_s_del = gensym("del"); x->x_s_damp = gensym("damp"); x->x_s_index_theta_phi = gensym("index_theta_phi"); outlet_new(&x->x_obj, &s_list); x->x_clock = clock_new(x, (t_method)cart2del_damp_3d_doit); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); return (x); } void cart2del_damp_3d_setup(void) { cart2del_damp_3d_class = class_new(gensym("cart2del_damp_3d"), (t_newmethod)cart2del_damp_3d_new, (t_method)cart2del_damp_3d_free, sizeof(t_cart2del_damp_3d), 0, A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_src_xyz, gensym("src_xyz"), A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_head_xyz, gensym("head_xyz"), A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_room_dim, gensym("room_dim"), A_GIMME, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(cart2del_damp_3d_class, (t_method)cart2del_damp_3d_r_ambi, gensym("r_ambi"), A_FLOAT, 0); // class_sethelpsymbol(cart2del_damp_3d_class, gensym("iemhelp2/cart2del_damp_3d-help")); } iem_utils-0.0.20240903/iem_roomsim/src/early_reflections_2d.c0000600000000000000000000003454514665566711020567 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- early_reflections_2d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden aenderungen: src-index von 1 .. n auf 0 .. (n-1) aenderungen: azimuth von rad auf degree */ /* Reihenfolge der bundle-sektoren: index phi: 1 0 2 45 3 90 4 135 5 180 6 225 7 270 8 315 1. und 2. reflexionen: +x 5 9 1 11 +y 6 2 0 4 8 12 3 10 7 */ typedef struct _early_reflections_2d { t_object x_obj; t_atom x_para_at[27]; void *x_direct_out; void *x_early_out; void *x_rev_out; t_symbol *x_s_del0; t_symbol *x_s_del1; t_symbol *x_s_del2; t_symbol *x_s_damp; t_symbol *x_s_index_phi; t_symbol *x_s_bundle; t_float x_azimuth_denominator; t_float x_azimuth_offset; t_float x_room_x; t_float x_room_y; t_float x_head_x; t_float x_head_y; int x_n_src; int x_bundle; t_float x_src_x[30]; t_float x_src_y[30]; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; } t_early_reflections_2d; static t_class *early_reflections_2d_class; static t_float early_reflections_2d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy) { t_float r = (t_float)sqrt(dx*dx + dy*dy); if(r < r_ambi) return(r_ambi); else return(r); } static t_float early_reflections_2d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy)/*changes*/ { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float early_reflections_2d_calc_bundle_index(t_floatarg phi)/*changes*/ { phi += 22.5f; if(phi >= 360.0f) phi -= 360.0f; if(phi <= 180.0f) { if(phi <= 90.0f) { if(phi <= 45.0f)/* 0 .. 45 */ return(1.0f); else return(2.0f); } else { if(phi <= 135.0f) return(3.0f); else return(4.0f); } } else { if(phi <= 270.0f) { if(phi <= 225.0f) return(5.0f); else return(6.0f); } else { if(phi <= 315.0f)/* 270 .. 315 */ return(7.0f); else return(8.0f);/* 315 .. 360 */ } } } static void early_reflections_2d_doit(t_early_reflections_2d *x) { t_atom *at; t_float diff_x, diff_y; t_float sum_x, sum_y; t_float lx, wy; t_float x0, y0_; t_float xp1, yp1; t_float xn1, yn1; t_float xp2, yp2; t_float xn2, yn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float phi[50]; t_float rad[50]; int n_src=x->x_n_src; int i; lx = x->x_room_x; wy = x->x_room_y; SETFLOAT(x->x_para_at, early_reflections_2d_calc_radius(r_ambi, lx, wy)*m2ms); outlet_anything(x->x_rev_out, x->x_s_del0, 1, x->x_para_at); for(i=0; ix_src_x[i] - x->x_head_x; diff_y = x->x_src_y[i] - x->x_head_y; sum_x = x->x_src_x[i] + x->x_head_x; sum_y = x->x_src_y[i] + x->x_head_y; x0 = diff_x; y0_ = diff_y; xp1 = lx - sum_x; yp1 = wy - sum_y; xn1 = -lx - sum_x; yn1 = -wy - sum_y; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; rad[0] = early_reflections_2d_calc_radius(r_ambi, x0, y0_); rad[1] = early_reflections_2d_calc_radius(r_ambi, xp1, y0_); rad[2] = early_reflections_2d_calc_radius(r_ambi, x0, yp1); rad[3] = early_reflections_2d_calc_radius(r_ambi, xn1, y0_); rad[4] = early_reflections_2d_calc_radius(r_ambi, x0, yn1); rad[5] = early_reflections_2d_calc_radius(r_ambi, xp2, y0_); rad[6] = early_reflections_2d_calc_radius(r_ambi, x0, yp2); rad[7] = early_reflections_2d_calc_radius(r_ambi, xn2, y0_); rad[8] = early_reflections_2d_calc_radius(r_ambi, x0, yn2); rad[9] = early_reflections_2d_calc_radius(r_ambi, xp1, yp1); rad[10] = early_reflections_2d_calc_radius(r_ambi, xn1, yn1); rad[11] = early_reflections_2d_calc_radius(r_ambi, xp1, yn1); rad[12] = early_reflections_2d_calc_radius(r_ambi, xn1, yp1); /* delay-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ at = x->x_para_at; SETFLOAT(at, (t_float)(i+1));/*changes*/ at++; SETFLOAT(at, rad[0] * m2ms); outlet_anything(x->x_direct_out, x->x_s_del0, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[1] *m2ms); at++; SETFLOAT(at, rad[2] *m2ms); at++; SETFLOAT(at, rad[3] *m2ms); at++; SETFLOAT(at, rad[4] *m2ms); outlet_anything(x->x_early_out, x->x_s_del1, 5, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[5] *m2ms); at++; SETFLOAT(at, rad[6] *m2ms); at++; SETFLOAT(at, rad[7] *m2ms); at++; SETFLOAT(at, rad[8] *m2ms); at++; SETFLOAT(at, rad[9] *m2ms); at++; SETFLOAT(at, rad[10] *m2ms); at++; SETFLOAT(at, rad[11] *m2ms); at++; SETFLOAT(at, rad[12] *m2ms); outlet_anything(x->x_early_out, x->x_s_del2, 9, x->x_para_at); /* daempfungs-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[0]); outlet_anything(x->x_direct_out, x->x_s_damp, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[1]); at++; SETFLOAT(at, r_ambi / rad[2]); at++; SETFLOAT(at, r_ambi / rad[3]); at++; SETFLOAT(at, r_ambi / rad[4]); at++; SETFLOAT(at, r_ambi / rad[5]); at++; SETFLOAT(at, r_ambi / rad[6]); at++; SETFLOAT(at, r_ambi / rad[7]); at++; SETFLOAT(at, r_ambi / rad[8]); at++; SETFLOAT(at, r_ambi / rad[9]); at++; SETFLOAT(at, r_ambi / rad[10]); at++; SETFLOAT(at, r_ambi / rad[11]); at++; SETFLOAT(at, r_ambi / rad[12]); outlet_anything(x->x_early_out, x->x_s_damp, 13, x->x_para_at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ at = x->x_para_at+1; SETFLOAT(at, early_reflections_2d_calc_azimuth(x_180_over_pi, x0, y0_)); outlet_anything(x->x_direct_out, x->x_s_index_phi, 2, x->x_para_at); /* encoder-winkel-reihenfolge: bundle 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ phi[0] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp1, y0_); phi[1] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yp1); phi[2] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn1, y0_); phi[3] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yn1); phi[4] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp2, y0_); phi[5] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yp2); phi[6] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn2, y0_); phi[7] = early_reflections_2d_calc_azimuth(x_180_over_pi, x0, yn2); phi[8] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp1, yp1); phi[9] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn1, yn1); phi[10] = early_reflections_2d_calc_azimuth(x_180_over_pi, xp1, yn1); phi[11] = early_reflections_2d_calc_azimuth(x_180_over_pi, xn1, yp1); if(x->x_bundle) { at = x->x_para_at+1; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[0])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[1])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[2])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[3])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[4])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[5])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[6])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[7])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[8])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[9])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[10])); at++; SETFLOAT(at, early_reflections_2d_calc_bundle_index(phi[11])); outlet_anything(x->x_early_out, x->x_s_bundle, 13, x->x_para_at); } at = x->x_para_at+1; SETFLOAT(at, 1.0f); at++; SETFLOAT(at, phi[0]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 2.0f); at++; SETFLOAT(at, phi[1]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 3.0f); at++; SETFLOAT(at, phi[2]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 4.0f); at++; SETFLOAT(at, phi[3]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 5.0f); at++; SETFLOAT(at, phi[4]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 6.0f); at++; SETFLOAT(at, phi[5]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 7.0f); at++; SETFLOAT(at, phi[6]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 8.0f); at++; SETFLOAT(at, phi[7]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 9.0f); at++; SETFLOAT(at, phi[8]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 10.0f); at++; SETFLOAT(at, phi[9]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 11.0f); at++; SETFLOAT(at, phi[10]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 12.0f); at++; SETFLOAT(at, phi[11]); outlet_anything(x->x_early_out, x->x_s_index_phi, 3, x->x_para_at); } } static void early_reflections_2d_dump_para(t_early_reflections_2d *x) { int i, n=x->x_n_src; post("*******************************************************************************"); post("room-dimensions: L_x = %.3f, W_y = %.3f", x->x_room_x, x->x_room_y); post("hear-position: x_hear = %.3f, y_hear = %.3f", x->x_head_x, x->x_head_y); for(i=0; ix_src_x[i], i+1, x->x_src_y[i]); post("ambisonic-radius: %f", x->x_r_ambi); post("sonic-speed: %.3f", x->x_speed); post("order of outputs: direct early rev"); post("*******************************************************************************"); } static void early_reflections_2d_para(t_early_reflections_2d *x, t_symbol *s, int argc, t_atom *argv) { int i, n=x->x_n_src*2 + 5;/* r_ambi + 2*room + 2*head */ if(argc != n) { post("early_reflections_2d ERROR: para needs 1 r_ambi + 2*room + 2*head +n*2*src"); return; } x->x_r_ambi = atom_getfloat(argv++); x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); n = x->x_n_src; for(i=0; ix_src_x[i] = atom_getfloat(argv++); x->x_src_y[i] = atom_getfloat(argv++); } early_reflections_2d_doit(x); } static void early_reflections_2d_sonic_speed(t_early_reflections_2d *x, t_floatarg speed) { if(speed < 300.0f) speed = 300.0f; if(speed > 400.0f) speed = 400.0f; x->x_speed = speed; } static void early_reflections_2d_bundle(t_early_reflections_2d *x, t_floatarg bundle) { if(bundle == 0.0f) x->x_bundle = 0; else x->x_bundle = 1; } static void early_reflections_2d_free(t_early_reflections_2d *x) { } static void *early_reflections_2d_new(t_floatarg fn_src) { int i, n; t_early_reflections_2d *x = (t_early_reflections_2d *)pd_new(early_reflections_2d_class); n = (int)fn_src; if(n < 1) n = 1; if(n > 30) n = 30; x->x_n_src = n; x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; for(i=0; ix_src_x[i] = 3.0f; x->x_src_y[i] = 0.5f; } x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_del0 = gensym("del0"); x->x_s_del1 = gensym("del1"); x->x_s_del2 = gensym("del2"); x->x_s_damp = gensym("damp"); x->x_s_index_phi = gensym("index_phi"); x->x_s_bundle = gensym("bundle"); x->x_direct_out = outlet_new(&x->x_obj, &s_list); x->x_early_out = outlet_new(&x->x_obj, &s_list); x->x_rev_out = outlet_new(&x->x_obj, &s_list); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); x->x_bundle = 0; return (x); } void early_reflections_2d_setup(void) { early_reflections_2d_class = class_new(gensym("early_reflections_2d"), (t_newmethod)early_reflections_2d_new, (t_method)early_reflections_2d_free, sizeof(t_early_reflections_2d), 0, A_DEFFLOAT, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_para, gensym("para"), A_GIMME, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_bundle, gensym("bundle"), A_FLOAT, 0); class_addmethod(early_reflections_2d_class, (t_method)early_reflections_2d_dump_para, gensym("dump_para"), 0); // class_sethelpsymbol(early_reflections_2d_class, gensym("iemhelp2/early_reflections_2d-help")); } iem_utils-0.0.20240903/iem_roomsim/src/early_reflections_3d.c0000600000000000000000000006501714665566711020566 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- early_reflections_3d ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden */ /* Reihenfolge der bundle-sektoren: index delta phi: 1 90 0 2 45 45 3 45 135 4 45 225 5 45 315 6 0 0 7 0 45 8 0 90 9 0 135 10 0 180 11 0 225 12 0 270 13 0 315 14 -45 45 15 -45 135 16 -45 225 17 -45 315 top +x +y 9 +x 15 +y 23 3 14 24 +x 8 22 2 13 +y 10 4 0 1 7 16 5 19 11 +x 21 +y 17 6 20 18 +x +y 12 */ typedef struct _early_reflections_3d { t_object x_obj; t_atom x_para_at[27]; void *x_direct_out; void *x_early_out; void *x_rev_out; t_symbol *x_s_del0; t_symbol *x_s_del1; t_symbol *x_s_del2; t_symbol *x_s_damp; t_symbol *x_s_index_delta_phi; t_symbol *x_s_bundle; t_float x_room_x; t_float x_room_y; t_float x_room_z; t_float x_head_x; t_float x_head_y; t_float x_head_z; int x_n_src; int x_bundle; t_float x_src_x[30]; t_float x_src_y[30]; t_float x_src_z[30]; t_float x_r_ambi; t_float x_speed; t_float x_180_over_pi; } t_early_reflections_3d; static t_class *early_reflections_3d_class; static t_float early_reflections_3d_calc_radius(t_floatarg r_ambi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { t_float r = (t_float)sqrt(dx*dx + dy*dy + dz*dz); if(r < r_ambi) return(r_ambi); else return(r); } static t_float early_reflections_3d_calc_azimuth(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz) { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float early_reflections_3d_calc_elevation(t_floatarg x_180_over_pi, t_floatarg dx, t_floatarg dy, t_floatarg dz)/*changes*/ { t_float dxy = sqrt(dx*dx + dy*dy); if(dxy == 0.0f) { if(dz < 0.0f) return(-90.0f); else return(90.0f); } else { return(x_180_over_pi * (t_float)atan(dz / dxy)); } } static t_float early_reflections_3d_calc_bundle_index(t_floatarg delta, t_floatarg phi)/*changes*/ { if(delta > 67.5f) return(1.0f); else if(delta > 22.5f) { if(phi <= 180.0f) { if(phi <= 90.0f) return(2.0f); else return(3.0f); } else { if(phi <= 270.0f) return(4.0f); else return(5.0f); } } else if(delta > -22.5f) { phi += 22.5f; if(phi >= 360.0f) phi -= 360.0f; if(phi <= 180.0f) { if(phi <= 90.0f) { if(phi <= 45.0f)/* 0 .. 45 */ return(6.0f); else return(7.0f); } else { if(phi <= 135.0f) return(8.0f); else return(9.0f); } } else { if(phi <= 270.0f) { if(phi <= 225.0f) return(10.0f); else return(11.0f); } else { if(phi <= 315.0f)/* 270 .. 315 */ return(12.0f); else return(13.0f);/* 315 .. 360 */ } } } else { if(phi <= 180.0f) { if(phi <= 90.0f) return(14.0f); else return(15.0f); } else { if(phi <= 270.0f) return(16.0f); else return(17.0f); } } } static void early_reflections_3d_doit(t_early_reflections_3d *x) { t_atom *at; t_float diff_x, diff_y, diff_z; t_float sum_x, sum_y, sum_z; t_float lx, wy, hz; t_float x0, y0_, z0; t_float xp1, yp1, zp1; t_float xn1, yn1, zn1; t_float xp2, yp2, zp2; t_float xn2, yn2, zn2; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_ambi = x->x_r_ambi; t_float rad[50], delta[50], phi[50]; int n_src=x->x_n_src; int i; /*t_float hz2 = 0.5f*x->x_room_z; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; diff_z = (x->x_src_z - hz2) - (x->x_head_z - hz2); sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; sum_z = (x->x_src_z - hz2) + (x->x_head_z - hz2);*/ lx = x->x_room_x; wy = x->x_room_y; hz = x->x_room_z; SETFLOAT(x->x_para_at, early_reflections_3d_calc_radius(r_ambi, lx, wy, hz)*m2ms); outlet_anything(x->x_rev_out, x->x_s_del0, 1, x->x_para_at); for(i=0; ix_src_x[i] - x->x_head_x; diff_y = x->x_src_y[i] - x->x_head_y; diff_z = x->x_src_z[i] - x->x_head_z; sum_x = x->x_src_x[i] + x->x_head_x; sum_y = x->x_src_y[i] + x->x_head_y; sum_z = x->x_src_z[i] + x->x_head_z - hz; x0 = diff_x; y0_ = diff_y; z0 = diff_z; xp1 = lx - sum_x; yp1 = wy - sum_y; zp1 = hz - sum_z; xn1 = -lx - sum_x; yn1 = -wy - sum_y; zn1 = -hz - sum_z; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; zp2 = 2.0f*hz + diff_z; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; zn2 = -2.0f*hz + diff_z; rad[0] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, z0); rad[1] = early_reflections_3d_calc_radius(r_ambi, xp1, y0_, z0); rad[2] = early_reflections_3d_calc_radius(r_ambi, x0, yp1, z0); rad[3] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zp1); rad[4] = early_reflections_3d_calc_radius(r_ambi, xn1, y0_, z0); rad[5] = early_reflections_3d_calc_radius(r_ambi, x0, yn1, z0); rad[6] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zn1); rad[7] = early_reflections_3d_calc_radius(r_ambi, xp2, y0_, z0); rad[8] = early_reflections_3d_calc_radius(r_ambi, x0, yp2, z0); rad[9] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zp2); rad[10] = early_reflections_3d_calc_radius(r_ambi, xn2, y0_, z0); rad[11] = early_reflections_3d_calc_radius(r_ambi, x0, yn2, z0); rad[12] = early_reflections_3d_calc_radius(r_ambi, x0, y0_, zn2); rad[13] = early_reflections_3d_calc_radius(r_ambi, xp1, yp1, z0); rad[14] = early_reflections_3d_calc_radius(r_ambi, xp1, y0_, zp1); rad[15] = early_reflections_3d_calc_radius(r_ambi, x0, yp1, zp1); rad[16] = early_reflections_3d_calc_radius(r_ambi, xn1, yn1, z0); rad[17] = early_reflections_3d_calc_radius(r_ambi, xn1, y0_, zn1); rad[18] = early_reflections_3d_calc_radius(r_ambi, x0, yn1, zn1); rad[19] = early_reflections_3d_calc_radius(r_ambi, xp1, yn1, z0); rad[20] = early_reflections_3d_calc_radius(r_ambi, xp1, y0_, zn1); rad[21] = early_reflections_3d_calc_radius(r_ambi, x0, yp1, zn1); rad[22] = early_reflections_3d_calc_radius(r_ambi, xn1, yp1, z0); rad[23] = early_reflections_3d_calc_radius(r_ambi, xn1, y0_, zp1); rad[24] = early_reflections_3d_calc_radius(r_ambi, x0, yn1, zp1); /* delay-reihenfolge: 0 auslassen, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ at = x->x_para_at; SETFLOAT(at, (t_float)(i+1));/*changes*/ at++; SETFLOAT(at, rad[0] * m2ms); outlet_anything(x->x_direct_out, x->x_s_del0, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[1] *m2ms); at++; SETFLOAT(at, rad[2] *m2ms); at++; SETFLOAT(at, rad[3] *m2ms); at++; SETFLOAT(at, rad[4] *m2ms); at++; SETFLOAT(at, rad[5] *m2ms); at++; SETFLOAT(at, rad[6] *m2ms); outlet_anything(x->x_early_out, x->x_s_del1, 7, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, rad[7] *m2ms); at++; SETFLOAT(at, rad[8] *m2ms); at++; SETFLOAT(at, rad[9] *m2ms); at++; SETFLOAT(at, rad[10] *m2ms); at++; SETFLOAT(at, rad[11] *m2ms); at++; SETFLOAT(at, rad[12] *m2ms); at++; SETFLOAT(at, rad[13] *m2ms); at++; SETFLOAT(at, rad[14] *m2ms); at++; SETFLOAT(at, rad[15] *m2ms); at++; SETFLOAT(at, rad[16] *m2ms); at++; SETFLOAT(at, rad[17] *m2ms); at++; SETFLOAT(at, rad[18] *m2ms); at++; SETFLOAT(at, rad[19] *m2ms); at++; SETFLOAT(at, rad[20] *m2ms); at++; SETFLOAT(at, rad[21] *m2ms); at++; SETFLOAT(at, rad[22] *m2ms); at++; SETFLOAT(at, rad[23] *m2ms); at++; SETFLOAT(at, rad[24] *m2ms); outlet_anything(x->x_early_out, x->x_s_del2, 19, x->x_para_at); /* daempfungs-reihenfolge: 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[0]); outlet_anything(x->x_direct_out, x->x_s_damp, 2, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, r_ambi / rad[1]); at++; SETFLOAT(at, r_ambi / rad[2]); at++; SETFLOAT(at, r_ambi / rad[3]); at++; SETFLOAT(at, r_ambi / rad[4]); at++; SETFLOAT(at, r_ambi / rad[5]); at++; SETFLOAT(at, r_ambi / rad[6]); at++; SETFLOAT(at, r_ambi / rad[7]); at++; SETFLOAT(at, r_ambi / rad[8]); at++; SETFLOAT(at, r_ambi / rad[9]); at++; SETFLOAT(at, r_ambi / rad[10]); at++; SETFLOAT(at, r_ambi / rad[11]); at++; SETFLOAT(at, r_ambi / rad[12]); at++; SETFLOAT(at, r_ambi / rad[13]); at++; SETFLOAT(at, r_ambi / rad[14]); at++; SETFLOAT(at, r_ambi / rad[15]); at++; SETFLOAT(at, r_ambi / rad[16]); at++; SETFLOAT(at, r_ambi / rad[17]); at++; SETFLOAT(at, r_ambi / rad[18]); at++; SETFLOAT(at, r_ambi / rad[19]); at++; SETFLOAT(at, r_ambi / rad[20]); at++; SETFLOAT(at, r_ambi / rad[21]); at++; SETFLOAT(at, r_ambi / rad[22]); at++; SETFLOAT(at, r_ambi / rad[23]); at++; SETFLOAT(at, r_ambi / rad[24]); outlet_anything(x->x_early_out, x->x_s_damp, 25, x->x_para_at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ at = x->x_para_at+1; SETFLOAT(at, early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, z0)); at++; SETFLOAT(at, early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, z0)); outlet_anything(x->x_direct_out, x->x_s_index_delta_phi, 3, x->x_para_at); /* encoder-winkel-reihenfolge: bundle 0, +1x, +1y, +1z, -1x, -1y, -1z +2x, +2y, +2z, -2x, -2y, -2z +1x+1y, +1x+1z, +1y+1z -1x-1y, -1x-1z, -1y-1z +1x-1y, +1x-1z, +1y-1z -1x+1y, -1x+1z, -1y+1z */ delta[0] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, y0_, z0); phi[0] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, y0_, z0); delta[1] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp1, z0); phi[1] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp1, z0); delta[2] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zp1); phi[2] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp1); delta[3] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, y0_, z0); phi[3] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, y0_, z0); delta[4] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn1, z0); phi[4] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn1, z0); delta[5] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zn1); phi[5] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn1); delta[6] = early_reflections_3d_calc_elevation(x_180_over_pi, xp2, y0_, z0); phi[6] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp2, y0_, z0); delta[7] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp2, z0); phi[7] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp2, z0); delta[8] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zp2); phi[8] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zp2); delta[9] = early_reflections_3d_calc_elevation(x_180_over_pi, xn2, y0_, z0); phi[9] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn2, y0_, z0); delta[10] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn2, z0); phi[10] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn2, z0); delta[11] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, y0_, zn2); phi[11] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, y0_, zn2); delta[12] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, yp1, z0); phi[12] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, yp1, z0); delta[13] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, y0_, zp1); phi[13] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zp1); delta[14] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp1, zp1); phi[14] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp1, zp1); delta[15] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, yn1, z0); phi[15] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, yn1, z0); delta[16] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, y0_, zn1); phi[16] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zn1); delta[17] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn1, zn1); phi[17] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn1, zn1); delta[18] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, yn1, z0); phi[18] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, yn1, z0); delta[19] = early_reflections_3d_calc_elevation(x_180_over_pi, xp1, y0_, zn1); phi[19] = early_reflections_3d_calc_azimuth(x_180_over_pi, xp1, y0_, zn1); delta[20] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yp1, zn1); phi[20] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yp1, zn1); delta[21] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, yp1, z0); phi[21] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, yp1, z0); delta[22] = early_reflections_3d_calc_elevation(x_180_over_pi, xn1, y0_, zp1); phi[22] = early_reflections_3d_calc_azimuth(x_180_over_pi, xn1, y0_, zp1); delta[23] = early_reflections_3d_calc_elevation(x_180_over_pi, x0, yn1, zp1); phi[23] = early_reflections_3d_calc_azimuth(x_180_over_pi, x0, yn1, zp1); if(x->x_bundle) { at = x->x_para_at+1; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[0], phi[0])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[1], phi[1])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[2], phi[2])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[3], phi[3])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[4], phi[4])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[5], phi[5])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[6], phi[6])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[7], phi[7])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[8], phi[8])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[9], phi[9])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[10], phi[10])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[11], phi[11])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[12], phi[12])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[13], phi[13])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[14], phi[14])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[15], phi[15])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[16], phi[16])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[17], phi[17])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[18], phi[18])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[19], phi[19])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[20], phi[20])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[21], phi[21])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[22], phi[22])); at++; SETFLOAT(at, early_reflections_3d_calc_bundle_index(delta[23], phi[23])); outlet_anything(x->x_early_out, x->x_s_bundle, 25, x->x_para_at); } at = x->x_para_at+1; SETFLOAT(at, 1.0f); at++; SETFLOAT(at, delta[0]); at++; SETFLOAT(at, phi[0]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 2.0f); at++; SETFLOAT(at, delta[1]); at++; SETFLOAT(at, phi[1]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 3.0f); at++; SETFLOAT(at, delta[2]); at++; SETFLOAT(at, phi[2]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 4.0f); at++; SETFLOAT(at, delta[3]); at++; SETFLOAT(at, phi[3]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 5.0f); at++; SETFLOAT(at, delta[4]); at++; SETFLOAT(at, phi[4]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 6.0f); at++; SETFLOAT(at, delta[5]); at++; SETFLOAT(at, phi[5]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 7.0f); at++; SETFLOAT(at, delta[6]); at++; SETFLOAT(at, phi[6]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 8.0f); at++; SETFLOAT(at, delta[7]); at++; SETFLOAT(at, phi[7]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 9.0f); at++; SETFLOAT(at, delta[8]); at++; SETFLOAT(at, phi[8]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 10.0f); at++; SETFLOAT(at, delta[9]); at++; SETFLOAT(at, phi[9]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 11.0f); at++; SETFLOAT(at, delta[10]); at++; SETFLOAT(at, phi[10]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 12.0f); at++; SETFLOAT(at, delta[11]); at++; SETFLOAT(at, phi[11]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 13.0f); at++; SETFLOAT(at, delta[12]); at++; SETFLOAT(at, phi[12]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 14.0f); at++; SETFLOAT(at, delta[13]); at++; SETFLOAT(at, phi[13]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 15.0f); at++; SETFLOAT(at, delta[14]); at++; SETFLOAT(at, phi[14]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 16.0f); at++; SETFLOAT(at, delta[15]); at++; SETFLOAT(at, phi[15]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 17.0f); at++; SETFLOAT(at, delta[16]); at++; SETFLOAT(at, phi[16]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 18.0f); at++; SETFLOAT(at, delta[17]); at++; SETFLOAT(at, phi[17]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 19.0f); at++; SETFLOAT(at, delta[18]); at++; SETFLOAT(at, phi[18]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 20.0f); at++; SETFLOAT(at, delta[19]); at++; SETFLOAT(at, phi[19]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 21.0f); at++; SETFLOAT(at, delta[20]); at++; SETFLOAT(at, phi[20]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 22.0f); at++; SETFLOAT(at, delta[21]); at++; SETFLOAT(at, phi[21]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 23.0f); at++; SETFLOAT(at, delta[22]); at++; SETFLOAT(at, phi[22]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); at = x->x_para_at+1; SETFLOAT(at, 24.0f); at++; SETFLOAT(at, delta[23]); at++; SETFLOAT(at, phi[23]); outlet_anything(x->x_early_out, x->x_s_index_delta_phi, 4, x->x_para_at); } } static void early_reflections_3d_dump_para(t_early_reflections_3d *x) { int i, n=x->x_n_src; post("*******************************************************************************"); post("room-dimensions: L_x = %.3f, W_y = %.3f, H_z = %.3f", x->x_room_x, x->x_room_y, x->x_room_z); post("hear-position: x_hear = %.3f, y_hear = %.3f, z_hear = %.3f", x->x_head_x, x->x_head_y, x->x_head_z); for(i=0; ix_src_x[i], i+1, x->x_src_y[i], i+1, x->x_src_z[i], i+1); post("ambisonic-radius: %f", x->x_r_ambi); post("sonic-speed: %.3f", x->x_speed); post("order of outputs: direct early rev"); post("*******************************************************************************"); } static void early_reflections_3d_para(t_early_reflections_3d *x, t_symbol *s, int argc, t_atom *argv) { int i, n=x->x_n_src*3 + 7;/* r_ambi + 3*room + 3*head */ if(argc != n) { post("early_reflections_3d ERROR: para needs 1 r_ambi + 3*room + 3*head +n*3*src"); return; } x->x_r_ambi = atom_getfloat(argv++); x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_room_z = atom_getfloat(argv++); x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); x->x_head_z = atom_getfloat(argv++); n = x->x_n_src; for(i=0; ix_src_x[i] = atom_getfloat(argv++); x->x_src_y[i] = atom_getfloat(argv++); x->x_src_z[i] = atom_getfloat(argv++); } early_reflections_3d_doit(x); } static void early_reflections_3d_sonic_speed(t_early_reflections_3d *x, t_floatarg speed) { if(speed < 300.0f) speed = 300.0f; if(speed > 400.0f) speed = 400.0f; x->x_speed = speed; } static void early_reflections_3d_bundle(t_early_reflections_3d *x, t_floatarg bundle) { if(bundle == 0.0f) x->x_bundle = 0; else x->x_bundle = 1; } static void early_reflections_3d_free(t_early_reflections_3d *x) { } static void *early_reflections_3d_new(t_floatarg fn_src) { int i, n; t_early_reflections_3d *x = (t_early_reflections_3d *)pd_new(early_reflections_3d_class); n = (int)fn_src; if(n < 1) n = 1; if(n > 30) n = 30; x->x_n_src = n; x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_room_z = 4.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_head_z = 1.7f; for(i=0; ix_src_x[i] = 3.0f; x->x_src_y[i] = 0.5f; x->x_src_z[i] = 2.5f; } x->x_r_ambi = 1.4f; x->x_speed = 340.0f; x->x_s_del0 = gensym("del0"); x->x_s_del1 = gensym("del1"); x->x_s_del2 = gensym("del2"); x->x_s_damp = gensym("damp"); x->x_s_index_delta_phi = gensym("index_delta_phi"); x->x_s_bundle = gensym("bundle"); x->x_direct_out = outlet_new(&x->x_obj, &s_list); x->x_early_out = outlet_new(&x->x_obj, &s_list); x->x_rev_out = outlet_new(&x->x_obj, &s_list); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); x->x_bundle = 0; return (x); } void early_reflections_3d_setup(void) { early_reflections_3d_class = class_new(gensym("early_reflections_3d"), (t_newmethod)early_reflections_3d_new, (t_method)early_reflections_3d_free, sizeof(t_early_reflections_3d), 0, A_DEFFLOAT, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_para, gensym("para"), A_GIMME, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_bundle, gensym("bundle"), A_FLOAT, 0); class_addmethod(early_reflections_3d_class, (t_method)early_reflections_3d_dump_para, gensym("dump_para"), 0); // class_sethelpsymbol(early_reflections_3d_class, gensym("iemhelp2/early_reflections_3d-help")); } iem_utils-0.0.20240903/iem_roomsim/src/iem_roomsim.c0000600000000000000000000000265014665566711017000 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" static t_class *iem_roomsim_class; static void *iem_roomsim_new(void) { t_object *x = (t_object *)pd_new(iem_roomsim_class); return (x); } void early_reflections_3d_setup(void); void early_reflections_2d_setup(void); void cart2del_damp_2d_setup(void); void cart2del_damp_3d_setup(void); //void xy_2_del_damp_phi_setup(void); //void xyz_3_del_damp_theta_phi_setup(void); void n_delay1p_line_tilde_setup(void); void n_delay2p_line_tilde_setup(void); void nz_tilde_setup(void); void block_delay_tilde_setup(void); void block_lp1_tilde_setup(void); void block_peak_env_tilde_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_roomsim_setup(void) { early_reflections_3d_setup(); early_reflections_2d_setup(); cart2del_damp_2d_setup(); cart2del_damp_3d_setup(); // xy_2_del_damp_phi_setup(); // xyz_3_del_damp_theta_phi_setup(); n_delay1p_line_tilde_setup(); n_delay2p_line_tilde_setup(); nz_tilde_setup(); block_delay_tilde_setup(); block_lp1_tilde_setup(); block_peak_env_tilde_setup(); post("iem_roomsim (1.21) library loaded! (c) Thomas Musil "BUILD_DATE); post(" musil%ciem.at iem KUG Graz Austria", '@'); } iem_utils-0.0.20240903/iem_roomsim/src/iem_roomsim.dsp0000600000000000000000000000512614665566711017345 0ustar00# Microsoft Developer Studio Project File - Name="iem_roomsim" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_roomsim - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_roomsim.mak" CFG="iem_roomsim - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_roomsim - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_roomsim - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_roomsim - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_roomsim.exe" # PROP Bsc_Name "iem_roomsim.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_roomsim - Win32 Release" # Name "iem_roomsim - Win32 Debug" !IF "$(CFG)" == "iem_roomsim - Win32 Release" !ELSEIF "$(CFG)" == "iem_roomsim - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_vc12proj # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_roomsim/src/iem_roomsim.dsw0000600000000000000000000000107514665566711017353 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_roomsim"=.\iem_roomsim.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_roomsim/src/iem_roomsim.sln0000600000000000000000000000157014665566711017352 0ustar00 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_roomsim", "iem_roomsim.vcxproj", "{3446FCA3-769E-4EFC-8B8C-CF16D637040A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3446FCA3-769E-4EFC-8B8C-CF16D637040A}.Debug|Win32.ActiveCfg = Debug|Win32 {3446FCA3-769E-4EFC-8B8C-CF16D637040A}.Debug|Win32.Build.0 = Debug|Win32 {3446FCA3-769E-4EFC-8B8C-CF16D637040A}.Release|Win32.ActiveCfg = Release|Win32 {3446FCA3-769E-4EFC-8B8C-CF16D637040A}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_roomsim/src/iem_roomsim.vcxproj0000600000000000000000000000612314665566711020250 0ustar00 Debug Win32 Release Win32 MakeFileProj {3446FCA3-769E-4EFC-8B8C-CF16D637040A} Makefile v110 Makefile v110 .\Debug\ .\Debug\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_roomsim.exe .\Release\ .\Release\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_roomsim.exe iem_utils-0.0.20240903/iem_roomsim/src/makefile_d_fat0000600000000000000000000000215014665566711017145 0ustar00current: all .SUFFIXES: .d_fat # PDSOURCE = "/Applications/Pd.app/Contents/Resources/src" PDSOURCE = "../../../Pd-0.48-1.app/Contents/Resources/src" PD_INCLUDES = -I. -I$(PDSOURCE) PD_DEFINES = -DPD CFLAGS =-O2 -Wall -W -Wshadow -Wstrict-prototypes \ -Wno-unused -Wno-parentheses -Wno-switch -fPIC LFLAGS = -bundle -undefined suppress -flat_namespace ARCH_FLAGS=-arch i386 -arch x86_64 # the sources SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ xy_2_del_damp_phi.c \ xyz_3_del_damp_theta_phi.c \ n_delay1p_line~.c \ n_delay2p_line~.c \ nz~.c \ block_delay~.c \ block_lp1~.c \ block_peak_env~.c \ iem_roomsim.c TARGET = iem_roomsim.d_fat OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ # clean: rm -f ../$(TARGET) rm -f *.o all: $(OBJ) @echo :: $(OBJ) $(CC) $(ARCH_FLAGS) $(LFLAGS) -o $(TARGET) *.o strip -S -x $(TARGET) mv $(TARGET) .. $(OBJ) : %.o : %.c $(CC) $(ARCH_FLAGS) $(PD_DEFINES) $(CFLAGS) $(PD_INCLUDES) -c -o $*.o $*.c iem_utils-0.0.20240903/iem_roomsim/src/makefile_vc12proj0000600000000000000000000000227214665566711017543 0ustar00TARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_COMP = cl VIS_CPP_LINK = link VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 11.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Windows Kits\8.1" PD_INST_PATH = "$(PROGRAMFILES)\pd-0.48-1" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include /I..\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\Lib\winv6.3\um\x86\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ # xy_2_del_damp_phi.c \ # xyz_3_del_damp_theta_phi.c \ n_delay1p_line~.c \ n_delay2p_line~.c \ nz~.c \ block_delay~.c \ block_lp1~.c \ block_peak_env~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: $(VIS_CPP_COMP) $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) $(VIS_CPP_LINK) $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_roomsim/src/makefile_vc9proj0000600000000000000000000000176114665566711017473 0ustar00TARGET = iem_roomsim all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_roomsim/src/makefile_win0000600000000000000000000000202014665566711016661 0ustar00 all: ..\iem_roomsim.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pthreadVC.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = early_reflections_3d.c \ early_reflections_2d.c \ cart2del_damp_2d.c \ cart2del_damp_3d.c \ iem_roomsim.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_roomsim.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_roomsim_setup \ /out:..\iem_roomsim.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_roomsim/src/n_delay1p_line~.c0000600000000000000000000002474114665566711017547 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ /* no good, hat schwirigkeiten bei help patch, kontinuierlich die formanten interpolation zu schaffen */ #include "m_pd.h" #include "iemlib.h" #include "iem_roomsim.h" /* -------------------------- n_delay1p_line_tilde~ ------------------------------ */ /* ----------- n non interpolated line~-signal driven delay taps ------------- */ static t_class *n_delay1p_line_tilde_class; typedef struct _n_delay1p_line_tilde { t_object x_obj; int x_mallocsize; t_float x_max_delay_ms; t_sample *x_begmem1; t_sample *x_begmem2; int x_writeindex; int x_n_delays; int *x_del_samp256_end; int *x_del_samp256_cur; int *x_inc256; int *x_biginc256; int x_blocksize; t_float x_sr; t_float x_ms2tick; t_float x_ms2samples256; t_float x_interpol_ms; int x_interpol_ticks; int x_ticksleft; int x_old; int x_retarget; t_sample **x_io; t_float x_scalar_sig_in; } t_n_delay1p_line_tilde; static void n_delay1p_line_tilde_list(t_n_delay1p_line_tilde *x, t_symbol *s, int argc, t_atom *argv) { if(argc == x->x_n_delays) { int i; t_float delay, max=x->x_max_delay_ms; if(x->x_interpol_ms <= (t_float)0.0) x->x_ticksleft = x->x_retarget = 0; else x->x_retarget = 1; for(i=0; i max) delay = max; if(x->x_interpol_ms <= (t_float)0.0) x->x_del_samp256_end[i] = x->x_del_samp256_cur[i] = (int)(x->x_ms2samples256 * delay + (t_float)0.5) + 127; else x->x_del_samp256_end[i] = (int)(x->x_ms2samples256 * delay + (t_float)0.5) + 127; } } } static void n_delay1p_line_tilde_time(t_n_delay1p_line_tilde *x, t_floatarg interpol_ms) { if(interpol_ms < (t_float)0.0) interpol_ms = (t_float)0.0; x->x_interpol_ms = interpol_ms; x->x_interpol_ticks = (int)(x->x_ms2tick * interpol_ms); } static void n_delay1p_line_tilde_stop(t_n_delay1p_line_tilde *x) { int i, n=x->x_n_delays; for(i=0; ix_del_samp256_end[i] = x->x_del_samp256_cur[i]; x->x_ticksleft = x->x_retarget = 0; } static t_int *n_delay1p_line_tilde_perform(t_int *w) { t_n_delay1p_line_tilde *x = (t_n_delay1p_line_tilde *)(w[1]); int hn=(int)(w[2]); int nout=x->x_n_delays; t_sample *in; t_sample *out; int writeindex = x->x_writeindex; int i, j, n; int malloc_samples = x->x_mallocsize; t_sample *begvec1 = x->x_begmem1; t_sample *begvec2 = x->x_begmem2; t_sample *writevec; t_sample *readvec; int del256, inc256; begvec1 += writeindex; writevec = begvec2 + writeindex; in=x->x_io[0]; n = hn; while(n--) { *begvec1++ = *in; *writevec++ = *in++; } if(x->x_retarget) { int nticks = x->x_interpol_ticks; if(!nticks) nticks = 1; x->x_ticksleft = nticks; for(j=0; jx_biginc256[j] = (x->x_del_samp256_end[j] - x->x_del_samp256_cur[j]) / nticks; x->x_inc256[j] = x->x_biginc256[j] / x->x_blocksize; } x->x_retarget = 0; } if(x->x_ticksleft) { for(j=0; jx_inc256[j]; del256 = x->x_del_samp256_cur[j]; out = x->x_io[j+1]; for(i=0; i> 8) + i; *out++ = *readvec; del256 += inc256; } x->x_del_samp256_cur[j] += x->x_biginc256[j]; } x->x_ticksleft--; } else { for(j=0; jx_del_samp256_cur[j] = x->x_del_samp256_end[j]; readvec = begvec2 + writeindex - (del256 >> 8); out = x->x_io[j+1]; n = hn; while(n--) { *out++ = *readvec++; } } } writeindex += hn; if(writeindex >= malloc_samples) { writeindex -= malloc_samples; } x->x_writeindex = writeindex; return(w+3); } static t_int *n_delay1p_line_tilde_perf8(t_int *w) { t_n_delay1p_line_tilde *x = (t_n_delay1p_line_tilde *)(w[1]); int hn=(int)(w[2]); int nout=x->x_n_delays; t_sample *in; t_sample *out; int writeindex = x->x_writeindex; int i, j, k, n; int malloc_samples = x->x_mallocsize; t_sample *begvec1 = x->x_begmem1; t_sample *begvec2 = x->x_begmem2; t_sample *writevec; t_sample *readvec; int del256, inc256; // post("writevec = %d",writeindex); begvec1 += writeindex; writevec = begvec2 + writeindex; in=x->x_io[0]; n = hn; while(n) { begvec1[0] = in[0]; begvec1[1] = in[1]; begvec1[2] = in[2]; begvec1[3] = in[3]; begvec1[4] = in[4]; begvec1[5] = in[5]; begvec1[6] = in[6]; begvec1[7] = in[7]; writevec[0] = in[0]; writevec[1] = in[1]; writevec[2] = in[2]; writevec[3] = in[3]; writevec[4] = in[4]; writevec[5] = in[5]; writevec[6] = in[6]; writevec[7] = in[7]; begvec1 += 8; writevec += 8; n -= 8; in += 8; } if(x->x_retarget) { int nticks = x->x_interpol_ticks; if(!nticks) nticks = 1; x->x_ticksleft = nticks; for(j=0; jx_biginc256[j] = (x->x_del_samp256_end[j] - x->x_del_samp256_cur[j]) / nticks; x->x_inc256[j] = x->x_biginc256[j] / x->x_blocksize; } x->x_retarget = 0; } if(x->x_ticksleft) { for(j=0; jx_inc256[j]; del256 = x->x_del_samp256_cur[j]; out = x->x_io[j+1]; readvec = begvec2 + writeindex; for(i=0; i> 8; out[0] = readvec[0-k]; del256 += inc256; k = del256 >> 8; out[1] = readvec[1-k]; del256 += inc256; k = del256 >> 8; out[2] = readvec[2-k]; del256 += inc256; k = del256 >> 8; out[3] = readvec[3-k]; del256 += inc256; k = del256 >> 8; out[4] = readvec[4-k]; del256 += inc256; k = del256 >> 8; out[5] = readvec[5-k]; del256 += inc256; k = del256 >> 8; out[6] = readvec[6-k]; del256 += inc256; k = del256 >> 8; out[7] = readvec[7-k]; del256 += inc256; out += 8; readvec += 8; } x->x_del_samp256_cur[j] += x->x_biginc256[j]; } x->x_ticksleft--; } else { for(j=0; jx_del_samp256_cur[j] = x->x_del_samp256_end[j]; readvec = begvec2 + writeindex - (del256 >> 8); out = x->x_io[j+1]; n = hn; while(n) { out[0] = readvec[0]; out[1] = readvec[1]; out[2] = readvec[2]; out[3] = readvec[3]; out[4] = readvec[4]; out[5] = readvec[5]; out[6] = readvec[6]; out[7] = readvec[7]; out += 8; readvec += 8; n -= 8; } } } writeindex += hn; if(writeindex >= malloc_samples) { writeindex -= malloc_samples; } x->x_writeindex = writeindex; return(w+3); } static void n_delay1p_line_tilde_dsp(t_n_delay1p_line_tilde *x, t_signal **sp) { int n = sp[0]->s_n; int i, nd = x->x_n_delays + 1; if(!x->x_blocksize)/*first time*/ { int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * (t_float)0.001; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (n - 1)); nsamps += n; x->x_mallocsize = nsamps; x->x_begmem1 = (t_sample *)getbytes(2 * x->x_mallocsize * sizeof(t_sample)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = n; } else if((x->x_blocksize != n) || ((t_float)sp[0]->s_sr != x->x_sr)) { int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * (t_float)0.001; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (n - 1)); nsamps += n; x->x_begmem1 = (t_sample *)resizebytes(x->x_begmem1, 2*x->x_mallocsize*sizeof(t_sample), 2*nsamps*sizeof(t_sample)); x->x_mallocsize = nsamps; x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; if(x->x_writeindex >= nsamps) x->x_writeindex -= nsamps; } x->x_blocksize = n; x->x_ms2tick = (t_float)0.001 * (t_float)sp[0]->s_sr / (t_float)n; x->x_ms2samples256 = (t_float)0.256 * (t_float)sp[0]->s_sr; x->x_interpol_ticks = (int)(x->x_ms2tick * x->x_interpol_ms); for(i=0; ix_io[i] = sp[i]->s_vec; if(n&7) dsp_add(n_delay1p_line_tilde_perform, 2, x, n); else dsp_add(n_delay1p_line_tilde_perf8, 2, x, n); } static void *n_delay1p_line_tilde_new(t_floatarg fout, t_floatarg delay_ms, t_floatarg interpol_ms) { t_n_delay1p_line_tilde *x = (t_n_delay1p_line_tilde *)pd_new(n_delay1p_line_tilde_class); int i, n_out = (int)fout; int nsamps = delay_ms * sys_getsr() * (t_float)0.001; if(n_out < 1) n_out = 1; x->x_n_delays = n_out; x->x_max_delay_ms = delay_ms; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (DELLINE_DEF_VEC_SIZE - 1)); nsamps += DELLINE_DEF_VEC_SIZE; x->x_mallocsize = nsamps; x->x_begmem1 = (t_sample *)getbytes(2 * x->x_mallocsize * sizeof(t_sample)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = DELLINE_DEF_VEC_SIZE; x->x_blocksize = 0; x->x_sr = (t_float)0.0; if(interpol_ms < (t_float)0.0) interpol_ms = (t_float)0.0; x->x_interpol_ms = interpol_ms; x->x_io = (t_sample **)getbytes((x->x_n_delays + 1) * sizeof(t_sample *)); for(i=0; ix_obj, &s_signal); x->x_del_samp256_end = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_del_samp256_cur = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_inc256 = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_biginc256 = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_ticksleft = x->x_retarget = 0; for(i=0; ix_del_samp256_cur[i] = x->x_del_samp256_end[i] = 0; x->x_inc256[i] = x->x_biginc256[i] = 0; } x->x_interpol_ticks = 0; x->x_scalar_sig_in = (t_float)0.0; return (x); } static void n_delay1p_line_tilde_free(t_n_delay1p_line_tilde *x) { freebytes(x->x_del_samp256_end, x->x_n_delays * sizeof(int)); freebytes(x->x_del_samp256_cur, x->x_n_delays * sizeof(int)); freebytes(x->x_inc256, x->x_n_delays * sizeof(int)); freebytes(x->x_biginc256, x->x_n_delays * sizeof(int)); freebytes(x->x_io, (x->x_n_delays + 1) * sizeof(t_sample *)); freebytes(x->x_begmem1, 2 * x->x_mallocsize * sizeof(t_sample)); } void n_delay1p_line_tilde_setup(void) { n_delay1p_line_tilde_class = class_new(gensym("n_delay1p_line~"), (t_newmethod)n_delay1p_line_tilde_new, (t_method)n_delay1p_line_tilde_free, sizeof(t_n_delay1p_line_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(n_delay1p_line_tilde_class, t_n_delay1p_line_tilde, x_scalar_sig_in); class_addlist(n_delay1p_line_tilde_class, (t_method)n_delay1p_line_tilde_list); class_addmethod(n_delay1p_line_tilde_class, (t_method)n_delay1p_line_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(n_delay1p_line_tilde_class, (t_method)n_delay1p_line_tilde_stop, gensym("stop"), 0); class_addmethod(n_delay1p_line_tilde_class, (t_method)n_delay1p_line_tilde_time, gensym("time"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/n_delay2p_line~.c0000600000000000000000000002765614665566711017560 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include "iem_roomsim.h" /* -------------------------- n_delay2p_line_tilde~ ------------------------------ */ /* ----------- n 2-point interpolated line~-signal driven delay taps ------------- */ static t_class *n_delay2p_line_tilde_class; t_float n_delay2p_line_tilde_256f[258]; typedef struct _n_delay2p_line_tilde { t_object x_obj; int x_mallocsize; t_float x_max_delay_ms; t_sample *x_begmem1; t_sample *x_begmem2; int x_writeindex; int x_n_delays; int *x_del_samp256_end; int *x_del_samp256_cur; int *x_inc256; int *x_biginc256; int x_blocksize; t_float x_sr; t_float x_ms2tick; t_float x_ms2samples256; t_float x_interpol_ms; int x_interpol_ticks; int x_ticksleft; int x_old; int x_retarget; t_sample **x_io; t_float x_scalar_sig_in; } t_n_delay2p_line_tilde; static void n_delay2p_line_tilde_init_f(t_n_delay2p_line_tilde *x) { if(n_delay2p_line_tilde_256f[257] == (t_float)0.0) { int i; for(i=0; i<257; i++) { n_delay2p_line_tilde_256f[i] = (t_float)i / (t_float)256.0; } n_delay2p_line_tilde_256f[257] = (t_float)1.0; } } static void n_delay2p_line_tilde_list(t_n_delay2p_line_tilde *x, t_symbol *s, int argc, t_atom *argv) { if(argc == x->x_n_delays) { int i; t_float delay, max=x->x_max_delay_ms; if(x->x_interpol_ms <= (t_float)0.0) x->x_ticksleft = x->x_retarget = 0; else x->x_retarget = 1; for(i=0; i max) delay = max; if(x->x_interpol_ms <= (t_float)0.0) x->x_del_samp256_end[i] = x->x_del_samp256_cur[i] = (int)(x->x_ms2samples256 * delay + (t_float)0.5) + 127; else x->x_del_samp256_end[i] = (int)(x->x_ms2samples256 * delay + (t_float)0.5) + 127; } } } static void n_delay2p_line_tilde_time(t_n_delay2p_line_tilde *x, t_floatarg interpol_ms) { if(interpol_ms < (t_float)0.0) interpol_ms = (t_float)0.0; x->x_interpol_ms = interpol_ms; x->x_interpol_ticks = (int)(x->x_ms2tick * interpol_ms); } static void n_delay2p_line_tilde_stop(t_n_delay2p_line_tilde *x) { int i, n=x->x_n_delays; for(i=0; ix_del_samp256_end[i] = x->x_del_samp256_cur[i]; x->x_ticksleft = x->x_retarget = 0; } static t_int *n_delay2p_line_tilde_perform(t_int *w) { t_n_delay2p_line_tilde *x = (t_n_delay2p_line_tilde *)(w[1]); int hn=(int)(w[2]); int nout=x->x_n_delays; t_sample *in; t_sample *out; int writeindex = x->x_writeindex; int i, j, n, fractindex; int malloc_samples = x->x_mallocsize; t_sample *begvec1 = x->x_begmem1; t_sample *begvec2 = x->x_begmem2; t_sample *writevec; t_sample *readvec; t_float fract; int del256, inc256; begvec1 += writeindex; writevec = begvec2 + writeindex; in=x->x_io[0]; n = hn; while(n--) { *begvec1++ = *in; *writevec++ = *in++; } if(x->x_retarget) { int nticks = x->x_interpol_ticks; if(!nticks) nticks = 1; x->x_ticksleft = nticks; for(j=0; jx_biginc256[j] = (x->x_del_samp256_end[j] - x->x_del_samp256_cur[j]) / nticks; x->x_inc256[j] = x->x_biginc256[j] / x->x_blocksize; } x->x_retarget = 0; } if(x->x_ticksleft) { for(j=0; jx_inc256[j]; del256 = x->x_del_samp256_cur[j]; out = x->x_io[j+1]; for(i=0; i> 8) + i; *out++ = readvec[0] - (readvec[0] - readvec[-1])*(t_sample)fract; del256 += inc256; } x->x_del_samp256_cur[j] += x->x_biginc256[j]; } x->x_ticksleft--; } else { for(j=0; jx_del_samp256_cur[j] = x->x_del_samp256_end[j]; readvec = begvec2 + writeindex - (del256 >> 8); out = x->x_io[j+1]; n = hn; while(n--) { *out++ = *readvec++; } } } writeindex += hn; if(writeindex >= malloc_samples) { writeindex -= malloc_samples; } x->x_writeindex = writeindex; return(w+3); } static t_int *n_delay2p_line_tilde_perf8(t_int *w) { t_n_delay2p_line_tilde *x = (t_n_delay2p_line_tilde *)(w[1]); int hn=(int)(w[2]); int nout=x->x_n_delays; t_sample *in; t_sample *out; int writeindex = x->x_writeindex; int i, j, k, n, fractindex; int malloc_samples = x->x_mallocsize; t_sample *begvec1 = x->x_begmem1; t_sample *begvec2 = x->x_begmem2; t_sample *writevec; t_sample *readvec; t_float fract; int del256, inc256; // post("writevec = %d",writeindex); begvec1 += writeindex; writevec = begvec2 + writeindex; in=x->x_io[0]; n = hn; while(n) { begvec1[0] = in[0]; begvec1[1] = in[1]; begvec1[2] = in[2]; begvec1[3] = in[3]; begvec1[4] = in[4]; begvec1[5] = in[5]; begvec1[6] = in[6]; begvec1[7] = in[7]; writevec[0] = in[0]; writevec[1] = in[1]; writevec[2] = in[2]; writevec[3] = in[3]; writevec[4] = in[4]; writevec[5] = in[5]; writevec[6] = in[6]; writevec[7] = in[7]; begvec1 += 8; writevec += 8; n -= 8; in += 8; } if(x->x_retarget) { int nticks = x->x_interpol_ticks; if(!nticks) nticks = 1; x->x_ticksleft = nticks; for(j=0; jx_biginc256[j] = (x->x_del_samp256_end[j] - x->x_del_samp256_cur[j]) / nticks; x->x_inc256[j] = x->x_biginc256[j] / x->x_blocksize; } x->x_retarget = 0; } if(x->x_ticksleft) { for(j=0; jx_inc256[j]; del256 = x->x_del_samp256_cur[j]; out = x->x_io[j+1]; readvec = begvec2 + writeindex; for(i=0; i> 8; out[0] = readvec[0-k] - (readvec[0-k] - readvec[-1-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[1] = readvec[1-k] - (readvec[1-k] - readvec[0-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[2] = readvec[2-k] - (readvec[2-k] - readvec[1-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[3] = readvec[3-k] - (readvec[3-k] - readvec[2-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[4] = readvec[4-k] - (readvec[4-k] - readvec[3-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[5] = readvec[5-k] - (readvec[5-k] - readvec[4-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[6] = readvec[6-k] - (readvec[6-k] - readvec[5-k])*(t_sample)fract; del256 += inc256; fractindex = del256 & 0xff; fract = n_delay2p_line_tilde_256f[fractindex]; k = del256 >> 8; out[7] = readvec[7-k] - (readvec[7-k] - readvec[6-k])*(t_sample)fract; del256 += inc256; out += 8; readvec += 8; } x->x_del_samp256_cur[j] += x->x_biginc256[j]; } x->x_ticksleft--; } else { for(j=0; jx_del_samp256_cur[j] = x->x_del_samp256_end[j]; readvec = begvec2 + writeindex - (del256 >> 8); out = x->x_io[j+1]; n = hn; while(n) { out[0] = readvec[0]; out[1] = readvec[1]; out[2] = readvec[2]; out[3] = readvec[3]; out[4] = readvec[4]; out[5] = readvec[5]; out[6] = readvec[6]; out[7] = readvec[7]; out += 8; readvec += 8; n -= 8; } } } writeindex += hn; if(writeindex >= malloc_samples) { writeindex -= malloc_samples; } x->x_writeindex = writeindex; return(w+3); } static void n_delay2p_line_tilde_dsp(t_n_delay2p_line_tilde *x, t_signal **sp) { int n = sp[0]->s_n; int i, nd = x->x_n_delays + 1; if(!x->x_blocksize)/*first time*/ { int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * (t_float)0.001; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (n - 1)); nsamps += n; x->x_mallocsize = nsamps; x->x_begmem1 = (t_sample *)getbytes(2 * x->x_mallocsize * sizeof(t_sample)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = n; } else if((x->x_blocksize != n) || ((t_float)sp[0]->s_sr != x->x_sr)) { int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * (t_float)0.001; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (n - 1)); nsamps += n; x->x_begmem1 = (t_sample *)resizebytes(x->x_begmem1, 2*x->x_mallocsize*sizeof(t_sample), 2*nsamps*sizeof(t_sample)); x->x_mallocsize = nsamps; x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; if(x->x_writeindex >= nsamps) x->x_writeindex -= nsamps; } x->x_blocksize = n; x->x_ms2tick = (t_float)0.001 * (t_float)sp[0]->s_sr / (t_float)n; x->x_ms2samples256 = (t_float)0.256 * (t_float)sp[0]->s_sr; x->x_interpol_ticks = (int)(x->x_ms2tick * x->x_interpol_ms); for(i=0; ix_io[i] = sp[i]->s_vec; if(n&7) dsp_add(n_delay2p_line_tilde_perform, 2, x, n); else dsp_add(n_delay2p_line_tilde_perf8, 2, x, n); } static void *n_delay2p_line_tilde_new(t_floatarg fout, t_floatarg delay_ms, t_floatarg interpol_ms) { t_n_delay2p_line_tilde *x = (t_n_delay2p_line_tilde *)pd_new(n_delay2p_line_tilde_class); int i, n_out = (int)fout; int nsamps = delay_ms * sys_getsr() * (t_float)0.001; if(n_out < 1) n_out = 1; x->x_n_delays = n_out; x->x_max_delay_ms = delay_ms; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (DELLINE_DEF_VEC_SIZE - 1)); nsamps += DELLINE_DEF_VEC_SIZE; x->x_mallocsize = nsamps; x->x_begmem1 = (t_sample *)getbytes(2 * x->x_mallocsize * sizeof(t_sample)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = DELLINE_DEF_VEC_SIZE; x->x_blocksize = 0; x->x_sr = (t_float)0.0; if(interpol_ms < (t_float)0.0) interpol_ms = (t_float)0.0; x->x_interpol_ms = interpol_ms; x->x_io = (t_sample **)getbytes((x->x_n_delays + 1) * sizeof(t_sample *)); for(i=0; ix_obj, &s_signal); x->x_del_samp256_end = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_del_samp256_cur = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_inc256 = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_biginc256 = (int *)getbytes(x->x_n_delays * sizeof(int)); x->x_ticksleft = x->x_retarget = 0; for(i=0; ix_del_samp256_cur[i] = x->x_del_samp256_end[i] = 0; x->x_inc256[i] = x->x_biginc256[i] = 0; } x->x_interpol_ticks = 0; x->x_scalar_sig_in = (t_float)0.0; n_delay2p_line_tilde_init_f(x); return (x); } static void n_delay2p_line_tilde_free(t_n_delay2p_line_tilde *x) { freebytes(x->x_del_samp256_end, x->x_n_delays * sizeof(int)); freebytes(x->x_del_samp256_cur, x->x_n_delays * sizeof(int)); freebytes(x->x_inc256, x->x_n_delays * sizeof(int)); freebytes(x->x_biginc256, x->x_n_delays * sizeof(int)); freebytes(x->x_io, (x->x_n_delays + 1) * sizeof(t_sample *)); freebytes(x->x_begmem1, 2 * x->x_mallocsize * sizeof(t_sample)); } void n_delay2p_line_tilde_setup(void) { n_delay2p_line_tilde_class = class_new(gensym("n_delay2p_line~"), (t_newmethod)n_delay2p_line_tilde_new, (t_method)n_delay2p_line_tilde_free, sizeof(t_n_delay2p_line_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(n_delay2p_line_tilde_class, t_n_delay2p_line_tilde, x_scalar_sig_in); class_addlist(n_delay2p_line_tilde_class, (t_method)n_delay2p_line_tilde_list); class_addmethod(n_delay2p_line_tilde_class, (t_method)n_delay2p_line_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(n_delay2p_line_tilde_class, (t_method)n_delay2p_line_tilde_stop, gensym("stop"), 0); class_addmethod(n_delay2p_line_tilde_class, (t_method)n_delay2p_line_tilde_time, gensym("time"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/nz~.c0000600000000000000000000001305614665566711015310 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include "iem_roomsim.h" /* --------------------------- nz_tilde~ ------------------------------ */ /* --- one delwrite~and several delread~, independend of samplerate --- */ static t_class *nz_tilde_class; typedef struct _nz_tilde { t_object x_obj; t_sample *x_begmem1; t_sample *x_begmem2; int x_mallocsize; int x_max_delay_samples; int x_n_delays; int x_writeindex; int *x_del_samples; int x_blocksize; t_sample **x_io; t_float x_scalar_sig_in; } t_nz_tilde; static void nz_tilde_list(t_nz_tilde *x, t_symbol *s, int argc, t_atom *argv) { if(argc == x->x_n_delays) { int i, delay, max=x->x_max_delay_samples; for(i=0; i max) delay = max; x->x_del_samples[i] = delay; } } else post("nz~-ERROR: list need %d delay-values between 0 and %d samples !!!!", x->x_n_delays, x->x_max_delay_samples); } static t_int *nz_tilde_perform(t_int *w) { t_nz_tilde *x = (t_nz_tilde *)(w[1]); int n=(int)(w[2]); int num_dels=x->x_n_delays; t_sample *in; t_sample *out; int i, j; t_sample *writevec1; t_sample *writevec2; t_sample *readvec; writevec2 = x->x_begmem2 + x->x_writeindex; writevec1 = x->x_begmem1 + x->x_writeindex; in = x->x_io[0]; for(i=0; ix_io[j+1]; readvec = writevec2 - x->x_del_samples[j]; for(i=0; ix_writeindex += n; if(x->x_writeindex >= x->x_mallocsize) x->x_writeindex -= x->x_mallocsize; return(w+3); } static t_int *nz_tilde_perf8(t_int *w) { t_nz_tilde *x = (t_nz_tilde *)(w[1]); int n=(int)(w[2]); int num_dels=x->x_n_delays; t_sample *in; t_sample *out; int i, j; t_sample *writevec1; t_sample *writevec2; t_sample *readvec; writevec2 = x->x_begmem2 + x->x_writeindex; writevec1 = x->x_begmem1 + x->x_writeindex; in = x->x_io[0]; i = n; while(i) { writevec2[0] = in[0]; writevec2[1] = in[1]; writevec2[2] = in[2]; writevec2[3] = in[3]; writevec2[4] = in[4]; writevec2[5] = in[5]; writevec2[6] = in[6]; writevec2[7] = in[7]; writevec1[0] = in[0]; writevec1[1] = in[1]; writevec1[2] = in[2]; writevec1[3] = in[3]; writevec1[4] = in[4]; writevec1[5] = in[5]; writevec1[6] = in[6]; writevec1[7] = in[7]; writevec2 += 8; writevec1 += 8; in += 8; i -= 8; } for(j=0; jx_io[j+1]; readvec = x->x_begmem2 + x->x_writeindex - x->x_del_samples[j]; i = n; while(i) { out[0] = readvec[0]; out[1] = readvec[1]; out[2] = readvec[2]; out[3] = readvec[3]; out[4] = readvec[4]; out[5] = readvec[5]; out[6] = readvec[6]; out[7] = readvec[7]; out += 8; readvec += 8; i -= 8; } } x->x_writeindex += n; if(x->x_writeindex >= x->x_mallocsize) x->x_writeindex -= x->x_mallocsize; return(w+3); } static void nz_tilde_dsp(t_nz_tilde *x, t_signal **sp) { int n = sp[0]->s_n; int i, max_samps, num_io = x->x_n_delays + 1; if(!x->x_blocksize)/*first time*/ { max_samps = x->x_max_delay_samples; max_samps += ((- max_samps) & (n - 1)); max_samps += n; /* allocate memory as a multiple of blocksize */ x->x_mallocsize = max_samps; x->x_begmem1 = (t_sample *)getbytes(2 * x->x_mallocsize * sizeof(t_sample)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = 0; } else if(x->x_blocksize != n) { max_samps = x->x_max_delay_samples; max_samps += ((- max_samps) & (n - 1)); max_samps += n; /* allocate memory as a multiple of blocksize */ x->x_begmem1 = (t_sample *)resizebytes(x->x_begmem1, 2*x->x_mallocsize*sizeof(t_sample), 2*max_samps*sizeof(t_sample)); x->x_mallocsize = max_samps; x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = 0; } x->x_blocksize = n; for(i=0; ix_io[i] = sp[i]->s_vec; if(n&7) dsp_add(nz_tilde_perform, 2, x, n); else dsp_add(nz_tilde_perf8, 2, x, n); } static void *nz_tilde_new(t_floatarg n_delays, t_floatarg max_delay_samples) { t_nz_tilde *x = (t_nz_tilde *)pd_new(nz_tilde_class); int i, n_out = (int)n_delays; int max_samps = (int)max_delay_samples; if(n_out < 1) n_out = 1; x->x_n_delays = n_out; if(max_samps < 1) max_samps = 1; x->x_max_delay_samples = max_samps; x->x_mallocsize = 0; x->x_begmem1 = (t_sample *)0; x->x_begmem2 = (t_sample *)0; x->x_writeindex = 0; x->x_blocksize = 0; x->x_io = (t_sample **)getbytes((x->x_n_delays + 1) * sizeof(t_sample *)); x->x_del_samples = (int *)getbytes(x->x_n_delays * sizeof(int)); for(i=0; ix_obj, &s_signal); x->x_del_samples[i] = 0; } x->x_scalar_sig_in = (t_float)0.0; return (x); } static void nz_tilde_free(t_nz_tilde *x) { freebytes(x->x_del_samples, x->x_n_delays * sizeof(int)); freebytes(x->x_io, (x->x_n_delays + 1) * sizeof(t_sample *)); if(x->x_begmem1) freebytes(x->x_begmem1, 2 * x->x_mallocsize * sizeof(t_sample)); } void nz_tilde_setup(void) { nz_tilde_class = class_new(gensym("nz~"), (t_newmethod)nz_tilde_new, (t_method)nz_tilde_free, sizeof(t_nz_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(nz_tilde_class, t_nz_tilde, x_scalar_sig_in); class_addlist(nz_tilde_class, (t_method)nz_tilde_list); class_addmethod(nz_tilde_class, (t_method)nz_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/xy_2_del_damp_phi.c0000600000000000000000000004177414665566711020041 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- xy_2_del_damp_phi ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden aenderungen: src-index von 1 .. n auf 0 .. (n-1) aenderungen: azimuth von rad auf degree */ /* 1., 2., 3. und 4. reflexionen: +y ^ | | 29 30 16 28 31 17 07 15 27 32 18 08 02 06 14 26 33 19 09 03 00 01 05 13 25 ---> +x 34 20 10 04 12 24 40 35 21 11 23 39 36 22 38 37 */ typedef struct _xy_2_del_damp_phi { t_object x_obj; t_symbol *x_s_direct; t_symbol *x_s_early1; t_symbol *x_s_early2; t_symbol *x_s_early3; t_symbol *x_s_early4; t_symbol *x_s_del; t_symbol *x_s_damp; t_symbol *x_s_phi; t_float x_room_x; t_float x_room_y; t_float x_head_x; t_float x_head_y; t_float x_src_x; t_float x_src_y; t_float x_r_min; t_float x_speed; t_float x_180_over_pi; t_float *x_rad; t_atom *x_at; t_int x_size_rad; t_int x_size_at; void *x_clock; } t_xy_2_del_damp_phi; static t_class *xy_2_del_damp_phi_class; static t_float xy_2_del_damp_phi_calc_radius(t_float r_min, t_float dx, t_float dy) { t_float r = (t_float)sqrt(dx*dx + dy*dy); if(r < r_min) return(r_min); else return(r); } static t_float xy_2_del_damp_phi_calc_azimuth(t_float x_180_over_pi, t_float dx, t_float dy) { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static void xy_2_del_damp_phi_doit(t_xy_2_del_damp_phi *x) { t_float diff_x, diff_y; t_float sum_x, sum_y; t_float lx, wy; t_float x_0, y_0; t_float xp1, yp1, xn1, yn1; t_float xp2, yp2, xn2, yn2; t_float xp3, yp3, xn3, yn3; t_float xp4, yp4, xn4, yn4; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_min = x->x_r_min; t_float *rad=x->x_rad; t_atom *at=x->x_at; lx = x->x_room_x; wy = x->x_room_y; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; x_0 = diff_x; y_0 = diff_y; xp1 = lx - sum_x; yp1 = wy - sum_y; xn1 = -lx - sum_x; yn1 = -wy - sum_y; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; xp3 = 3.0f*lx - sum_x; yp3 = 3.0f*wy - sum_y; xn3 = -3.0f*lx - sum_x; yn3 = -3.0f*wy - sum_y; xp4 = 4.0f*lx + diff_x; yp4 = 4.0f*wy + diff_y; xn4 = -4.0f*lx + diff_x; yn4 = -4.0f*wy + diff_y; rad[0] = xy_2_del_damp_phi_calc_radius(r_min, x_0, y_0); rad[1] = xy_2_del_damp_phi_calc_radius(r_min, xp1, y_0); rad[2] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yp1); rad[3] = xy_2_del_damp_phi_calc_radius(r_min, xn1, y_0); rad[4] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yn1); rad[5] = xy_2_del_damp_phi_calc_radius(r_min, xp2, y_0); rad[6] = xy_2_del_damp_phi_calc_radius(r_min, xp1, yp1); rad[7] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yp2); rad[8] = xy_2_del_damp_phi_calc_radius(r_min, xn1, yn1); rad[9] = xy_2_del_damp_phi_calc_radius(r_min, xn2, y_0); rad[10] = xy_2_del_damp_phi_calc_radius(r_min, xp1, yn1); rad[11] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yn2); rad[12] = xy_2_del_damp_phi_calc_radius(r_min, xn1, yp1); rad[13] = xy_2_del_damp_phi_calc_radius(r_min, xp3, y_0); rad[14] = xy_2_del_damp_phi_calc_radius(r_min, xp2, yp1); rad[15] = xy_2_del_damp_phi_calc_radius(r_min, xp1, yp2); rad[16] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yp3); rad[17] = xy_2_del_damp_phi_calc_radius(r_min, xn1, yp2); rad[18] = xy_2_del_damp_phi_calc_radius(r_min, xn2, yp1); rad[19] = xy_2_del_damp_phi_calc_radius(r_min, xn3, y_0); rad[20] = xy_2_del_damp_phi_calc_radius(r_min, xn2, yn1); rad[21] = xy_2_del_damp_phi_calc_radius(r_min, xn1, yn2); rad[22] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yn3); rad[23] = xy_2_del_damp_phi_calc_radius(r_min, xp1, yn2); rad[24] = xy_2_del_damp_phi_calc_radius(r_min, xp2, yn1); rad[25] = xy_2_del_damp_phi_calc_radius(r_min, xp4, y_0); rad[26] = xy_2_del_damp_phi_calc_radius(r_min, xp3, yp1); rad[27] = xy_2_del_damp_phi_calc_radius(r_min, xp2, yp2); rad[28] = xy_2_del_damp_phi_calc_radius(r_min, xp1, yp3); rad[29] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yp4); rad[30] = xy_2_del_damp_phi_calc_radius(r_min, xn1, yp3); rad[31] = xy_2_del_damp_phi_calc_radius(r_min, xn2, yp2); rad[32] = xy_2_del_damp_phi_calc_radius(r_min, xn3, yp1); rad[33] = xy_2_del_damp_phi_calc_radius(r_min, xn4, y_0); rad[34] = xy_2_del_damp_phi_calc_radius(r_min, xn3, yn1); rad[35] = xy_2_del_damp_phi_calc_radius(r_min, xn2, yn2); rad[36] = xy_2_del_damp_phi_calc_radius(r_min, xn1, yn3); rad[37] = xy_2_del_damp_phi_calc_radius(r_min, x_0, yn4); rad[38] = xy_2_del_damp_phi_calc_radius(r_min, xp1, yn3); rad[39] = xy_2_del_damp_phi_calc_radius(r_min, xp2, yn2); rad[40] = xy_2_del_damp_phi_calc_radius(r_min, xp3, yn1); /* delay-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_del); SETFLOAT(at+1, rad[0] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, rad[1] * m2ms); SETFLOAT(at+2, rad[2] * m2ms); SETFLOAT(at+3, rad[3] * m2ms); SETFLOAT(at+4, rad[4] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, rad[5] * m2ms); SETFLOAT(at+2, rad[6] * m2ms); SETFLOAT(at+3, rad[7] * m2ms); SETFLOAT(at+4, rad[8] * m2ms); SETFLOAT(at+5, rad[9] * m2ms); SETFLOAT(at+6, rad[10] * m2ms); SETFLOAT(at+7, rad[11] * m2ms); SETFLOAT(at+8, rad[12] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); SETFLOAT(at+1, rad[13] * m2ms); SETFLOAT(at+2, rad[14] * m2ms); SETFLOAT(at+3, rad[15] * m2ms); SETFLOAT(at+4, rad[16] * m2ms); SETFLOAT(at+5, rad[17] * m2ms); SETFLOAT(at+6, rad[18] * m2ms); SETFLOAT(at+7, rad[19] * m2ms); SETFLOAT(at+8, rad[20] * m2ms); SETFLOAT(at+9, rad[21] * m2ms); SETFLOAT(at+10, rad[22] * m2ms); SETFLOAT(at+11, rad[23] * m2ms); SETFLOAT(at+12, rad[24] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 13, at); SETFLOAT(at+1, rad[25] * m2ms); SETFLOAT(at+2, rad[26] * m2ms); SETFLOAT(at+3, rad[27] * m2ms); SETFLOAT(at+4, rad[28] * m2ms); SETFLOAT(at+5, rad[29] * m2ms); SETFLOAT(at+6, rad[30] * m2ms); SETFLOAT(at+7, rad[31] * m2ms); SETFLOAT(at+8, rad[32] * m2ms); SETFLOAT(at+9, rad[33] * m2ms); SETFLOAT(at+10, rad[34] * m2ms); SETFLOAT(at+11, rad[35] * m2ms); SETFLOAT(at+12, rad[36] * m2ms); SETFLOAT(at+13, rad[37] * m2ms); SETFLOAT(at+14, rad[38] * m2ms); SETFLOAT(at+15, rad[39] * m2ms); SETFLOAT(at+16, rad[40] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 17, at); /* daempfungs-reihenfolge: 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_damp); SETFLOAT(at+1, r_min / rad[0]); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, r_min / rad[1]); SETFLOAT(at+2, r_min / rad[2]); SETFLOAT(at+3, r_min / rad[3]); SETFLOAT(at+4, r_min / rad[4]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, r_min / rad[5]); SETFLOAT(at+2, r_min / rad[6]); SETFLOAT(at+3, r_min / rad[7]); SETFLOAT(at+4, r_min / rad[8]); SETFLOAT(at+5, r_min / rad[9]); SETFLOAT(at+6, r_min / rad[10]); SETFLOAT(at+7, r_min / rad[11]); SETFLOAT(at+8, r_min / rad[12]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); SETFLOAT(at+1, r_min / rad[13]); SETFLOAT(at+2, r_min / rad[14]); SETFLOAT(at+3, r_min / rad[15]); SETFLOAT(at+4, r_min / rad[16]); SETFLOAT(at+5, r_min / rad[17]); SETFLOAT(at+6, r_min / rad[18]); SETFLOAT(at+7, r_min / rad[19]); SETFLOAT(at+8, r_min / rad[20]); SETFLOAT(at+9, r_min / rad[21]); SETFLOAT(at+10, r_min / rad[22]); SETFLOAT(at+11, r_min / rad[23]); SETFLOAT(at+12, r_min / rad[24]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 13, at); SETFLOAT(at+1, r_min / rad[25]); SETFLOAT(at+2, r_min / rad[26]); SETFLOAT(at+3, r_min / rad[27]); SETFLOAT(at+4, r_min / rad[28]); SETFLOAT(at+5, r_min / rad[29]); SETFLOAT(at+6, r_min / rad[30]); SETFLOAT(at+7, r_min / rad[31]); SETFLOAT(at+8, r_min / rad[32]); SETFLOAT(at+9, r_min / rad[33]); SETFLOAT(at+10, r_min / rad[34]); SETFLOAT(at+11, r_min / rad[35]); SETFLOAT(at+12, r_min / rad[36]); SETFLOAT(at+13, r_min / rad[37]); SETFLOAT(at+14, r_min / rad[38]); SETFLOAT(at+15, r_min / rad[39]); SETFLOAT(at+16, r_min / rad[40]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 17, at); /* encoder-winkel-reihenfolge: index delta phi 0, +1x, +1y, -1x, -1y +2x, +2y, -2x, -2y +1x+1y, -1x-1y +1x-1y, -1x+1y */ SETSYMBOL(at, x->x_s_phi); SETFLOAT(at+1, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, y_0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, y_0)); SETFLOAT(at+2, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yp1)); SETFLOAT(at+3, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, y_0)); SETFLOAT(at+4, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 5, at); SETFLOAT(at+1, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp2, y_0)); SETFLOAT(at+2, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, yp1)); SETFLOAT(at+3, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yp2)); SETFLOAT(at+4, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, yn1)); SETFLOAT(at+5, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn2, y_0)); SETFLOAT(at+6, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, yn1)); SETFLOAT(at+7, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yn2)); SETFLOAT(at+8, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, yp1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 9, at); SETFLOAT(at+1, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp3, y_0)); SETFLOAT(at+2, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp2, yp1)); SETFLOAT(at+3, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, yp2)); SETFLOAT(at+4, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yp3)); SETFLOAT(at+5, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, yp2)); SETFLOAT(at+6, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn2, yp1)); SETFLOAT(at+7, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn3, y_0)); SETFLOAT(at+8, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn2, yn1)); SETFLOAT(at+9, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, yn2)); SETFLOAT(at+10, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yn3)); SETFLOAT(at+11, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, yn2)); SETFLOAT(at+12, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp2, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 13, at); SETFLOAT(at+1, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp4, y_0)); SETFLOAT(at+2, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp3, yp1)); SETFLOAT(at+3, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp2, yp2)); SETFLOAT(at+4, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, yp3)); SETFLOAT(at+5, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yp4)); SETFLOAT(at+6, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, yp3)); SETFLOAT(at+7, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn2, yp2)); SETFLOAT(at+8, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn3, yp1)); SETFLOAT(at+9, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn4, y_0)); SETFLOAT(at+10, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn3, yn1)); SETFLOAT(at+11, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn2, yn2)); SETFLOAT(at+12, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xn1, yn3)); SETFLOAT(at+13, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, x_0, yn4)); SETFLOAT(at+14, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp1, yn3)); SETFLOAT(at+15, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp2, yn2)); SETFLOAT(at+16, xy_2_del_damp_phi_calc_azimuth(x_180_over_pi, xp3, yn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 17, at); } static void xy_2_del_damp_phi_src_xy(t_xy_2_del_damp_phi *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_src_x = atom_getfloat(argv++); x->x_src_y = atom_getfloat(argv); if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void xy_2_del_damp_phi_head_xy(t_xy_2_del_damp_phi *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv); if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void xy_2_del_damp_phi_room_xy(t_xy_2_del_damp_phi *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)) { t_float xr2=0.0f, yr2=0.0f; x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv); if(x->x_room_x < 0.5f) x->x_room_x = 0.5f; if(x->x_room_y < 0.5f) x->x_room_y = 0.5f; xr2 = 0.5f*x->x_room_x; yr2 = 0.5f*x->x_room_y; if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; clock_delay(x->x_clock, 0.0f); } } static void xy_2_del_damp_phi_r_min(t_xy_2_del_damp_phi *x, t_float r_min) { if(r_min < 0.1f) r_min = 0.1f; x->x_r_min = r_min; clock_delay(x->x_clock, 0.0f); } static void xy_2_del_damp_phi_sonic_speed(t_xy_2_del_damp_phi *x, t_float speed) { if(speed < 10.0f) speed = 10.0f; if(speed > 2000.0f) speed = 2000.0f; x->x_speed = speed; clock_delay(x->x_clock, 0.0f); } static void xy_2_del_damp_phi_free(t_xy_2_del_damp_phi *x) { clock_free(x->x_clock); freebytes(x->x_at, x->x_size_at * sizeof(t_atom)); freebytes(x->x_rad, x->x_size_rad * sizeof(t_float)); } static void *xy_2_del_damp_phi_new(t_symbol *s, int argc, t_atom *argv) { t_xy_2_del_damp_phi *x = (t_xy_2_del_damp_phi *)pd_new(xy_2_del_damp_phi_class); x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_src_x = 3.0f; x->x_src_y = 0.5f; x->x_r_min = 1.4f; x->x_speed = 340.0f; x->x_s_direct = gensym("direct"); x->x_s_early1 = gensym("early1"); x->x_s_early2 = gensym("early2"); x->x_s_early3 = gensym("early3"); x->x_s_early4 = gensym("early4"); x->x_s_damp = gensym("damp"); x->x_s_del = gensym("del"); x->x_s_phi = gensym("phi"); x->x_size_rad = 41; // 1 + 4 + 8 + 12 + 16 x->x_size_at = 17; // 16 + 1 x->x_rad = (t_float *)getbytes(x->x_size_rad * sizeof(t_float)); x->x_at = (t_atom *)getbytes(x->x_size_at * sizeof(t_atom)); outlet_new(&x->x_obj, &s_list); x->x_clock = clock_new(x, (t_method)xy_2_del_damp_phi_doit); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); return (x); } void xy_2_del_damp_phi_setup(void) { xy_2_del_damp_phi_class = class_new(gensym("xy_2_del_damp_phi"), (t_newmethod)xy_2_del_damp_phi_new, (t_method)xy_2_del_damp_phi_free, sizeof(t_xy_2_del_damp_phi), 0, A_GIMME, 0); class_addmethod(xy_2_del_damp_phi_class, (t_method)xy_2_del_damp_phi_src_xy, gensym("src_xy"), A_GIMME, 0); class_addmethod(xy_2_del_damp_phi_class, (t_method)xy_2_del_damp_phi_head_xy, gensym("head_xy"), A_GIMME, 0); class_addmethod(xy_2_del_damp_phi_class, (t_method)xy_2_del_damp_phi_room_xy, gensym("room_xy"), A_GIMME, 0); class_addmethod(xy_2_del_damp_phi_class, (t_method)xy_2_del_damp_phi_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(xy_2_del_damp_phi_class, (t_method)xy_2_del_damp_phi_r_min, gensym("r_min"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_roomsim/src/xyz_3_del_damp_theta_phi.c0000600000000000000000000015125614665566711021416 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_roomsim written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2018 */ #include "m_pd.h" #include "iemlib.h" #include /* -------------------------- xyz_3_del_damp_theta_phi ------------------------------ */ /* ** pos. x-Richtung Nase ** pos. y-Richtung Linke Hand ** pos. z-Richtung Scheitel ** Kartesischer Koordinaten-Ursprung liegt in der Mitte des Raums am Boden aenderungen: src-index von 1 .. n auf 0 .. (n-1) aenderungen: azimuth von rad auf degree */ /* 1., 2., 3. und 4. reflexionen: top +z +y ^ | | | | | | 103 ---------------> +x +y ^ | | | | | 100 101 49 99 ------------> +x 102 +y ^ | | | | 93 94 46 92 95 47 19 45 91 ---------> +x 96 48 98 97 +y ^ | | | 82 83 39 81 84 40 16 38 80 85 41 17 05 15 37 79 ------> +x 86 42 18 44 90 87 43 89 88 +y ^ | | 67 68 28 66 69 29 09 27 65 70 30 10 02 08 26 64 71 31 11 03 00 01 07 25 63 ---> +x 72 32 12 04 14 36 78 73 33 13 35 77 74 34 76 75 +y ^ | | | 107 108 52 106 109 53 21 51 105 110 54 22 06 20 50 104 -----> +x 111 55 23 57 115 112 56 114 113 +y ^ | | | | 118 119 59 117 120 60 24 58 116 --------> +x 121 61 123 122 +y ^ | | | | | 125 126 62 124 -----------> +x 127 +y ^ | | | | | | 128 ---------------> +x bottom -z */ typedef struct _xyz_3_del_damp_theta_phi { t_object x_obj; t_symbol *x_s_direct; t_symbol *x_s_early1; t_symbol *x_s_early2; t_symbol *x_s_early3; t_symbol *x_s_early4; t_symbol *x_s_del; t_symbol *x_s_damp; t_symbol *x_s_theta; t_symbol *x_s_phi; t_float x_room_x; t_float x_room_y; t_float x_room_z; t_float x_head_x; t_float x_head_y; t_float x_head_z; t_float x_src_x; t_float x_src_y; t_float x_src_z; t_float x_r_min; t_float x_speed; t_float x_180_over_pi; t_float *x_rad; t_atom *x_at; t_int x_size_rad; t_int x_size_at; void *x_clock; } t_xyz_3_del_damp_theta_phi; static t_class *xyz_3_del_damp_theta_phi_class; static t_float xyz_3_del_damp_theta_phi_calc_radius(t_float r_min, t_float dx, t_float dy, t_float dz) { t_float r = (t_float)sqrt(dx*dx + dy*dy + dz*dz); if(r < r_min) return(r_min); else return(r); } static t_float xyz_3_del_damp_theta_phi_calc_azimuth(t_float x_180_over_pi, t_float dx, t_float dy, t_float dz) { if(dx == 0.0f) { if(dy < 0.0f) return(270.0f); else return(90.0f); } else if(dx < 0.0f) { return(180.0f + x_180_over_pi * (t_float)atan(dy / dx)); } else { if(dy < 0.0f) return(360.0f + x_180_over_pi * (t_float)atan(dy / dx)); else return(x_180_over_pi * (t_float)atan(dy / dx)); } } static t_float xyz_3_del_damp_theta_phi_calc_elevation(t_float x_180_over_pi, t_float dx, t_float dy, t_float dz) { t_float dxy = sqrt(dx*dx + dy*dy); if(dxy == 0.0f) { if(dz < 0.0f) return(-90.0f); else return(90.0f); } else { return(x_180_over_pi * (t_float)atan(dz / dxy)); } } static void xyz_3_del_damp_theta_phi_doit(t_xyz_3_del_damp_theta_phi *x) { t_float diff_x, diff_y, diff_z; t_float sum_x, sum_y, sum_z; t_float lx, wy, hz; t_float x_0, y_0, z_0; t_float xp1, yp1, zp1, xn1, yn1, zn1; t_float xp2, yp2, zp2, xn2, yn2, zn2; t_float xp3, yp3, zp3, xn3, yn3, zn3; t_float xp4, yp4, zp4, xn4, yn4, zn4; t_float m2ms = 1000.0f / x->x_speed; t_float x_180_over_pi=x->x_180_over_pi; t_float r_min = x->x_r_min; t_float *rad=x->x_rad; t_atom *at=x->x_at; lx = x->x_room_x; wy = x->x_room_y; hz = x->x_room_z; diff_x = x->x_src_x - x->x_head_x; diff_y = x->x_src_y - x->x_head_y; diff_z = x->x_src_z - x->x_head_z; sum_x = x->x_src_x + x->x_head_x; sum_y = x->x_src_y + x->x_head_y; sum_z = x->x_src_z + x->x_head_z - hz; x_0 = diff_x; y_0 = diff_y; z_0 = diff_z; xp1 = lx - sum_x; yp1 = wy - sum_y; zp1 = hz - sum_z; xn1 = -lx - sum_x; yn1 = -wy - sum_y; zn1 = -hz - sum_z; xp2 = 2.0f*lx + diff_x; yp2 = 2.0f*wy + diff_y; zp2 = 2.0f*hz + diff_z; xn2 = -2.0f*lx + diff_x; yn2 = -2.0f*wy + diff_y; zn2 = -2.0f*hz + diff_z; xp3 = 3.0f*lx - sum_x; yp3 = 3.0f*wy - sum_y; zp3 = 3.0f*hz - sum_z; xn3 = -3.0f*lx - sum_x; yn3 = -3.0f*wy - sum_y; zn3 = -3.0f*hz - sum_z; xp4 = 4.0f*lx + diff_x; yp4 = 4.0f*wy + diff_y; zp4 = 4.0f*hz + diff_z; xn4 = -4.0f*lx + diff_x; yn4 = -4.0f*wy + diff_y; zn4 = -4.0f*hz + diff_z; rad[0] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, z_0); rad[1] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, z_0); rad[2] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, z_0); rad[3] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, z_0); rad[4] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, z_0); rad[5] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zp1); rad[6] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zn1); rad[7] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, y_0, z_0); rad[8] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp1, z_0); rad[9] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp2, z_0); rad[10] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp1, z_0); rad[11] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, y_0, z_0); rad[12] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn1, z_0); rad[13] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn2, z_0); rad[14] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn1, z_0); rad[15] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, zp1); rad[16] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, zp1); rad[17] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, zp1); rad[18] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, zp1); rad[19] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zp2); rad[20] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, zn1); rad[21] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, zn1); rad[22] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, zn1); rad[23] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, zn1); rad[24] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zn2); rad[25] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp3, y_0, z_0); rad[26] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yp1, z_0); rad[27] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp2, z_0); rad[28] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp3, z_0); rad[29] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp2, z_0); rad[30] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yp1, z_0); rad[31] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn3, y_0, z_0); rad[32] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yn1, z_0); rad[33] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn2, z_0); rad[34] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn3, z_0); rad[35] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn2, z_0); rad[36] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yn1, z_0); rad[37] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, y_0, zp1); rad[38] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp1, zp1); rad[39] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp2, zp1); rad[40] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp1, zp1); rad[41] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, y_0, zp1); rad[42] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn1, zp1); rad[43] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn2, zp1); rad[44] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn1, zp1); rad[45] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, zp2); rad[46] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, zp2); rad[47] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, zp2); rad[48] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, zp2); rad[49] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zp3); rad[50] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, y_0, zn1); rad[51] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp1, zn1); rad[52] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp2, zn1); rad[53] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp1, zn1); rad[54] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, y_0, zn1); rad[55] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn1, zn1); rad[56] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn2, zn1); rad[57] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn1, zn1); rad[58] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, zn2); rad[59] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, zn2); rad[60] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, zn2); rad[61] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, zn2); rad[62] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zn3); rad[63] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp4, y_0, z_0); rad[64] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp3, yp1, z_0); rad[65] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yp2, z_0); rad[66] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp3, z_0); rad[67] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp4, z_0); rad[68] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp3, z_0); rad[69] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yp2, z_0); rad[70] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn3, yp1, z_0); rad[71] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn4, y_0, z_0); rad[72] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn3, yn1, z_0); rad[73] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yn2, z_0); rad[74] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn3, z_0); rad[75] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn4, z_0); rad[76] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn3, z_0); rad[77] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yn2, z_0); rad[78] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp3, yn1, z_0); rad[79] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp3, y_0, zp1); rad[80] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yp1, zp1); rad[81] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp2, zp1); rad[82] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp3, zp1); rad[83] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp2, zp1); rad[84] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yp1, zp1); rad[85] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn3, y_0, zp1); rad[86] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yn1, zp1); rad[87] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn2, zp1); rad[88] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn3, zp1); rad[89] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn2, zp1); rad[90] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yn1, zp1); rad[91] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, y_0, zp2); rad[92] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp1, zp2); rad[93] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp2, zp2); rad[94] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp1, zp2); rad[95] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, y_0, zp2); rad[96] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn1, zp2); rad[97] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn2, zp2); rad[98] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn1, zp2); rad[99] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, zp3); rad[100] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, zp3); rad[101] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, zp3); rad[102] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, zp3); rad[103] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zp4); rad[104] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp3, y_0, zn1); rad[105] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yp1, zn1); rad[106] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp2, zn1); rad[107] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp3, zn1); rad[108] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp2, zn1); rad[109] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yp1, zn1); rad[110] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn3, y_0, zn1); rad[111] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, yn1, zn1); rad[112] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn2, zn1); rad[113] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn3, zn1); rad[114] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn2, zn1); rad[115] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, yn1, zn1); rad[116] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp2, y_0, zn2); rad[117] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yp1, zn2); rad[118] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp2, zn2); rad[119] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yp1, zn2); rad[120] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn2, y_0, zn2); rad[121] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, yn1, zn2); rad[122] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn2, zn2); rad[123] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, yn1, zn2); rad[124] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xp1, y_0, zn3); rad[125] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yp1, zn3); rad[126] = xyz_3_del_damp_theta_phi_calc_radius(r_min, xn1, y_0, zn3); rad[127] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, yn1, zn3); rad[128] = xyz_3_del_damp_theta_phi_calc_radius(r_min, x_0, y_0, zn4); SETSYMBOL(at, x->x_s_del); SETFLOAT(at+1, rad[0] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, rad[1] * m2ms); SETFLOAT(at+2, rad[2] * m2ms); SETFLOAT(at+3, rad[3] * m2ms); SETFLOAT(at+4, rad[4] * m2ms); SETFLOAT(at+5, rad[5] * m2ms); SETFLOAT(at+6, rad[6] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, rad[7] * m2ms); SETFLOAT(at+2, rad[8] * m2ms); SETFLOAT(at+3, rad[9] * m2ms); SETFLOAT(at+4, rad[10] * m2ms); SETFLOAT(at+5, rad[11] * m2ms); SETFLOAT(at+6, rad[12] * m2ms); SETFLOAT(at+7, rad[13] * m2ms); SETFLOAT(at+8, rad[14] * m2ms); SETFLOAT(at+9, rad[15] * m2ms); SETFLOAT(at+10, rad[16] * m2ms); SETFLOAT(at+11, rad[17] * m2ms); SETFLOAT(at+12, rad[18] * m2ms); SETFLOAT(at+13, rad[19] * m2ms); SETFLOAT(at+14, rad[20] * m2ms); SETFLOAT(at+15, rad[21] * m2ms); SETFLOAT(at+16, rad[22] * m2ms); SETFLOAT(at+17, rad[23] * m2ms); SETFLOAT(at+18, rad[24] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); SETFLOAT(at+1, rad[25] * m2ms); SETFLOAT(at+2, rad[26] * m2ms); SETFLOAT(at+3, rad[27] * m2ms); SETFLOAT(at+4, rad[28] * m2ms); SETFLOAT(at+5, rad[29] * m2ms); SETFLOAT(at+6, rad[30] * m2ms); SETFLOAT(at+7, rad[31] * m2ms); SETFLOAT(at+8, rad[32] * m2ms); SETFLOAT(at+9, rad[33] * m2ms); SETFLOAT(at+10, rad[34] * m2ms); SETFLOAT(at+11, rad[35] * m2ms); SETFLOAT(at+12, rad[36] * m2ms); SETFLOAT(at+13, rad[37] * m2ms); SETFLOAT(at+14, rad[38] * m2ms); SETFLOAT(at+15, rad[39] * m2ms); SETFLOAT(at+16, rad[40] * m2ms); SETFLOAT(at+17, rad[41] * m2ms); SETFLOAT(at+18, rad[42] * m2ms); SETFLOAT(at+19, rad[43] * m2ms); SETFLOAT(at+20, rad[44] * m2ms); SETFLOAT(at+21, rad[45] * m2ms); SETFLOAT(at+22, rad[46] * m2ms); SETFLOAT(at+23, rad[47] * m2ms); SETFLOAT(at+24, rad[48] * m2ms); SETFLOAT(at+25, rad[49] * m2ms); SETFLOAT(at+26, rad[50] * m2ms); SETFLOAT(at+27, rad[51] * m2ms); SETFLOAT(at+28, rad[52] * m2ms); SETFLOAT(at+29, rad[53] * m2ms); SETFLOAT(at+30, rad[54] * m2ms); SETFLOAT(at+31, rad[55] * m2ms); SETFLOAT(at+32, rad[56] * m2ms); SETFLOAT(at+33, rad[57] * m2ms); SETFLOAT(at+34, rad[58] * m2ms); SETFLOAT(at+35, rad[59] * m2ms); SETFLOAT(at+36, rad[60] * m2ms); SETFLOAT(at+37, rad[61] * m2ms); SETFLOAT(at+38, rad[62] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 39, at); SETFLOAT(at+1, rad[63] * m2ms); SETFLOAT(at+2, rad[64] * m2ms); SETFLOAT(at+3, rad[65] * m2ms); SETFLOAT(at+4, rad[66] * m2ms); SETFLOAT(at+5, rad[67] * m2ms); SETFLOAT(at+6, rad[68] * m2ms); SETFLOAT(at+7, rad[69] * m2ms); SETFLOAT(at+8, rad[70] * m2ms); SETFLOAT(at+9, rad[71] * m2ms); SETFLOAT(at+10, rad[72] * m2ms); SETFLOAT(at+11, rad[73] * m2ms); SETFLOAT(at+12, rad[74] * m2ms); SETFLOAT(at+13, rad[75] * m2ms); SETFLOAT(at+14, rad[76] * m2ms); SETFLOAT(at+15, rad[77] * m2ms); SETFLOAT(at+16, rad[78] * m2ms); SETFLOAT(at+17, rad[79] * m2ms); SETFLOAT(at+18, rad[80] * m2ms); SETFLOAT(at+19, rad[81] * m2ms); SETFLOAT(at+20, rad[82] * m2ms); SETFLOAT(at+21, rad[83] * m2ms); SETFLOAT(at+22, rad[84] * m2ms); SETFLOAT(at+23, rad[85] * m2ms); SETFLOAT(at+24, rad[86] * m2ms); SETFLOAT(at+25, rad[87] * m2ms); SETFLOAT(at+26, rad[88] * m2ms); SETFLOAT(at+27, rad[89] * m2ms); SETFLOAT(at+28, rad[90] * m2ms); SETFLOAT(at+29, rad[91] * m2ms); SETFLOAT(at+30, rad[92] * m2ms); SETFLOAT(at+31, rad[93] * m2ms); SETFLOAT(at+32, rad[94] * m2ms); SETFLOAT(at+33, rad[95] * m2ms); SETFLOAT(at+34, rad[96] * m2ms); SETFLOAT(at+35, rad[97] * m2ms); SETFLOAT(at+36, rad[98] * m2ms); SETFLOAT(at+37, rad[99] * m2ms); SETFLOAT(at+38, rad[100] * m2ms); SETFLOAT(at+39, rad[101] * m2ms); SETFLOAT(at+40, rad[102] * m2ms); SETFLOAT(at+41, rad[103] * m2ms); SETFLOAT(at+42, rad[104] * m2ms); SETFLOAT(at+43, rad[105] * m2ms); SETFLOAT(at+44, rad[106] * m2ms); SETFLOAT(at+45, rad[107] * m2ms); SETFLOAT(at+46, rad[108] * m2ms); SETFLOAT(at+47, rad[109] * m2ms); SETFLOAT(at+48, rad[110] * m2ms); SETFLOAT(at+49, rad[111] * m2ms); SETFLOAT(at+50, rad[112] * m2ms); SETFLOAT(at+51, rad[113] * m2ms); SETFLOAT(at+52, rad[114] * m2ms); SETFLOAT(at+53, rad[115] * m2ms); SETFLOAT(at+54, rad[116] * m2ms); SETFLOAT(at+55, rad[117] * m2ms); SETFLOAT(at+56, rad[118] * m2ms); SETFLOAT(at+57, rad[119] * m2ms); SETFLOAT(at+58, rad[120] * m2ms); SETFLOAT(at+59, rad[121] * m2ms); SETFLOAT(at+60, rad[122] * m2ms); SETFLOAT(at+61, rad[123] * m2ms); SETFLOAT(at+62, rad[124] * m2ms); SETFLOAT(at+63, rad[125] * m2ms); SETFLOAT(at+64, rad[126] * m2ms); SETFLOAT(at+65, rad[127] * m2ms); SETFLOAT(at+66, rad[128] * m2ms); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 67, at); SETSYMBOL(at, x->x_s_damp); SETFLOAT(at+1, r_min / rad[0]); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, r_min / rad[1]); SETFLOAT(at+2, r_min / rad[2]); SETFLOAT(at+3, r_min / rad[3]); SETFLOAT(at+4, r_min / rad[4]); SETFLOAT(at+5, r_min / rad[5]); SETFLOAT(at+6, r_min / rad[6]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, r_min / rad[7]); SETFLOAT(at+2, r_min / rad[8]); SETFLOAT(at+3, r_min / rad[9]); SETFLOAT(at+4, r_min / rad[10]); SETFLOAT(at+5, r_min / rad[11]); SETFLOAT(at+6, r_min / rad[12]); SETFLOAT(at+7, r_min / rad[13]); SETFLOAT(at+8, r_min / rad[14]); SETFLOAT(at+9, r_min / rad[15]); SETFLOAT(at+10, r_min / rad[16]); SETFLOAT(at+11, r_min / rad[17]); SETFLOAT(at+12, r_min / rad[18]); SETFLOAT(at+13, r_min / rad[19]); SETFLOAT(at+14, r_min / rad[20]); SETFLOAT(at+15, r_min / rad[21]); SETFLOAT(at+16, r_min / rad[22]); SETFLOAT(at+17, r_min / rad[23]); SETFLOAT(at+18, r_min / rad[24]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); SETFLOAT(at+1, r_min / rad[25]); SETFLOAT(at+2, r_min / rad[26]); SETFLOAT(at+3, r_min / rad[27]); SETFLOAT(at+4, r_min / rad[28]); SETFLOAT(at+5, r_min / rad[29]); SETFLOAT(at+6, r_min / rad[30]); SETFLOAT(at+7, r_min / rad[31]); SETFLOAT(at+8, r_min / rad[32]); SETFLOAT(at+9, r_min / rad[33]); SETFLOAT(at+10, r_min / rad[34]); SETFLOAT(at+11, r_min / rad[35]); SETFLOAT(at+12, r_min / rad[36]); SETFLOAT(at+13, r_min / rad[37]); SETFLOAT(at+14, r_min / rad[38]); SETFLOAT(at+15, r_min / rad[39]); SETFLOAT(at+16, r_min / rad[40]); SETFLOAT(at+17, r_min / rad[41]); SETFLOAT(at+18, r_min / rad[42]); SETFLOAT(at+19, r_min / rad[43]); SETFLOAT(at+20, r_min / rad[44]); SETFLOAT(at+21, r_min / rad[45]); SETFLOAT(at+22, r_min / rad[46]); SETFLOAT(at+23, r_min / rad[47]); SETFLOAT(at+24, r_min / rad[48]); SETFLOAT(at+25, r_min / rad[49]); SETFLOAT(at+26, r_min / rad[50]); SETFLOAT(at+27, r_min / rad[51]); SETFLOAT(at+28, r_min / rad[52]); SETFLOAT(at+29, r_min / rad[53]); SETFLOAT(at+30, r_min / rad[54]); SETFLOAT(at+31, r_min / rad[55]); SETFLOAT(at+32, r_min / rad[56]); SETFLOAT(at+33, r_min / rad[57]); SETFLOAT(at+34, r_min / rad[58]); SETFLOAT(at+35, r_min / rad[59]); SETFLOAT(at+36, r_min / rad[60]); SETFLOAT(at+37, r_min / rad[61]); SETFLOAT(at+38, r_min / rad[62]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 39, at); SETFLOAT(at+1, r_min / rad[63]); SETFLOAT(at+2, r_min / rad[64]); SETFLOAT(at+3, r_min / rad[65]); SETFLOAT(at+4, r_min / rad[66]); SETFLOAT(at+5, r_min / rad[67]); SETFLOAT(at+6, r_min / rad[68]); SETFLOAT(at+7, r_min / rad[69]); SETFLOAT(at+8, r_min / rad[70]); SETFLOAT(at+9, r_min / rad[71]); SETFLOAT(at+10, r_min / rad[72]); SETFLOAT(at+11, r_min / rad[73]); SETFLOAT(at+12, r_min / rad[74]); SETFLOAT(at+13, r_min / rad[75]); SETFLOAT(at+14, r_min / rad[76]); SETFLOAT(at+15, r_min / rad[77]); SETFLOAT(at+16, r_min / rad[78]); SETFLOAT(at+17, r_min / rad[79]); SETFLOAT(at+18, r_min / rad[80]); SETFLOAT(at+19, r_min / rad[81]); SETFLOAT(at+20, r_min / rad[82]); SETFLOAT(at+21, r_min / rad[83]); SETFLOAT(at+22, r_min / rad[84]); SETFLOAT(at+23, r_min / rad[85]); SETFLOAT(at+24, r_min / rad[86]); SETFLOAT(at+25, r_min / rad[87]); SETFLOAT(at+26, r_min / rad[88]); SETFLOAT(at+27, r_min / rad[89]); SETFLOAT(at+28, r_min / rad[90]); SETFLOAT(at+29, r_min / rad[91]); SETFLOAT(at+30, r_min / rad[92]); SETFLOAT(at+31, r_min / rad[93]); SETFLOAT(at+32, r_min / rad[94]); SETFLOAT(at+33, r_min / rad[95]); SETFLOAT(at+34, r_min / rad[96]); SETFLOAT(at+35, r_min / rad[97]); SETFLOAT(at+36, r_min / rad[98]); SETFLOAT(at+37, r_min / rad[99]); SETFLOAT(at+38, r_min / rad[100]); SETFLOAT(at+39, r_min / rad[101]); SETFLOAT(at+40, r_min / rad[102]); SETFLOAT(at+41, r_min / rad[103]); SETFLOAT(at+42, r_min / rad[104]); SETFLOAT(at+43, r_min / rad[105]); SETFLOAT(at+44, r_min / rad[106]); SETFLOAT(at+45, r_min / rad[107]); SETFLOAT(at+46, r_min / rad[108]); SETFLOAT(at+47, r_min / rad[109]); SETFLOAT(at+48, r_min / rad[110]); SETFLOAT(at+49, r_min / rad[111]); SETFLOAT(at+50, r_min / rad[112]); SETFLOAT(at+51, r_min / rad[113]); SETFLOAT(at+52, r_min / rad[114]); SETFLOAT(at+53, r_min / rad[115]); SETFLOAT(at+54, r_min / rad[116]); SETFLOAT(at+55, r_min / rad[117]); SETFLOAT(at+56, r_min / rad[118]); SETFLOAT(at+57, r_min / rad[119]); SETFLOAT(at+58, r_min / rad[120]); SETFLOAT(at+59, r_min / rad[121]); SETFLOAT(at+60, r_min / rad[122]); SETFLOAT(at+61, r_min / rad[123]); SETFLOAT(at+62, r_min / rad[124]); SETFLOAT(at+63, r_min / rad[125]); SETFLOAT(at+64, r_min / rad[126]); SETFLOAT(at+65, r_min / rad[127]); SETFLOAT(at+66, r_min / rad[128]); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 67, at); SETSYMBOL(at, x->x_s_theta); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, z_0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zp1)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp2, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp1, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, y_0, z_0)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn1, z_0)); SETFLOAT(at+7, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn2, z_0)); SETFLOAT(at+8, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn1, z_0)); SETFLOAT(at+9, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, zp1)); SETFLOAT(at+10, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, zp1)); SETFLOAT(at+11, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, zp1)); SETFLOAT(at+12, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, zp1)); SETFLOAT(at+13, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zp2)); SETFLOAT(at+14, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, zn1)); SETFLOAT(at+15, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, zn1)); SETFLOAT(at+16, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, zn1)); SETFLOAT(at+17, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, zn1)); SETFLOAT(at+18, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zn2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp3, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp2, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp3, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp2, z_0)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yp1, z_0)); SETFLOAT(at+7, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn3, y_0, z_0)); SETFLOAT(at+8, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yn1, z_0)); SETFLOAT(at+9, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn2, z_0)); SETFLOAT(at+10, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn3, z_0)); SETFLOAT(at+11, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn2, z_0)); SETFLOAT(at+12, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yn1, z_0)); SETFLOAT(at+13, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, y_0, zp1)); SETFLOAT(at+14, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp1, zp1)); SETFLOAT(at+15, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp2, zp1)); SETFLOAT(at+16, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp1, zp1)); SETFLOAT(at+17, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, y_0, zp1)); SETFLOAT(at+18, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn1, zp1)); SETFLOAT(at+19, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn2, zp1)); SETFLOAT(at+20, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn1, zp1)); SETFLOAT(at+21, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, zp2)); SETFLOAT(at+22, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, zp2)); SETFLOAT(at+23, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, zp2)); SETFLOAT(at+24, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, zp2)); SETFLOAT(at+25, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zp3)); SETFLOAT(at+26, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, y_0, zn1)); SETFLOAT(at+27, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp1, zn1)); SETFLOAT(at+28, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp2, zn1)); SETFLOAT(at+29, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp1, zn1)); SETFLOAT(at+30, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, y_0, zn1)); SETFLOAT(at+31, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn1, zn1)); SETFLOAT(at+32, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn2, zn1)); SETFLOAT(at+33, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn1, zn1)); SETFLOAT(at+34, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, zn2)); SETFLOAT(at+35, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, zn2)); SETFLOAT(at+36, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, zn2)); SETFLOAT(at+37, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, zn2)); SETFLOAT(at+38, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zn3)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 39, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp4, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp3, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yp2, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp3, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp4, z_0)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp3, z_0)); SETFLOAT(at+7, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yp2, z_0)); SETFLOAT(at+8, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn3, yp1, z_0)); SETFLOAT(at+9, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn4, y_0, z_0)); SETFLOAT(at+10, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn3, yn1, z_0)); SETFLOAT(at+11, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yn2, z_0)); SETFLOAT(at+12, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn3, z_0)); SETFLOAT(at+13, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn4, z_0)); SETFLOAT(at+14, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn3, z_0)); SETFLOAT(at+15, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yn2, z_0)); SETFLOAT(at+16, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp3, yn1, z_0)); SETFLOAT(at+17, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp3, y_0, zp1)); SETFLOAT(at+18, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yp1, zp1)); SETFLOAT(at+19, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp2, zp1)); SETFLOAT(at+20, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp3, zp1)); SETFLOAT(at+21, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp2, zp1)); SETFLOAT(at+22, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yp1, zp1)); SETFLOAT(at+23, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn3, y_0, zp1)); SETFLOAT(at+24, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yn1, zp1)); SETFLOAT(at+25, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn2, zp1)); SETFLOAT(at+26, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn3, zp1)); SETFLOAT(at+27, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn2, zp1)); SETFLOAT(at+28, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yn1, zp1)); SETFLOAT(at+29, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, y_0, zp2)); SETFLOAT(at+30, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp1, zp2)); SETFLOAT(at+31, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp2, zp2)); SETFLOAT(at+32, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp1, zp2)); SETFLOAT(at+33, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, y_0, zp2)); SETFLOAT(at+34, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn1, zp2)); SETFLOAT(at+35, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn2, zp2)); SETFLOAT(at+36, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn1, zp2)); SETFLOAT(at+37, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, zp3)); SETFLOAT(at+38, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, zp3)); SETFLOAT(at+39, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, zp3)); SETFLOAT(at+40, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, zp3)); SETFLOAT(at+41, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zp4)); SETFLOAT(at+42, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp3, y_0, zn1)); SETFLOAT(at+43, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yp1, zn1)); SETFLOAT(at+44, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp2, zn1)); SETFLOAT(at+45, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp3, zn1)); SETFLOAT(at+46, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp2, zn1)); SETFLOAT(at+47, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yp1, zn1)); SETFLOAT(at+48, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn3, y_0, zn1)); SETFLOAT(at+49, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, yn1, zn1)); SETFLOAT(at+50, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn2, zn1)); SETFLOAT(at+51, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn3, zn1)); SETFLOAT(at+52, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn2, zn1)); SETFLOAT(at+53, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, yn1, zn1)); SETFLOAT(at+54, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp2, y_0, zn2)); SETFLOAT(at+55, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yp1, zn2)); SETFLOAT(at+56, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp2, zn2)); SETFLOAT(at+57, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yp1, zn2)); SETFLOAT(at+58, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn2, y_0, zn2)); SETFLOAT(at+59, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, yn1, zn2)); SETFLOAT(at+60, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn2, zn2)); SETFLOAT(at+61, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, yn1, zn2)); SETFLOAT(at+62, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xp1, y_0, zn3)); SETFLOAT(at+63, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yp1, zn3)); SETFLOAT(at+64, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, xn1, y_0, zn3)); SETFLOAT(at+65, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, yn1, zn3)); SETFLOAT(at+66, xyz_3_del_damp_theta_phi_calc_elevation(x_180_over_pi, x_0, y_0, zn4)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 67, at); SETSYMBOL(at, x->x_s_phi); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, z_0)); outlet_anything(x->x_obj.ob_outlet, x->x_s_direct, 2, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zp1)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zn1)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early1, 7, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp2, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp1, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, y_0, z_0)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn1, z_0)); SETFLOAT(at+7, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn2, z_0)); SETFLOAT(at+8, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn1, z_0)); SETFLOAT(at+9, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, zp1)); SETFLOAT(at+10, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, zp1)); SETFLOAT(at+11, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, zp1)); SETFLOAT(at+12, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, zp1)); SETFLOAT(at+13, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zp2)); SETFLOAT(at+14, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, zn1)); SETFLOAT(at+15, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, zn1)); SETFLOAT(at+16, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, zn1)); SETFLOAT(at+17, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, zn1)); SETFLOAT(at+18, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zn2)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early2, 19, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp3, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp2, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp3, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp2, z_0)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yp1, z_0)); SETFLOAT(at+7, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn3, y_0, z_0)); SETFLOAT(at+8, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yn1, z_0)); SETFLOAT(at+9, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn2, z_0)); SETFLOAT(at+10, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn3, z_0)); SETFLOAT(at+11, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn2, z_0)); SETFLOAT(at+12, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yn1, z_0)); SETFLOAT(at+13, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, y_0, zp1)); SETFLOAT(at+14, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp1, zp1)); SETFLOAT(at+15, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp2, zp1)); SETFLOAT(at+16, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp1, zp1)); SETFLOAT(at+17, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, y_0, zp1)); SETFLOAT(at+18, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn1, zp1)); SETFLOAT(at+19, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn2, zp1)); SETFLOAT(at+20, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn1, zp1)); SETFLOAT(at+21, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, zp2)); SETFLOAT(at+22, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, zp2)); SETFLOAT(at+23, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, zp2)); SETFLOAT(at+24, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, zp2)); SETFLOAT(at+25, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zp3)); SETFLOAT(at+26, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, y_0, zn1)); SETFLOAT(at+27, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp1, zn1)); SETFLOAT(at+28, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp2, zn1)); SETFLOAT(at+29, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp1, zn1)); SETFLOAT(at+30, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, y_0, zn1)); SETFLOAT(at+31, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn1, zn1)); SETFLOAT(at+32, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn2, zn1)); SETFLOAT(at+33, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn1, zn1)); SETFLOAT(at+34, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, zn2)); SETFLOAT(at+35, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, zn2)); SETFLOAT(at+36, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, zn2)); SETFLOAT(at+37, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, zn2)); SETFLOAT(at+38, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zn3)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early3, 39, at); SETFLOAT(at+1, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp4, y_0, z_0)); SETFLOAT(at+2, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp3, yp1, z_0)); SETFLOAT(at+3, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yp2, z_0)); SETFLOAT(at+4, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp3, z_0)); SETFLOAT(at+5, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp4, z_0)); SETFLOAT(at+6, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp3, z_0)); SETFLOAT(at+7, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yp2, z_0)); SETFLOAT(at+8, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn3, yp1, z_0)); SETFLOAT(at+9, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn4, y_0, z_0)); SETFLOAT(at+10, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn3, yn1, z_0)); SETFLOAT(at+11, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yn2, z_0)); SETFLOAT(at+12, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn3, z_0)); SETFLOAT(at+13, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn4, z_0)); SETFLOAT(at+14, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn3, z_0)); SETFLOAT(at+15, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yn2, z_0)); SETFLOAT(at+16, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp3, yn1, z_0)); SETFLOAT(at+17, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp3, y_0, zp1)); SETFLOAT(at+18, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yp1, zp1)); SETFLOAT(at+19, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp2, zp1)); SETFLOAT(at+20, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp3, zp1)); SETFLOAT(at+21, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp2, zp1)); SETFLOAT(at+22, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yp1, zp1)); SETFLOAT(at+23, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn3, y_0, zp1)); SETFLOAT(at+24, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yn1, zp1)); SETFLOAT(at+25, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn2, zp1)); SETFLOAT(at+26, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn3, zp1)); SETFLOAT(at+27, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn2, zp1)); SETFLOAT(at+28, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yn1, zp1)); SETFLOAT(at+29, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, y_0, zp2)); SETFLOAT(at+30, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp1, zp2)); SETFLOAT(at+31, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp2, zp2)); SETFLOAT(at+32, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp1, zp2)); SETFLOAT(at+33, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, y_0, zp2)); SETFLOAT(at+34, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn1, zp2)); SETFLOAT(at+35, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn2, zp2)); SETFLOAT(at+36, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn1, zp2)); SETFLOAT(at+37, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, zp3)); SETFLOAT(at+38, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, zp3)); SETFLOAT(at+39, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, zp3)); SETFLOAT(at+40, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, zp3)); SETFLOAT(at+41, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zp4)); SETFLOAT(at+42, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp3, y_0, zn1)); SETFLOAT(at+43, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yp1, zn1)); SETFLOAT(at+44, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp2, zn1)); SETFLOAT(at+45, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp3, zn1)); SETFLOAT(at+46, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp2, zn1)); SETFLOAT(at+47, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yp1, zn1)); SETFLOAT(at+48, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn3, y_0, zn1)); SETFLOAT(at+49, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, yn1, zn1)); SETFLOAT(at+50, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn2, zn1)); SETFLOAT(at+51, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn3, zn1)); SETFLOAT(at+52, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn2, zn1)); SETFLOAT(at+53, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, yn1, zn1)); SETFLOAT(at+54, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp2, y_0, zn2)); SETFLOAT(at+55, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yp1, zn2)); SETFLOAT(at+56, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp2, zn2)); SETFLOAT(at+57, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yp1, zn2)); SETFLOAT(at+58, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn2, y_0, zn2)); SETFLOAT(at+59, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, yn1, zn2)); SETFLOAT(at+60, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn2, zn2)); SETFLOAT(at+61, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, yn1, zn2)); SETFLOAT(at+62, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xp1, y_0, zn3)); SETFLOAT(at+63, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yp1, zn3)); SETFLOAT(at+64, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, xn1, y_0, zn3)); SETFLOAT(at+65, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, yn1, zn3)); SETFLOAT(at+66, xyz_3_del_damp_theta_phi_calc_azimuth(x_180_over_pi, x_0, y_0, zn4)); outlet_anything(x->x_obj.ob_outlet, x->x_s_early4, 67, at); } static void xyz_3_del_damp_theta_phi_src_xyz(t_xyz_3_del_damp_theta_phi *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_src_x = atom_getfloat(argv++); x->x_src_y = atom_getfloat(argv++); x->x_src_z = atom_getfloat(argv); if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; if(x->x_src_z > x->x_room_z) x->x_src_z = x->x_room_z; if(x->x_src_z < 0.0f) x->x_src_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void xyz_3_del_damp_theta_phi_head_xyz(t_xyz_3_del_damp_theta_phi *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.5f*x->x_room_x, yr2=0.5f*x->x_room_y; x->x_head_x = atom_getfloat(argv++); x->x_head_y = atom_getfloat(argv++); x->x_head_z = atom_getfloat(argv); if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; if(x->x_head_z > x->x_room_z) x->x_head_z = x->x_room_z; if(x->x_head_z < 0.0f) x->x_head_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void xyz_3_del_damp_theta_phi_room_xyz(t_xyz_3_del_damp_theta_phi *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3)&&IS_A_FLOAT(argv, 0)&&IS_A_FLOAT(argv, 1)&&IS_A_FLOAT(argv, 2)) { t_float xr2=0.0f, yr2=0.0f; x->x_room_x = atom_getfloat(argv++); x->x_room_y = atom_getfloat(argv++); x->x_room_z = atom_getfloat(argv); if(x->x_room_x < 0.5f) x->x_room_x = 0.5f; if(x->x_room_y < 0.5f) x->x_room_y = 0.5f; if(x->x_room_z < 0.5f) x->x_room_z = 0.5f; xr2 = 0.5f*x->x_room_x; yr2 = 0.5f*x->x_room_y; if(x->x_src_x > xr2) x->x_src_x = xr2; if(x->x_src_x < -xr2) x->x_src_x = -xr2; if(x->x_src_y > yr2) x->x_src_y = yr2; if(x->x_src_y < -yr2) x->x_src_y = -yr2; if(x->x_src_z > x->x_room_z) x->x_src_z = x->x_room_z; if(x->x_src_z < 0.0f) x->x_src_z = 0.0f; if(x->x_head_x > xr2) x->x_head_x = xr2; if(x->x_head_x < -xr2) x->x_head_x = -xr2; if(x->x_head_y > yr2) x->x_head_y = yr2; if(x->x_head_y < -yr2) x->x_head_y = -yr2; if(x->x_head_z > x->x_room_z) x->x_head_z = x->x_room_z; if(x->x_head_z < 0.0f) x->x_head_z = 0.0f; clock_delay(x->x_clock, 0.0f); } } static void xyz_3_del_damp_theta_phi_r_min(t_xyz_3_del_damp_theta_phi *x, t_float r_min) { if(r_min < 0.1f) r_min = 0.1f; x->x_r_min = r_min; clock_delay(x->x_clock, 0.0f); } static void xyz_3_del_damp_theta_phi_sonic_speed(t_xyz_3_del_damp_theta_phi *x, t_float speed) { if(speed < 10.0f) speed = 10.0f; if(speed > 2000.0f) speed = 2000.0f; x->x_speed = speed; clock_delay(x->x_clock, 0.0f); } static void xyz_3_del_damp_theta_phi_free(t_xyz_3_del_damp_theta_phi *x) { clock_free(x->x_clock); freebytes(x->x_at, x->x_size_at * sizeof(t_atom)); freebytes(x->x_rad, x->x_size_rad * sizeof(t_float)); } static void *xyz_3_del_damp_theta_phi_new(t_symbol *s, int argc, t_atom *argv) { t_xyz_3_del_damp_theta_phi *x = (t_xyz_3_del_damp_theta_phi *)pd_new(xyz_3_del_damp_theta_phi_class); x->x_room_x = 12.0f; x->x_room_y = 8.0f; x->x_room_z = 4.0f; x->x_head_x = 0.0f; x->x_head_y = 0.0f; x->x_head_z = 1.7f; x->x_src_x = 3.0f; x->x_src_y = 0.5f; x->x_src_z = 2.5f; x->x_r_min = 1.4f; x->x_speed = 340.0f; x->x_s_direct = gensym("direct"); x->x_s_early1 = gensym("early1"); x->x_s_early2 = gensym("early2"); x->x_s_early3 = gensym("early3"); x->x_s_early4 = gensym("early4"); x->x_s_damp = gensym("damp"); x->x_s_del = gensym("del"); x->x_s_theta = gensym("theta"); x->x_s_phi = gensym("phi"); x->x_size_rad = 129; // 1 + 6 + 18 + 38 + 66; 129=1+(1+4)+(4+9)+(9+16)+(16+25)+(9+16)+(4+9)+(1+4)+1 x->x_size_at = 67; // 66 + 1; 66=1+4+8+12+16+12+8+4+1; 38=1+4+8+12+8+4+1 x->x_rad = (t_float *)getbytes(x->x_size_rad * sizeof(t_float)); x->x_at = (t_atom *)getbytes(x->x_size_at * sizeof(t_atom)); outlet_new(&x->x_obj, &s_list); x->x_clock = clock_new(x, (t_method)xyz_3_del_damp_theta_phi_doit); x->x_180_over_pi = (t_float)(180.0 / (4.0 * atan(1.0))); return (x); } void xyz_3_del_damp_theta_phi_setup(void) { xyz_3_del_damp_theta_phi_class = class_new(gensym("xyz_3_del_damp_theta_phi"), (t_newmethod)xyz_3_del_damp_theta_phi_new, (t_method)xyz_3_del_damp_theta_phi_free, sizeof(t_xyz_3_del_damp_theta_phi), 0, A_GIMME, 0); class_addmethod(xyz_3_del_damp_theta_phi_class, (t_method)xyz_3_del_damp_theta_phi_src_xyz, gensym("src_xyz"), A_GIMME, 0); class_addmethod(xyz_3_del_damp_theta_phi_class, (t_method)xyz_3_del_damp_theta_phi_head_xyz, gensym("head_xyz"), A_GIMME, 0); class_addmethod(xyz_3_del_damp_theta_phi_class, (t_method)xyz_3_del_damp_theta_phi_room_xyz, gensym("room_xyz"), A_GIMME, 0); class_addmethod(xyz_3_del_damp_theta_phi_class, (t_method)xyz_3_del_damp_theta_phi_sonic_speed, gensym("sonic_speed"), A_FLOAT, 0); class_addmethod(xyz_3_del_damp_theta_phi_class, (t_method)xyz_3_del_damp_theta_phi_r_min, gensym("r_min"), A_FLOAT, 0); } iem_utils-0.0.20240903/iem_roomsim/xy_2_del_damp_phi-help.pd0000600000000000000000000003476114665566711020357 0ustar00#N canvas 250 120 1451 811 10; #X msg 59 83 sonic_speed 340; #X obj 105 154 pack; #X obj 139 154 t b f; #X floatatom 98 137 5 -20 20 0 - - -, f 5; #X floatatom 141 137 5 -20 20 0 - - -, f 5; #X text 183 136 m x m; #X obj 151 225 pack; #X obj 185 225 t b f; #X floatatom 144 208 5 -20 20 0 - - -, f 5; #X floatatom 187 208 5 -20 20 0 - - -, f 5; #X text 229 207 m x m; #X obj 48 313 print; #X msg 105 175 head_xy \$1 \$2; #X msg 151 246 src_xy \$1 \$2; #X obj 96 314 s xxx; #X obj 368 19 r xxx; #X floatatom 368 751 5 0 0 0 - - -, f 5; #X floatatom 403 728 5 0 0 0 - - -, f 5; #X floatatom 438 708 5 0 0 0 - - -, f 5; #X floatatom 485 583 5 0 0 0 - - -, f 5; #X floatatom 526 583 5 0 0 0 - - -, f 5; #X obj 415 640 unpack 0 0 0 0, f 21; #X floatatom 415 658 5 0 0 0 - - -, f 5; #X floatatom 457 658 5 0 0 0 - - -, f 5; #X floatatom 499 658 5 0 0 0 - - -, f 5; #X floatatom 542 658 5 0 0 0 - - -, f 5; #X obj 450 602 unpack 0 0 0 0, f 22; #X floatatom 450 620 5 0 0 0 - - -, f 5; #X floatatom 492 620 5 0 0 0 - - -, f 5; #X floatatom 534 620 5 0 0 0 - - -, f 5; #X floatatom 577 620 5 0 0 0 - - -, f 5; #X floatatom 567 583 5 0 0 0 - - -, f 5; #X floatatom 608 583 5 0 0 0 - - -, f 5; #X floatatom 532 425 5 0 0 0 - - -, f 5; #X floatatom 573 425 5 0 0 0 - - -, f 5; #X floatatom 462 503 5 0 0 0 - - -, f 5; #X floatatom 504 503 5 0 0 0 - - -, f 5; #X floatatom 546 503 5 0 0 0 - - -, f 5; #X floatatom 589 503 5 0 0 0 - - -, f 5; #X floatatom 614 425 5 0 0 0 - - -, f 5; #X floatatom 655 425 5 0 0 0 - - -, f 5; #X floatatom 696 425 5 0 0 0 - - -, f 5; #X floatatom 737 425 5 0 0 0 - - -, f 5; #X floatatom 778 425 5 0 0 0 - - -, f 5; #X floatatom 819 425 5 0 0 0 - - -, f 5; #X text 648 583 degree; #X text 584 657 ms; #X text 477 709 degree; #X text 409 751 ms; #X text 796 505 ms; #X obj 462 484 unpack 0 0 0 0 0 0 0 0, f 50; #X floatatom 631 503 5 0 0 0 - - -, f 5; #X floatatom 673 503 5 0 0 0 - - -, f 5; #X floatatom 715 503 5 0 0 0 - - -, f 5; #X floatatom 758 503 5 0 0 0 - - -, f 5; #X floatatom 497 463 5 0 0 0 - - -, f 5; #X floatatom 539 463 5 0 0 0 - - -, f 5; #X floatatom 581 463 5 0 0 0 - - -, f 5; #X floatatom 624 463 5 0 0 0 - - -, f 5; #X obj 497 444 unpack 0 0 0 0 0 0 0 0, f 50; #X floatatom 666 463 5 0 0 0 - - -, f 5; #X floatatom 708 463 5 0 0 0 - - -, f 5; #X floatatom 750 463 5 0 0 0 - - -, f 5; #X floatatom 793 463 5 0 0 0 - - -, f 5; #X text 857 423 degree; #X text 78 385 IEM KUG; #X text 62 373 musil; #X text 92 373 @; #X text 98 373 iem.at; #X text 61 395 Graz \, Austria; #X text 163 81 sonic speed in meter per second; #X text 148 105 minimum raduis in meter; #X text 149 64 room dimensions in meter; #X text 237 250 object coordinates; #X text 194 174 subject coordinates; #X text 830 463 linear rms; #X text 615 619 linear rms; #X text 441 726 linear rms; #X text 1114 538 |; #X text 1114 546 |; #X text 1114 554 |; #X text 1114 562 |; #X text 1150 538 |; #X text 1150 546 |; #X text 1150 554 |; #X text 1150 562 |; #X text 1186 538 |; #X text 1186 546 |; #X text 1186 554 |; #X text 1186 562 |; #X text 1222 538 |; #X text 1222 546 |; #X text 1222 554 |; #X text 1222 562 |; #X text 1258 538 |; #X text 1258 546 |; #X text 1258 554 |; #X text 1258 562 |; #X text 1198 482 + y; #X text 1101 531 --+-----+-----+-----+-----+-----+--; #X text 1294 538 |; #X text 1294 546 |; #X text 1294 554 |; #X text 1294 562 |; #X text 1114 576 |; #X text 1114 584 |; #X text 1114 592 |; #X text 1114 600 |; #X text 1150 576 |; #X text 1150 584 |; #X text 1150 592 |; #X text 1150 600 |; #X text 1186 576 |; #X text 1186 584 |; #X text 1186 592 |; #X text 1186 600 |; #X text 1222 576 |; #X text 1222 584 |; #X text 1222 592 |; #X text 1222 600 |; #X text 1258 576 |; #X text 1258 584 |; #X text 1258 592 |; #X text 1258 600 |; #X text 1101 569 --+-----+-----+-----+-----+-----+--; #X text 1294 576 |; #X text 1294 584 |; #X text 1294 592 |; #X text 1294 600 |; #X text 1114 614 |; #X text 1114 622 |; #X text 1114 630 |; #X text 1114 638 |; #X text 1150 614 |; #X text 1150 622 |; #X text 1150 630 |; #X text 1150 638 |; #X text 1186 614 |; #X text 1186 622 |; #X text 1186 630 |; #X text 1186 638 |; #X text 1222 614 |; #X text 1222 622 |; #X text 1222 630 |; #X text 1222 638 |; #X text 1258 614 |; #X text 1258 622 |; #X text 1258 630 |; #X text 1258 638 |; #X text 1101 607 --+-----+-----+-----+-----+-----+--; #X text 1294 614 |; #X text 1294 622 |; #X text 1294 630 |; #X text 1294 638 |; #X text 1114 652 |; #X text 1114 660 |; #X text 1114 668 |; #X text 1114 676 |; #X text 1150 652 |; #X text 1150 660 |; #X text 1150 668 |; #X text 1150 676 |; #X text 1186 652 |; #X text 1186 660 |; #X text 1186 668 |; #X text 1186 676 |; #X text 1222 652 |; #X text 1222 660 |; #X text 1222 668 |; #X text 1222 676 |; #X text 1258 652 |; #X text 1258 660 |; #X text 1258 668 |; #X text 1258 676 |; #X text 1101 645 --+-----+-----+-----+-----+-----+--; #X text 1294 652 |; #X text 1294 660 |; #X text 1294 668 |; #X text 1294 676 |; #X text 1114 690 |; #X text 1114 698 |; #X text 1114 706 |; #X text 1114 714 |; #X text 1150 690 |; #X text 1150 698 |; #X text 1150 706 |; #X text 1150 714 |; #X text 1186 690 |; #X text 1186 698 |; #X text 1186 706 |; #X text 1186 714 |; #X text 1222 690 |; #X text 1222 698 |; #X text 1222 706 |; #X text 1222 714 |; #X text 1258 690 |; #X text 1258 698 |; #X text 1258 706 |; #X text 1258 714 |; #X text 1101 683 --+-----+-----+-----+-----+-----+--; #X text 1294 690 |; #X text 1294 698 |; #X text 1294 706 |; #X text 1294 714 |; #X text 1101 721 --+-----+-----+-----+-----+-----+--; #X text 1180 621 ___________________________; #X text 1341 626 > + x; #X text 1204 498 |; #X text 1204 505 |; #X text 1204 512 |; #X text 1204 519 |; #X text 1204 526 |; #X text 1204 533 |; #X text 1204 540 |; #X text 1204 547 |; #X text 1204 554 |; #X text 1204 561 |; #X text 1204 568 |; #X text 1204 575 |; #X text 1204 574 |; #X text 1204 581 |; #X text 1204 588 |; #X text 1204 595 |; #X text 1204 601 |; #X text 1204 608 |; #X text 1204 615 |; #X text 1204 622 |; #X text 1204 629 |; #X text 1204 636 |; #X text 1204 643 |; #X text 1204 650 |; #X text 1204 494 ^; #X text 1229 634 e1_1; #X text 1192 589 e1_2; #X text 1158 634 e1_3; #X text 1193 667 e1_4; #X text 1265 634 e2_1; #X text 1197 634 d_1; #X text 1302 440 d .. direct; #X text 1297 452 e1 .. early 1; #X text 1297 464 e2 .. early 2; #X text 1223 505 mirror source rooms; #X text 680 23 renders the delay time \, the damping and the direction of direct \, early_1 and early_2 reflections in a cuboid room model (2 dimensional); #X text 11 9 xy_2_del_damp_phi; #X msg 48 63 room_xy 20 10; #X obj 48 288 xy_2_del_damp_phi; #X obj 368 687 route del damp phi; #X obj 415 541 route del damp phi; #X obj 462 382 route del damp phi; #X obj 485 565 unpack 0 0 0 0, f 21; #X obj 532 407 unpack 0 0 0 0 0 0 0 0, f 48; #X obj 368 41 route direct early1 early2 early3 early4; #X floatatom 580 275 5 0 0 0 - - -, f 5; #X floatatom 621 275 5 0 0 0 - - -, f 5; #X floatatom 662 275 5 0 0 0 - - -, f 5; #X floatatom 703 275 5 0 0 0 - - -, f 5; #X floatatom 744 275 5 0 0 0 - - -, f 5; #X floatatom 785 275 5 0 0 0 - - -, f 5; #X floatatom 826 275 5 0 0 0 - - -, f 5; #X floatatom 867 275 5 0 0 0 - - -, f 5; #X text 1003 353 ms; #X text 1069 273 degree; #X text 1038 314 linear rms; #X obj 510 232 route del damp phi; #X obj 580 257 unpack 0 0 0 0 0 0 0 0 0 0 0 0, f 75; #X floatatom 908 275 5 0 0 0 - - -, f 5; #X floatatom 949 275 5 0 0 0 - - -, f 5; #X floatatom 990 275 5 0 0 0 - - -, f 5; #X floatatom 1031 275 5 0 0 0 - - -, f 5; #X floatatom 545 314 5 0 0 0 - - -, f 5; #X floatatom 586 314 5 0 0 0 - - -, f 5; #X floatatom 627 314 5 0 0 0 - - -, f 5; #X floatatom 668 314 5 0 0 0 - - -, f 5; #X floatatom 709 314 5 0 0 0 - - -, f 5; #X floatatom 750 314 5 0 0 0 - - -, f 5; #X floatatom 791 314 5 0 0 0 - - -, f 5; #X floatatom 832 314 5 0 0 0 - - -, f 5; #X obj 545 296 unpack 0 0 0 0 0 0 0 0 0 0 0 0, f 75; #X floatatom 873 314 5 0 0 0 - - -, f 5; #X floatatom 914 314 5 0 0 0 - - -, f 5; #X floatatom 955 314 5 0 0 0 - - -, f 5; #X floatatom 996 314 5 0 0 0 - - -, f 5; #X floatatom 510 352 5 0 0 0 - - -, f 5; #X floatatom 551 352 5 0 0 0 - - -, f 5; #X floatatom 592 352 5 0 0 0 - - -, f 5; #X floatatom 633 352 5 0 0 0 - - -, f 5; #X floatatom 674 352 5 0 0 0 - - -, f 5; #X floatatom 715 352 5 0 0 0 - - -, f 5; #X floatatom 756 352 5 0 0 0 - - -, f 5; #X floatatom 797 352 5 0 0 0 - - -, f 5; #X obj 510 334 unpack 0 0 0 0 0 0 0 0 0 0 0 0, f 75; #X floatatom 838 352 5 0 0 0 - - -, f 5; #X floatatom 879 352 5 0 0 0 - - -, f 5; #X floatatom 920 352 5 0 0 0 - - -, f 5; #X floatatom 961 352 5 0 0 0 - - -, f 5; #X floatatom 627 125 5 0 0 0 - - -, f 5; #X floatatom 668 125 5 0 0 0 - - -, f 5; #X floatatom 709 125 5 0 0 0 - - -, f 5; #X floatatom 750 125 5 0 0 0 - - -, f 5; #X floatatom 791 125 5 0 0 0 - - -, f 5; #X floatatom 832 125 5 0 0 0 - - -, f 5; #X floatatom 873 125 5 0 0 0 - - -, f 5; #X floatatom 914 125 5 0 0 0 - - -, f 5; #X text 1210 203 ms; #X text 1276 123 degree; #X text 1245 164 linear rms; #X obj 557 82 route del damp phi; #X floatatom 955 125 5 0 0 0 - - -, f 5; #X floatatom 996 125 5 0 0 0 - - -, f 5; #X floatatom 1037 125 5 0 0 0 - - -, f 5; #X floatatom 1078 125 5 0 0 0 - - -, f 5; #X text 1230 589 e2_2; #X text 1192 549 e2_3; #X text 1158 589 e2_4; #X text 1122 634 e2_5; #X text 1158 665 e2_6; #X text 1193 703 e2_7; #X text 1230 665 e2_8; #X floatatom 1119 125 5 0 0 0 - - -, f 5; #X floatatom 1160 125 5 0 0 0 - - -, f 5; #X floatatom 1201 125 5 0 0 0 - - -, f 5; #X floatatom 1242 125 5 0 0 0 - - -, f 5; #X obj 627 107 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 103; #X floatatom 592 165 5 0 0 0 - - -, f 5; #X floatatom 633 165 5 0 0 0 - - -, f 5; #X floatatom 674 165 5 0 0 0 - - -, f 5; #X floatatom 715 165 5 0 0 0 - - -, f 5; #X floatatom 756 165 5 0 0 0 - - -, f 5; #X floatatom 797 165 5 0 0 0 - - -, f 5; #X floatatom 838 165 5 0 0 0 - - -, f 5; #X floatatom 879 165 5 0 0 0 - - -, f 5; #X floatatom 920 165 5 0 0 0 - - -, f 5; #X floatatom 961 165 5 0 0 0 - - -, f 5; #X floatatom 1002 165 5 0 0 0 - - -, f 5; #X floatatom 1043 165 5 0 0 0 - - -, f 5; #X floatatom 1084 165 5 0 0 0 - - -, f 5; #X floatatom 1125 165 5 0 0 0 - - -, f 5; #X floatatom 1166 165 5 0 0 0 - - -, f 5; #X floatatom 1207 165 5 0 0 0 - - -, f 5; #X obj 592 147 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 103; #X floatatom 557 205 5 0 0 0 - - -, f 5; #X floatatom 598 205 5 0 0 0 - - -, f 5; #X floatatom 639 205 5 0 0 0 - - -, f 5; #X floatatom 680 205 5 0 0 0 - - -, f 5; #X floatatom 721 205 5 0 0 0 - - -, f 5; #X floatatom 762 205 5 0 0 0 - - -, f 5; #X floatatom 803 205 5 0 0 0 - - -, f 5; #X floatatom 844 205 5 0 0 0 - - -, f 5; #X floatatom 885 205 5 0 0 0 - - -, f 5; #X floatatom 926 205 5 0 0 0 - - -, f 5; #X floatatom 967 205 5 0 0 0 - - -, f 5; #X floatatom 1008 205 5 0 0 0 - - -, f 5; #X floatatom 1049 205 5 0 0 0 - - -, f 5; #X floatatom 1090 205 5 0 0 0 - - -, f 5; #X floatatom 1131 205 5 0 0 0 - - -, f 5; #X floatatom 1172 205 5 0 0 0 - - -, f 5; #X obj 557 187 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 103; #X msg 67 104 r_min 1.4; #X text 13 362 (c) Thomas Musil 2000 - 2018; #X connect 0 0 245 0; #X connect 1 0 12 0; #X connect 2 0 1 0; #X connect 2 1 1 1; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 6 0 13 0; #X connect 7 0 6 0; #X connect 7 1 6 1; #X connect 8 0 6 0; #X connect 9 0 7 0; #X connect 12 0 245 0; #X connect 13 0 245 0; #X connect 15 0 251 0; #X connect 21 0 22 0; #X connect 21 1 23 0; #X connect 21 2 24 0; #X connect 21 3 25 0; #X connect 26 0 27 0; #X connect 26 1 28 0; #X connect 26 2 29 0; #X connect 26 3 30 0; #X connect 50 0 35 0; #X connect 50 1 36 0; #X connect 50 2 37 0; #X connect 50 3 38 0; #X connect 50 4 51 0; #X connect 50 5 52 0; #X connect 50 6 53 0; #X connect 50 7 54 0; #X connect 59 0 55 0; #X connect 59 1 56 0; #X connect 59 2 57 0; #X connect 59 3 58 0; #X connect 59 4 60 0; #X connect 59 5 61 0; #X connect 59 6 62 0; #X connect 59 7 63 0; #X connect 244 0 245 0; #X connect 245 0 11 0; #X connect 245 0 14 0; #X connect 246 0 16 0; #X connect 246 1 17 0; #X connect 246 2 18 0; #X connect 247 0 21 0; #X connect 247 1 26 0; #X connect 247 2 249 0; #X connect 248 0 50 0; #X connect 248 1 59 0; #X connect 248 2 250 0; #X connect 249 0 19 0; #X connect 249 1 20 0; #X connect 249 2 31 0; #X connect 249 3 32 0; #X connect 250 0 33 0; #X connect 250 1 34 0; #X connect 250 2 39 0; #X connect 250 3 40 0; #X connect 250 4 41 0; #X connect 250 5 42 0; #X connect 250 6 43 0; #X connect 250 7 44 0; #X connect 251 0 246 0; #X connect 251 1 247 0; #X connect 251 2 248 0; #X connect 251 3 263 0; #X connect 251 4 306 0; #X connect 263 0 290 0; #X connect 263 1 277 0; #X connect 263 2 264 0; #X connect 264 0 252 0; #X connect 264 1 253 0; #X connect 264 2 254 0; #X connect 264 3 255 0; #X connect 264 4 256 0; #X connect 264 5 257 0; #X connect 264 6 258 0; #X connect 264 7 259 0; #X connect 264 8 265 0; #X connect 264 9 266 0; #X connect 264 10 267 0; #X connect 264 11 268 0; #X connect 277 0 269 0; #X connect 277 1 270 0; #X connect 277 2 271 0; #X connect 277 3 272 0; #X connect 277 4 273 0; #X connect 277 5 274 0; #X connect 277 6 275 0; #X connect 277 7 276 0; #X connect 277 8 278 0; #X connect 277 9 279 0; #X connect 277 10 280 0; #X connect 277 11 281 0; #X connect 290 0 282 0; #X connect 290 1 283 0; #X connect 290 2 284 0; #X connect 290 3 285 0; #X connect 290 4 286 0; #X connect 290 5 287 0; #X connect 290 6 288 0; #X connect 290 7 289 0; #X connect 290 8 291 0; #X connect 290 9 292 0; #X connect 290 10 293 0; #X connect 290 11 294 0; #X connect 306 0 356 0; #X connect 306 1 339 0; #X connect 306 2 322 0; #X connect 322 0 295 0; #X connect 322 1 296 0; #X connect 322 2 297 0; #X connect 322 3 298 0; #X connect 322 4 299 0; #X connect 322 5 300 0; #X connect 322 6 301 0; #X connect 322 7 302 0; #X connect 322 8 307 0; #X connect 322 9 308 0; #X connect 322 10 309 0; #X connect 322 11 310 0; #X connect 322 12 318 0; #X connect 322 13 319 0; #X connect 322 14 320 0; #X connect 322 15 321 0; #X connect 339 0 323 0; #X connect 339 1 324 0; #X connect 339 2 325 0; #X connect 339 3 326 0; #X connect 339 4 327 0; #X connect 339 5 328 0; #X connect 339 6 329 0; #X connect 339 7 330 0; #X connect 339 8 331 0; #X connect 339 9 332 0; #X connect 339 10 333 0; #X connect 339 11 334 0; #X connect 339 12 335 0; #X connect 339 13 336 0; #X connect 339 14 337 0; #X connect 339 15 338 0; #X connect 356 0 340 0; #X connect 356 1 341 0; #X connect 356 2 342 0; #X connect 356 3 343 0; #X connect 356 4 344 0; #X connect 356 5 345 0; #X connect 356 6 346 0; #X connect 356 7 347 0; #X connect 356 8 348 0; #X connect 356 9 349 0; #X connect 356 10 350 0; #X connect 356 11 351 0; #X connect 356 12 352 0; #X connect 356 13 353 0; #X connect 356 14 354 0; #X connect 356 15 355 0; #X connect 357 0 245 0; iem_utils-0.0.20240903/iem_roomsim/xyz_3_del_damp_theta_phi-help.pd0000600000000000000000000012427314665566711021735 0ustar00#N canvas 250 0 2053 1022 10; #X msg 59 83 sonic_speed 340; #X obj 137 164 t b f; #X floatatom 82 147 5 -20 20 0 - - -, f 5; #X floatatom 139 147 5 -20 20 0 - - -, f 5; #X obj 140 290 t b f; #X floatatom 85 273 5 -20 20 0 - - -, f 5; #X floatatom 142 273 5 -20 20 0 - - -, f 5; #X obj 48 363 print; #X obj 96 364 s xxx; #X obj 368 19 r xxx; #X floatatom 368 948 5 0 0 0 - - -, f 5; #X floatatom 403 925 5 0 0 0 - - -, f 5; #X floatatom 438 905 5 0 0 0 - - -, f 5; #X text 694 760 degree; #X text 624 833 ms; #X text 477 906 degree; #X text 409 948 ms; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 163 81 sonic speed in meter per second; #X text 136 103 minimum raduis in meter; #X text 156 64 room dimensions in meter; #X text 198 312 object coordinates; #X text 201 183 subject coordinates; #X text 658 796 linear rms; #X text 441 923 linear rms; #X text 1014 768 |; #X text 1014 776 |; #X text 1014 784 |; #X text 1014 792 |; #X text 1050 768 |; #X text 1050 776 |; #X text 1050 784 |; #X text 1050 792 |; #X text 1086 768 |; #X text 1086 776 |; #X text 1086 784 |; #X text 1086 792 |; #X text 1122 768 |; #X text 1122 776 |; #X text 1122 784 |; #X text 1122 792 |; #X text 1158 768 |; #X text 1158 776 |; #X text 1158 784 |; #X text 1158 792 |; #X text 1098 712 + y; #X text 1001 761 --+-----+-----+-----+-----+-----+--; #X text 1194 768 |; #X text 1194 776 |; #X text 1194 784 |; #X text 1194 792 |; #X text 1014 806 |; #X text 1014 814 |; #X text 1014 822 |; #X text 1014 830 |; #X text 1050 806 |; #X text 1050 814 |; #X text 1050 822 |; #X text 1050 830 |; #X text 1086 806 |; #X text 1086 814 |; #X text 1086 822 |; #X text 1086 830 |; #X text 1122 806 |; #X text 1122 814 |; #X text 1122 822 |; #X text 1122 830 |; #X text 1158 806 |; #X text 1158 814 |; #X text 1158 822 |; #X text 1158 830 |; #X text 1001 799 --+-----+-----+-----+-----+-----+--; #X text 1194 806 |; #X text 1194 814 |; #X text 1194 822 |; #X text 1194 830 |; #X text 1014 844 |; #X text 1014 852 |; #X text 1014 860 |; #X text 1014 868 |; #X text 1050 844 |; #X text 1050 852 |; #X text 1050 860 |; #X text 1050 868 |; #X text 1086 844 |; #X text 1086 852 |; #X text 1086 860 |; #X text 1086 868 |; #X text 1122 844 |; #X text 1122 852 |; #X text 1122 860 |; #X text 1122 868 |; #X text 1158 844 |; #X text 1158 852 |; #X text 1158 860 |; #X text 1158 868 |; #X text 1001 837 --+-----+-----+-----+-----+-----+--; #X text 1194 844 |; #X text 1194 852 |; #X text 1194 860 |; #X text 1194 868 |; #X text 1014 882 |; #X text 1014 890 |; #X text 1014 898 |; #X text 1014 906 |; #X text 1050 882 |; #X text 1050 890 |; #X text 1050 898 |; #X text 1050 906 |; #X text 1086 882 |; #X text 1086 890 |; #X text 1086 898 |; #X text 1086 906 |; #X text 1122 882 |; #X text 1122 890 |; #X text 1122 898 |; #X text 1122 906 |; #X text 1158 882 |; #X text 1158 890 |; #X text 1158 898 |; #X text 1158 906 |; #X text 1001 875 --+-----+-----+-----+-----+-----+--; #X text 1194 882 |; #X text 1194 890 |; #X text 1194 898 |; #X text 1194 906 |; #X text 1014 920 |; #X text 1014 928 |; #X text 1014 936 |; #X text 1014 944 |; #X text 1050 920 |; #X text 1050 928 |; #X text 1050 936 |; #X text 1050 944 |; #X text 1086 920 |; #X text 1086 928 |; #X text 1086 936 |; #X text 1086 944 |; #X text 1122 920 |; #X text 1122 928 |; #X text 1122 936 |; #X text 1122 944 |; #X text 1158 920 |; #X text 1158 928 |; #X text 1158 936 |; #X text 1158 944 |; #X text 1001 913 --+-----+-----+-----+-----+-----+--; #X text 1194 920 |; #X text 1194 928 |; #X text 1194 936 |; #X text 1194 944 |; #X text 1001 951 --+-----+-----+-----+-----+-----+--; #X text 1080 851 ___________________________; #X text 1241 856 > + x; #X text 1104 728 |; #X text 1104 735 |; #X text 1104 742 |; #X text 1104 749 |; #X text 1104 756 |; #X text 1104 763 |; #X text 1104 770 |; #X text 1104 777 |; #X text 1104 784 |; #X text 1104 791 |; #X text 1104 798 |; #X text 1104 805 |; #X text 1104 804 |; #X text 1104 811 |; #X text 1104 818 |; #X text 1104 825 |; #X text 1104 831 |; #X text 1104 838 |; #X text 1104 845 |; #X text 1104 852 |; #X text 1104 859 |; #X text 1104 866 |; #X text 1104 873 |; #X text 1104 880 |; #X text 1104 724 ^; #X text 1129 864 e1_1; #X text 1092 819 e1_2; #X text 1058 864 e1_3; #X text 1093 897 e1_4; #X text 1165 864 e2_1; #X text 1097 864 d_1; #X text 905 862 d .. direct; #X text 900 874 e1 .. early 1; #X text 900 886 e2 .. early 2; #X text 1123 735 mirror source rooms; #X text 680 23 renders the delay time \, the damping and the direction of direct \, early_1 and early_2 reflections in a cuboid room model (2 dimensional); #X obj 368 41 route direct early1 early2 early3 early4; #X text 1130 819 e2_2; #X text 1092 779 e2_3; #X text 1058 819 e2_4; #X text 1022 864 e2_5; #X text 1058 895 e2_6; #X text 1093 933 e2_7; #X text 1130 895 e2_8; #X text 11 9 xyz_3_del_damp_theta_phi; #X obj 48 338 xyz_3_del_damp_theta_phi; #X text 13 412 (c) Thomas Musil 2000 - 2018; #X msg 67 104 r_min 1.4; #X msg 89 185 head_xyz \$1 \$2 \$3; #X msg 92 311 src_xyz \$1 \$2 \$3; #X msg 48 63 room_xyz 20 10 7; #X text 223 145 m x m x m; #X text 221 271 m x m x m; #X obj 177 164 t b f; #X floatatom 179 147 5 -20 20 0 - - -, f 5; #X obj 69 164 pack f f f; #X obj 72 290 pack f f f; #X obj 181 290 t b f; #X floatatom 183 273 5 -20 20 0 - - -, f 5; #X obj 368 864 route del damp theta phi; #X obj 415 685 route del damp theta phi; #X floatatom 473 885 5 0 0 0 - - -, f 5; #X text 512 886 degree; #X floatatom 520 723 5 0 0 0 - - -, f 5; #X floatatom 555 723 5 0 0 0 - - -, f 5; #X floatatom 590 723 5 0 0 0 - - -, f 5; #X floatatom 625 723 5 0 0 0 - - -, f 5; #X text 729 723 degree; #X obj 520 705 unpack 0 0 0 0 0 0, f 30; #X floatatom 660 723 5 0 0 0 - - -, f 5; #X floatatom 695 723 5 0 0 0 - - -, f 5; #X floatatom 485 759 5 0 0 0 - - -, f 5; #X floatatom 520 759 5 0 0 0 - - -, f 5; #X floatatom 555 759 5 0 0 0 - - -, f 5; #X floatatom 590 759 5 0 0 0 - - -, f 5; #X obj 485 741 unpack 0 0 0 0 0 0, f 30; #X floatatom 625 759 5 0 0 0 - - -, f 5; #X floatatom 660 759 5 0 0 0 - - -, f 5; #X floatatom 450 795 5 0 0 0 - - -, f 5; #X floatatom 485 795 5 0 0 0 - - -, f 5; #X floatatom 520 795 5 0 0 0 - - -, f 5; #X floatatom 555 795 5 0 0 0 - - -, f 5; #X obj 450 777 unpack 0 0 0 0 0 0, f 30; #X floatatom 590 795 5 0 0 0 - - -, f 5; #X floatatom 625 795 5 0 0 0 - - -, f 5; #X floatatom 415 832 5 0 0 0 - - -, f 5; #X floatatom 450 832 5 0 0 0 - - -, f 5; #X floatatom 485 832 5 0 0 0 - - -, f 5; #X floatatom 520 832 5 0 0 0 - - -, f 5; #X obj 415 814 unpack 0 0 0 0 0 0, f 30; #X floatatom 555 832 5 0 0 0 - - -, f 5; #X floatatom 590 832 5 0 0 0 - - -, f 5; #X text 1165 587 degree; #X text 1095 660 ms; #X text 1129 623 linear rms; #X obj 462 511 route del damp theta phi; #X floatatom 567 550 5 0 0 0 - - -, f 5; #X floatatom 602 550 5 0 0 0 - - -, f 5; #X floatatom 637 550 5 0 0 0 - - -, f 5; #X floatatom 672 550 5 0 0 0 - - -, f 5; #X text 1200 550 degree; #X floatatom 707 550 5 0 0 0 - - -, f 5; #X floatatom 742 550 5 0 0 0 - - -, f 5; #X obj 567 532 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 99; #X floatatom 777 550 5 0 0 0 - - -, f 5; #X floatatom 812 550 5 0 0 0 - - -, f 5; #X floatatom 847 550 5 0 0 0 - - -, f 5; #X floatatom 882 550 5 0 0 0 - - -, f 5; #X floatatom 917 550 5 0 0 0 - - -, f 5; #X floatatom 952 550 5 0 0 0 - - -, f 5; #X floatatom 987 550 5 0 0 0 - - -, f 5; #X floatatom 1022 550 5 0 0 0 - - -, f 5; #X floatatom 1057 550 5 0 0 0 - - -, f 5; #X floatatom 1092 550 5 0 0 0 - - -, f 5; #X floatatom 1127 550 5 0 0 0 - - -, f 5; #X floatatom 1162 550 5 0 0 0 - - -, f 5; #X floatatom 532 587 5 0 0 0 - - -, f 5; #X floatatom 567 587 5 0 0 0 - - -, f 5; #X floatatom 602 587 5 0 0 0 - - -, f 5; #X floatatom 637 587 5 0 0 0 - - -, f 5; #X floatatom 672 587 5 0 0 0 - - -, f 5; #X floatatom 707 587 5 0 0 0 - - -, f 5; #X obj 532 569 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 99; #X floatatom 742 587 5 0 0 0 - - -, f 5; #X floatatom 777 587 5 0 0 0 - - -, f 5; #X floatatom 812 587 5 0 0 0 - - -, f 5; #X floatatom 847 587 5 0 0 0 - - -, f 5; #X floatatom 882 587 5 0 0 0 - - -, f 5; #X floatatom 917 587 5 0 0 0 - - -, f 5; #X floatatom 952 587 5 0 0 0 - - -, f 5; #X floatatom 987 587 5 0 0 0 - - -, f 5; #X floatatom 1022 587 5 0 0 0 - - -, f 5; #X floatatom 1057 587 5 0 0 0 - - -, f 5; #X floatatom 1092 587 5 0 0 0 - - -, f 5; #X floatatom 1127 587 5 0 0 0 - - -, f 5; #X floatatom 497 623 5 0 0 0 - - -, f 5; #X floatatom 532 623 5 0 0 0 - - -, f 5; #X floatatom 567 623 5 0 0 0 - - -, f 5; #X floatatom 602 623 5 0 0 0 - - -, f 5; #X floatatom 637 623 5 0 0 0 - - -, f 5; #X floatatom 672 623 5 0 0 0 - - -, f 5; #X obj 497 605 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 99; #X floatatom 707 623 5 0 0 0 - - -, f 5; #X floatatom 742 623 5 0 0 0 - - -, f 5; #X floatatom 777 623 5 0 0 0 - - -, f 5; #X floatatom 812 623 5 0 0 0 - - -, f 5; #X floatatom 847 623 5 0 0 0 - - -, f 5; #X floatatom 882 623 5 0 0 0 - - -, f 5; #X floatatom 917 623 5 0 0 0 - - -, f 5; #X floatatom 952 623 5 0 0 0 - - -, f 5; #X floatatom 987 623 5 0 0 0 - - -, f 5; #X floatatom 1022 623 5 0 0 0 - - -, f 5; #X floatatom 1057 623 5 0 0 0 - - -, f 5; #X floatatom 1092 623 5 0 0 0 - - -, f 5; #X floatatom 462 660 5 0 0 0 - - -, f 5; #X floatatom 497 660 5 0 0 0 - - -, f 5; #X floatatom 532 660 5 0 0 0 - - -, f 5; #X floatatom 567 660 5 0 0 0 - - -, f 5; #X floatatom 602 660 5 0 0 0 - - -, f 5; #X floatatom 637 660 5 0 0 0 - - -, f 5; #X obj 462 642 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 99; #X floatatom 672 660 5 0 0 0 - - -, f 5; #X floatatom 707 660 5 0 0 0 - - -, f 5; #X floatatom 742 660 5 0 0 0 - - -, f 5; #X floatatom 777 660 5 0 0 0 - - -, f 5; #X floatatom 812 660 5 0 0 0 - - -, f 5; #X floatatom 847 660 5 0 0 0 - - -, f 5; #X floatatom 882 660 5 0 0 0 - - -, f 5; #X floatatom 917 660 5 0 0 0 - - -, f 5; #X floatatom 952 660 5 0 0 0 - - -, f 5; #X floatatom 987 660 5 0 0 0 - - -, f 5; #X floatatom 1022 660 5 0 0 0 - - -, f 5; #X floatatom 1057 660 5 0 0 0 - - -, f 5; #X text 1914 416 degree; #X text 1844 489 ms; #X text 1878 452 linear rms; #X obj 510 340 route del damp theta phi; #X floatatom 615 379 5 0 0 0 - - -, f 5; #X floatatom 650 379 5 0 0 0 - - -, f 5; #X floatatom 685 379 5 0 0 0 - - -, f 5; #X floatatom 720 379 5 0 0 0 - - -, f 5; #X text 1949 379 degree; #X floatatom 755 379 5 0 0 0 - - -, f 5; #X floatatom 790 379 5 0 0 0 - - -, f 5; #X floatatom 825 379 5 0 0 0 - - -, f 5; #X floatatom 860 379 5 0 0 0 - - -, f 5; #X floatatom 895 379 5 0 0 0 - - -, f 5; #X floatatom 930 379 5 0 0 0 - - -, f 5; #X floatatom 965 379 5 0 0 0 - - -, f 5; #X floatatom 1000 379 5 0 0 0 - - -, f 5; #X floatatom 1035 379 5 0 0 0 - - -, f 5; #X floatatom 1070 379 5 0 0 0 - - -, f 5; #X floatatom 1105 379 5 0 0 0 - - -, f 5; #X floatatom 1140 379 5 0 0 0 - - -, f 5; #X floatatom 1175 379 5 0 0 0 - - -, f 5; #X floatatom 1210 379 5 0 0 0 - - -, f 5; #X obj 615 361 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 216; #X floatatom 1245 379 5 0 0 0 - - -, f 5; #X floatatom 1280 379 5 0 0 0 - - -, f 5; #X floatatom 1315 379 5 0 0 0 - - -, f 5; #X floatatom 1350 379 5 0 0 0 - - -, f 5; #X floatatom 1385 379 5 0 0 0 - - -, f 5; #X floatatom 1420 379 5 0 0 0 - - -, f 5; #X floatatom 1455 379 5 0 0 0 - - -, f 5; #X floatatom 1490 379 5 0 0 0 - - -, f 5; #X floatatom 1525 379 5 0 0 0 - - -, f 5; #X floatatom 1560 379 5 0 0 0 - - -, f 5; #X floatatom 1595 379 5 0 0 0 - - -, f 5; #X floatatom 1630 379 5 0 0 0 - - -, f 5; #X floatatom 1665 379 5 0 0 0 - - -, f 5; #X floatatom 1700 379 5 0 0 0 - - -, f 5; #X floatatom 1735 379 5 0 0 0 - - -, f 5; #X floatatom 1770 379 5 0 0 0 - - -, f 5; #X floatatom 1805 379 5 0 0 0 - - -, f 5; #X floatatom 1840 379 5 0 0 0 - - -, f 5; #X floatatom 1875 379 5 0 0 0 - - -, f 5; #X floatatom 1910 379 5 0 0 0 - - -, f 5; #X floatatom 580 415 5 0 0 0 - - -, f 5; #X floatatom 615 415 5 0 0 0 - - -, f 5; #X floatatom 650 415 5 0 0 0 - - -, f 5; #X floatatom 685 415 5 0 0 0 - - -, f 5; #X floatatom 720 415 5 0 0 0 - - -, f 5; #X floatatom 755 415 5 0 0 0 - - -, f 5; #X floatatom 790 415 5 0 0 0 - - -, f 5; #X floatatom 825 415 5 0 0 0 - - -, f 5; #X floatatom 860 415 5 0 0 0 - - -, f 5; #X floatatom 895 415 5 0 0 0 - - -, f 5; #X floatatom 930 415 5 0 0 0 - - -, f 5; #X floatatom 965 415 5 0 0 0 - - -, f 5; #X floatatom 1000 415 5 0 0 0 - - -, f 5; #X floatatom 1035 415 5 0 0 0 - - -, f 5; #X floatatom 1070 415 5 0 0 0 - - -, f 5; #X floatatom 1105 415 5 0 0 0 - - -, f 5; #X floatatom 1140 415 5 0 0 0 - - -, f 5; #X floatatom 1175 415 5 0 0 0 - - -, f 5; #X obj 580 397 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 216; #X floatatom 1210 415 5 0 0 0 - - -, f 5; #X floatatom 1245 415 5 0 0 0 - - -, f 5; #X floatatom 1280 415 5 0 0 0 - - -, f 5; #X floatatom 1315 415 5 0 0 0 - - -, f 5; #X floatatom 1350 415 5 0 0 0 - - -, f 5; #X floatatom 1385 415 5 0 0 0 - - -, f 5; #X floatatom 1420 415 5 0 0 0 - - -, f 5; #X floatatom 1455 415 5 0 0 0 - - -, f 5; #X floatatom 1490 415 5 0 0 0 - - -, f 5; #X floatatom 1525 415 5 0 0 0 - - -, f 5; #X floatatom 1560 415 5 0 0 0 - - -, f 5; #X floatatom 1595 415 5 0 0 0 - - -, f 5; #X floatatom 1630 415 5 0 0 0 - - -, f 5; #X floatatom 1665 415 5 0 0 0 - - -, f 5; #X floatatom 1700 415 5 0 0 0 - - -, f 5; #X floatatom 1735 415 5 0 0 0 - - -, f 5; #X floatatom 1770 415 5 0 0 0 - - -, f 5; #X floatatom 1805 415 5 0 0 0 - - -, f 5; #X floatatom 1840 415 5 0 0 0 - - -, f 5; #X floatatom 1875 415 5 0 0 0 - - -, f 5; #X floatatom 545 451 5 0 0 0 - - -, f 5; #X floatatom 580 451 5 0 0 0 - - -, f 5; #X floatatom 615 451 5 0 0 0 - - -, f 5; #X floatatom 650 451 5 0 0 0 - - -, f 5; #X floatatom 685 451 5 0 0 0 - - -, f 5; #X floatatom 720 451 5 0 0 0 - - -, f 5; #X floatatom 755 451 5 0 0 0 - - -, f 5; #X floatatom 790 451 5 0 0 0 - - -, f 5; #X floatatom 825 451 5 0 0 0 - - -, f 5; #X floatatom 860 451 5 0 0 0 - - -, f 5; #X floatatom 895 451 5 0 0 0 - - -, f 5; #X floatatom 930 451 5 0 0 0 - - -, f 5; #X floatatom 965 451 5 0 0 0 - - -, f 5; #X floatatom 1000 451 5 0 0 0 - - -, f 5; #X floatatom 1035 451 5 0 0 0 - - -, f 5; #X floatatom 1070 451 5 0 0 0 - - -, f 5; #X floatatom 1105 451 5 0 0 0 - - -, f 5; #X floatatom 1140 451 5 0 0 0 - - -, f 5; #X obj 545 433 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 216; #X floatatom 1175 451 5 0 0 0 - - -, f 5; #X floatatom 1210 451 5 0 0 0 - - -, f 5; #X floatatom 1245 451 5 0 0 0 - - -, f 5; #X floatatom 1280 451 5 0 0 0 - - -, f 5; #X floatatom 1315 451 5 0 0 0 - - -, f 5; #X floatatom 1350 451 5 0 0 0 - - -, f 5; #X floatatom 1385 451 5 0 0 0 - - -, f 5; #X floatatom 1420 451 5 0 0 0 - - -, f 5; #X floatatom 1455 451 5 0 0 0 - - -, f 5; #X floatatom 1490 451 5 0 0 0 - - -, f 5; #X floatatom 1525 451 5 0 0 0 - - -, f 5; #X floatatom 1560 451 5 0 0 0 - - -, f 5; #X floatatom 1595 451 5 0 0 0 - - -, f 5; #X floatatom 1630 451 5 0 0 0 - - -, f 5; #X floatatom 1665 451 5 0 0 0 - - -, f 5; #X floatatom 1700 451 5 0 0 0 - - -, f 5; #X floatatom 1735 451 5 0 0 0 - - -, f 5; #X floatatom 1770 451 5 0 0 0 - - -, f 5; #X floatatom 1805 451 5 0 0 0 - - -, f 5; #X floatatom 1840 451 5 0 0 0 - - -, f 5; #X floatatom 510 487 5 0 0 0 - - -, f 5; #X floatatom 545 487 5 0 0 0 - - -, f 5; #X floatatom 580 487 5 0 0 0 - - -, f 5; #X floatatom 615 487 5 0 0 0 - - -, f 5; #X floatatom 650 487 5 0 0 0 - - -, f 5; #X floatatom 685 487 5 0 0 0 - - -, f 5; #X floatatom 720 487 5 0 0 0 - - -, f 5; #X floatatom 755 487 5 0 0 0 - - -, f 5; #X floatatom 790 487 5 0 0 0 - - -, f 5; #X floatatom 825 487 5 0 0 0 - - -, f 5; #X floatatom 860 487 5 0 0 0 - - -, f 5; #X floatatom 895 487 5 0 0 0 - - -, f 5; #X floatatom 930 487 5 0 0 0 - - -, f 5; #X floatatom 965 487 5 0 0 0 - - -, f 5; #X floatatom 1000 487 5 0 0 0 - - -, f 5; #X floatatom 1035 487 5 0 0 0 - - -, f 5; #X floatatom 1070 487 5 0 0 0 - - -, f 5; #X floatatom 1105 487 5 0 0 0 - - -, f 5; #X obj 510 469 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 216; #X floatatom 1140 487 5 0 0 0 - - -, f 5; #X floatatom 1175 487 5 0 0 0 - - -, f 5; #X floatatom 1210 487 5 0 0 0 - - -, f 5; #X floatatom 1245 487 5 0 0 0 - - -, f 5; #X floatatom 1280 487 5 0 0 0 - - -, f 5; #X floatatom 1315 487 5 0 0 0 - - -, f 5; #X floatatom 1350 487 5 0 0 0 - - -, f 5; #X floatatom 1385 487 5 0 0 0 - - -, f 5; #X floatatom 1420 487 5 0 0 0 - - -, f 5; #X floatatom 1455 487 5 0 0 0 - - -, f 5; #X floatatom 1490 487 5 0 0 0 - - -, f 5; #X floatatom 1525 487 5 0 0 0 - - -, f 5; #X floatatom 1560 487 5 0 0 0 - - -, f 5; #X floatatom 1595 487 5 0 0 0 - - -, f 5; #X floatatom 1630 487 5 0 0 0 - - -, f 5; #X floatatom 1665 487 5 0 0 0 - - -, f 5; #X floatatom 1700 487 5 0 0 0 - - -, f 5; #X floatatom 1735 487 5 0 0 0 - - -, f 5; #X floatatom 1770 487 5 0 0 0 - - -, f 5; #X floatatom 1805 487 5 0 0 0 - - -, f 5; #X obj 557 67 route del damp theta phi, f 34; #X floatatom 707 114 5 0 0 0 - - -, f 5; #X floatatom 742 114 5 0 0 0 - - -, f 5; #X floatatom 777 114 5 0 0 0 - - -, f 5; #X floatatom 812 114 5 0 0 0 - - -, f 5; #X floatatom 847 114 5 0 0 0 - - -, f 5; #X floatatom 882 114 5 0 0 0 - - -, f 5; #X floatatom 917 114 5 0 0 0 - - -, f 5; #X floatatom 952 114 5 0 0 0 - - -, f 5; #X floatatom 987 114 5 0 0 0 - - -, f 5; #X floatatom 1022 114 5 0 0 0 - - -, f 5; #X floatatom 1057 114 5 0 0 0 - - -, f 5; #X floatatom 1092 114 5 0 0 0 - - -, f 5; #X floatatom 1127 114 5 0 0 0 - - -, f 5; #X floatatom 1162 114 5 0 0 0 - - -, f 5; #X floatatom 1197 114 5 0 0 0 - - -, f 5; #X floatatom 1232 114 5 0 0 0 - - -, f 5; #X floatatom 1267 114 5 0 0 0 - - -, f 5; #X floatatom 1302 114 5 0 0 0 - - -, f 5; #X floatatom 1337 114 5 0 0 0 - - -, f 5; #X floatatom 1372 114 5 0 0 0 - - -, f 5; #X floatatom 1407 114 5 0 0 0 - - -, f 5; #X floatatom 1442 114 5 0 0 0 - - -, f 5; #X floatatom 1477 114 5 0 0 0 - - -, f 5; #X floatatom 1512 114 5 0 0 0 - - -, f 5; #X floatatom 1547 114 5 0 0 0 - - -, f 5; #X floatatom 1582 114 5 0 0 0 - - -, f 5; #X floatatom 1617 114 5 0 0 0 - - -, f 5; #X floatatom 1652 114 5 0 0 0 - - -, f 5; #X floatatom 1687 114 5 0 0 0 - - -, f 5; #X floatatom 1722 114 5 0 0 0 - - -, f 5; #X floatatom 1757 114 5 0 0 0 - - -, f 5; #X floatatom 1792 114 5 0 0 0 - - -, f 5; #X floatatom 1827 114 5 0 0 0 - - -, f 5; #X obj 707 86 list split 33; #X obj 707 96 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X floatatom 739 134 5 0 0 0 - - -, f 5; #X floatatom 774 134 5 0 0 0 - - -, f 5; #X floatatom 809 134 5 0 0 0 - - -, f 5; #X floatatom 844 134 5 0 0 0 - - -, f 5; #X floatatom 879 134 5 0 0 0 - - -, f 5; #X floatatom 914 134 5 0 0 0 - - -, f 5; #X floatatom 949 134 5 0 0 0 - - -, f 5; #X floatatom 984 134 5 0 0 0 - - -, f 5; #X floatatom 1019 134 5 0 0 0 - - -, f 5; #X floatatom 1054 134 5 0 0 0 - - -, f 5; #X floatatom 1089 134 5 0 0 0 - - -, f 5; #X floatatom 1124 134 5 0 0 0 - - -, f 5; #X floatatom 1159 134 5 0 0 0 - - -, f 5; #X floatatom 1194 134 5 0 0 0 - - -, f 5; #X floatatom 1229 134 5 0 0 0 - - -, f 5; #X floatatom 1264 134 5 0 0 0 - - -, f 5; #X floatatom 1299 134 5 0 0 0 - - -, f 5; #X floatatom 1334 134 5 0 0 0 - - -, f 5; #X floatatom 1369 134 5 0 0 0 - - -, f 5; #X floatatom 1404 134 5 0 0 0 - - -, f 5; #X floatatom 1439 134 5 0 0 0 - - -, f 5; #X floatatom 1474 134 5 0 0 0 - - -, f 5; #X floatatom 1509 134 5 0 0 0 - - -, f 5; #X floatatom 1544 134 5 0 0 0 - - -, f 5; #X floatatom 1579 134 5 0 0 0 - - -, f 5; #X floatatom 1614 134 5 0 0 0 - - -, f 5; #X floatatom 1649 134 5 0 0 0 - - -, f 5; #X floatatom 1684 134 5 0 0 0 - - -, f 5; #X floatatom 1719 134 5 0 0 0 - - -, f 5; #X floatatom 1754 134 5 0 0 0 - - -, f 5; #X floatatom 1789 134 5 0 0 0 - - -, f 5; #X floatatom 1824 134 5 0 0 0 - - -, f 5; #X floatatom 1859 134 5 0 0 0 - - -, f 5; #X obj 739 96 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X text 1888 114 degree 1..33; #X text 1900 134 degree 34..66; #X floatatom 657 174 5 0 0 0 - - -, f 5; #X floatatom 692 174 5 0 0 0 - - -, f 5; #X floatatom 727 174 5 0 0 0 - - -, f 5; #X floatatom 762 174 5 0 0 0 - - -, f 5; #X floatatom 797 174 5 0 0 0 - - -, f 5; #X floatatom 832 174 5 0 0 0 - - -, f 5; #X floatatom 867 174 5 0 0 0 - - -, f 5; #X floatatom 902 174 5 0 0 0 - - -, f 5; #X floatatom 937 174 5 0 0 0 - - -, f 5; #X floatatom 972 174 5 0 0 0 - - -, f 5; #X floatatom 1007 174 5 0 0 0 - - -, f 5; #X floatatom 1042 174 5 0 0 0 - - -, f 5; #X floatatom 1077 174 5 0 0 0 - - -, f 5; #X floatatom 1112 174 5 0 0 0 - - -, f 5; #X floatatom 1147 174 5 0 0 0 - - -, f 5; #X floatatom 1182 174 5 0 0 0 - - -, f 5; #X floatatom 1217 174 5 0 0 0 - - -, f 5; #X floatatom 1252 174 5 0 0 0 - - -, f 5; #X floatatom 1287 174 5 0 0 0 - - -, f 5; #X floatatom 1322 174 5 0 0 0 - - -, f 5; #X floatatom 1357 174 5 0 0 0 - - -, f 5; #X floatatom 1392 174 5 0 0 0 - - -, f 5; #X floatatom 1427 174 5 0 0 0 - - -, f 5; #X floatatom 1462 174 5 0 0 0 - - -, f 5; #X floatatom 1497 174 5 0 0 0 - - -, f 5; #X floatatom 1532 174 5 0 0 0 - - -, f 5; #X floatatom 1567 174 5 0 0 0 - - -, f 5; #X floatatom 1602 174 5 0 0 0 - - -, f 5; #X floatatom 1637 174 5 0 0 0 - - -, f 5; #X floatatom 1672 174 5 0 0 0 - - -, f 5; #X floatatom 1707 174 5 0 0 0 - - -, f 5; #X floatatom 1742 174 5 0 0 0 - - -, f 5; #X floatatom 1777 174 5 0 0 0 - - -, f 5; #X obj 657 146 list split 33; #X obj 657 156 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X floatatom 689 194 5 0 0 0 - - -, f 5; #X floatatom 724 194 5 0 0 0 - - -, f 5; #X floatatom 759 194 5 0 0 0 - - -, f 5; #X floatatom 794 194 5 0 0 0 - - -, f 5; #X floatatom 829 194 5 0 0 0 - - -, f 5; #X floatatom 864 194 5 0 0 0 - - -, f 5; #X floatatom 899 194 5 0 0 0 - - -, f 5; #X floatatom 934 194 5 0 0 0 - - -, f 5; #X floatatom 969 194 5 0 0 0 - - -, f 5; #X floatatom 1004 194 5 0 0 0 - - -, f 5; #X floatatom 1039 194 5 0 0 0 - - -, f 5; #X floatatom 1074 194 5 0 0 0 - - -, f 5; #X floatatom 1109 194 5 0 0 0 - - -, f 5; #X floatatom 1144 194 5 0 0 0 - - -, f 5; #X floatatom 1179 194 5 0 0 0 - - -, f 5; #X floatatom 1214 194 5 0 0 0 - - -, f 5; #X floatatom 1249 194 5 0 0 0 - - -, f 5; #X floatatom 1284 194 5 0 0 0 - - -, f 5; #X floatatom 1319 194 5 0 0 0 - - -, f 5; #X floatatom 1354 194 5 0 0 0 - - -, f 5; #X floatatom 1389 194 5 0 0 0 - - -, f 5; #X floatatom 1424 194 5 0 0 0 - - -, f 5; #X floatatom 1459 194 5 0 0 0 - - -, f 5; #X floatatom 1494 194 5 0 0 0 - - -, f 5; #X floatatom 1529 194 5 0 0 0 - - -, f 5; #X floatatom 1564 194 5 0 0 0 - - -, f 5; #X floatatom 1599 194 5 0 0 0 - - -, f 5; #X floatatom 1634 194 5 0 0 0 - - -, f 5; #X floatatom 1669 194 5 0 0 0 - - -, f 5; #X floatatom 1704 194 5 0 0 0 - - -, f 5; #X floatatom 1739 194 5 0 0 0 - - -, f 5; #X floatatom 1774 194 5 0 0 0 - - -, f 5; #X floatatom 1809 194 5 0 0 0 - - -, f 5; #X obj 689 156 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X text 1838 174 degree 1..33; #X text 1850 194 degree 34..66; #X floatatom 607 234 5 0 0 0 - - -, f 5; #X floatatom 642 234 5 0 0 0 - - -, f 5; #X floatatom 677 234 5 0 0 0 - - -, f 5; #X floatatom 712 234 5 0 0 0 - - -, f 5; #X floatatom 747 234 5 0 0 0 - - -, f 5; #X floatatom 782 234 5 0 0 0 - - -, f 5; #X floatatom 817 234 5 0 0 0 - - -, f 5; #X floatatom 852 234 5 0 0 0 - - -, f 5; #X floatatom 887 234 5 0 0 0 - - -, f 5; #X floatatom 922 234 5 0 0 0 - - -, f 5; #X floatatom 957 234 5 0 0 0 - - -, f 5; #X floatatom 992 234 5 0 0 0 - - -, f 5; #X floatatom 1027 234 5 0 0 0 - - -, f 5; #X floatatom 1062 234 5 0 0 0 - - -, f 5; #X floatatom 1097 234 5 0 0 0 - - -, f 5; #X floatatom 1132 234 5 0 0 0 - - -, f 5; #X floatatom 1167 234 5 0 0 0 - - -, f 5; #X floatatom 1202 234 5 0 0 0 - - -, f 5; #X floatatom 1237 234 5 0 0 0 - - -, f 5; #X floatatom 1272 234 5 0 0 0 - - -, f 5; #X floatatom 1307 234 5 0 0 0 - - -, f 5; #X floatatom 1342 234 5 0 0 0 - - -, f 5; #X floatatom 1377 234 5 0 0 0 - - -, f 5; #X floatatom 1412 234 5 0 0 0 - - -, f 5; #X floatatom 1447 234 5 0 0 0 - - -, f 5; #X floatatom 1482 234 5 0 0 0 - - -, f 5; #X floatatom 1517 234 5 0 0 0 - - -, f 5; #X floatatom 1552 234 5 0 0 0 - - -, f 5; #X floatatom 1587 234 5 0 0 0 - - -, f 5; #X floatatom 1622 234 5 0 0 0 - - -, f 5; #X floatatom 1657 234 5 0 0 0 - - -, f 5; #X floatatom 1692 234 5 0 0 0 - - -, f 5; #X floatatom 1727 234 5 0 0 0 - - -, f 5; #X obj 607 206 list split 33; #X obj 607 216 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X floatatom 640 254 5 0 0 0 - - -, f 5; #X floatatom 675 254 5 0 0 0 - - -, f 5; #X floatatom 710 254 5 0 0 0 - - -, f 5; #X floatatom 745 254 5 0 0 0 - - -, f 5; #X floatatom 780 254 5 0 0 0 - - -, f 5; #X floatatom 815 254 5 0 0 0 - - -, f 5; #X floatatom 850 254 5 0 0 0 - - -, f 5; #X floatatom 885 254 5 0 0 0 - - -, f 5; #X floatatom 920 254 5 0 0 0 - - -, f 5; #X floatatom 955 254 5 0 0 0 - - -, f 5; #X floatatom 990 254 5 0 0 0 - - -, f 5; #X floatatom 1025 254 5 0 0 0 - - -, f 5; #X floatatom 1060 254 5 0 0 0 - - -, f 5; #X floatatom 1095 254 5 0 0 0 - - -, f 5; #X floatatom 1130 254 5 0 0 0 - - -, f 5; #X floatatom 1165 254 5 0 0 0 - - -, f 5; #X floatatom 1200 254 5 0 0 0 - - -, f 5; #X floatatom 1235 254 5 0 0 0 - - -, f 5; #X floatatom 1270 254 5 0 0 0 - - -, f 5; #X floatatom 1305 254 5 0 0 0 - - -, f 5; #X floatatom 1340 254 5 0 0 0 - - -, f 5; #X floatatom 1375 254 5 0 0 0 - - -, f 5; #X floatatom 1410 254 5 0 0 0 - - -, f 5; #X floatatom 1445 254 5 0 0 0 - - -, f 5; #X floatatom 1480 254 5 0 0 0 - - -, f 5; #X floatatom 1515 254 5 0 0 0 - - -, f 5; #X floatatom 1550 254 5 0 0 0 - - -, f 5; #X floatatom 1585 254 5 0 0 0 - - -, f 5; #X floatatom 1620 254 5 0 0 0 - - -, f 5; #X floatatom 1655 254 5 0 0 0 - - -, f 5; #X floatatom 1690 254 5 0 0 0 - - -, f 5; #X floatatom 1725 254 5 0 0 0 - - -, f 5; #X floatatom 1760 254 5 0 0 0 - - -, f 5; #X obj 640 216 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X floatatom 557 294 5 0 0 0 - - -, f 5; #X floatatom 592 294 5 0 0 0 - - -, f 5; #X floatatom 627 294 5 0 0 0 - - -, f 5; #X floatatom 662 294 5 0 0 0 - - -, f 5; #X floatatom 697 294 5 0 0 0 - - -, f 5; #X floatatom 732 294 5 0 0 0 - - -, f 5; #X floatatom 767 294 5 0 0 0 - - -, f 5; #X floatatom 802 294 5 0 0 0 - - -, f 5; #X floatatom 837 294 5 0 0 0 - - -, f 5; #X floatatom 872 294 5 0 0 0 - - -, f 5; #X floatatom 907 294 5 0 0 0 - - -, f 5; #X floatatom 942 294 5 0 0 0 - - -, f 5; #X floatatom 977 294 5 0 0 0 - - -, f 5; #X floatatom 1012 294 5 0 0 0 - - -, f 5; #X floatatom 1047 294 5 0 0 0 - - -, f 5; #X floatatom 1082 294 5 0 0 0 - - -, f 5; #X floatatom 1117 294 5 0 0 0 - - -, f 5; #X floatatom 1152 294 5 0 0 0 - - -, f 5; #X floatatom 1187 294 5 0 0 0 - - -, f 5; #X floatatom 1222 294 5 0 0 0 - - -, f 5; #X floatatom 1257 294 5 0 0 0 - - -, f 5; #X floatatom 1292 294 5 0 0 0 - - -, f 5; #X floatatom 1327 294 5 0 0 0 - - -, f 5; #X floatatom 1362 294 5 0 0 0 - - -, f 5; #X floatatom 1397 294 5 0 0 0 - - -, f 5; #X floatatom 1432 294 5 0 0 0 - - -, f 5; #X floatatom 1467 294 5 0 0 0 - - -, f 5; #X floatatom 1502 294 5 0 0 0 - - -, f 5; #X floatatom 1537 294 5 0 0 0 - - -, f 5; #X floatatom 1572 294 5 0 0 0 - - -, f 5; #X floatatom 1607 294 5 0 0 0 - - -, f 5; #X floatatom 1642 294 5 0 0 0 - - -, f 5; #X floatatom 1677 294 5 0 0 0 - - -, f 5; #X obj 557 266 list split 33; #X obj 557 276 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X floatatom 590 314 5 0 0 0 - - -, f 5; #X floatatom 625 314 5 0 0 0 - - -, f 5; #X floatatom 660 314 5 0 0 0 - - -, f 5; #X floatatom 695 314 5 0 0 0 - - -, f 5; #X floatatom 730 314 5 0 0 0 - - -, f 5; #X floatatom 765 314 5 0 0 0 - - -, f 5; #X floatatom 800 314 5 0 0 0 - - -, f 5; #X floatatom 835 314 5 0 0 0 - - -, f 5; #X floatatom 870 314 5 0 0 0 - - -, f 5; #X floatatom 905 314 5 0 0 0 - - -, f 5; #X floatatom 940 314 5 0 0 0 - - -, f 5; #X floatatom 975 314 5 0 0 0 - - -, f 5; #X floatatom 1010 314 5 0 0 0 - - -, f 5; #X floatatom 1045 314 5 0 0 0 - - -, f 5; #X floatatom 1080 314 5 0 0 0 - - -, f 5; #X floatatom 1115 314 5 0 0 0 - - -, f 5; #X floatatom 1150 314 5 0 0 0 - - -, f 5; #X floatatom 1185 314 5 0 0 0 - - -, f 5; #X floatatom 1220 314 5 0 0 0 - - -, f 5; #X floatatom 1255 314 5 0 0 0 - - -, f 5; #X floatatom 1290 314 5 0 0 0 - - -, f 5; #X floatatom 1325 314 5 0 0 0 - - -, f 5; #X floatatom 1360 314 5 0 0 0 - - -, f 5; #X floatatom 1395 314 5 0 0 0 - - -, f 5; #X floatatom 1430 314 5 0 0 0 - - -, f 5; #X floatatom 1465 314 5 0 0 0 - - -, f 5; #X floatatom 1500 314 5 0 0 0 - - -, f 5; #X floatatom 1535 314 5 0 0 0 - - -, f 5; #X floatatom 1570 314 5 0 0 0 - - -, f 5; #X floatatom 1605 314 5 0 0 0 - - -, f 5; #X floatatom 1640 314 5 0 0 0 - - -, f 5; #X floatatom 1675 314 5 0 0 0 - - -, f 5; #X floatatom 1710 314 5 0 0 0 - - -, f 5; #X obj 590 276 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0, f 187; #X text 1788 234 linear rms 1..33; #X text 1801 254 linear rms 34..66; #X text 1738 294 ms 1..33; #X text 1751 314 ms 34..66; #X obj 193 367 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X connect 0 0 203 0; #X connect 1 0 213 0; #X connect 1 1 213 1; #X connect 2 0 213 0; #X connect 3 0 1 0; #X connect 4 0 214 0; #X connect 4 1 214 1; #X connect 5 0 214 0; #X connect 6 0 4 0; #X connect 9 0 194 0; #X connect 194 0 217 0; #X connect 194 1 218 0; #X connect 194 2 253 0; #X connect 194 3 334 0; #X connect 194 4 492 0; #X connect 203 0 7 0; #X connect 203 0 8 0; #X connect 203 0 777 0; #X connect 205 0 203 0; #X connect 206 0 203 0; #X connect 207 0 203 0; #X connect 208 0 203 0; #X connect 211 0 213 0; #X connect 211 1 213 2; #X connect 212 0 211 0; #X connect 213 0 206 0; #X connect 214 0 207 0; #X connect 215 0 214 0; #X connect 215 1 4 0; #X connect 216 0 215 0; #X connect 217 0 10 0; #X connect 217 1 11 0; #X connect 217 2 12 0; #X connect 217 3 219 0; #X connect 218 0 247 0; #X connect 218 1 240 0; #X connect 218 2 233 0; #X connect 218 3 226 0; #X connect 226 0 221 0; #X connect 226 1 222 0; #X connect 226 2 223 0; #X connect 226 3 224 0; #X connect 226 4 227 0; #X connect 226 5 228 0; #X connect 233 0 229 0; #X connect 233 1 230 0; #X connect 233 2 231 0; #X connect 233 3 232 0; #X connect 233 4 234 0; #X connect 233 5 235 0; #X connect 240 0 236 0; #X connect 240 1 237 0; #X connect 240 2 238 0; #X connect 240 3 239 0; #X connect 240 4 241 0; #X connect 240 5 242 0; #X connect 247 0 243 0; #X connect 247 1 244 0; #X connect 247 2 245 0; #X connect 247 3 246 0; #X connect 247 4 248 0; #X connect 247 5 249 0; #X connect 253 0 318 0; #X connect 253 1 299 0; #X connect 253 2 280 0; #X connect 253 3 261 0; #X connect 261 0 254 0; #X connect 261 1 255 0; #X connect 261 2 256 0; #X connect 261 3 257 0; #X connect 261 4 259 0; #X connect 261 5 260 0; #X connect 261 6 262 0; #X connect 261 7 263 0; #X connect 261 8 264 0; #X connect 261 9 265 0; #X connect 261 10 266 0; #X connect 261 11 267 0; #X connect 261 12 268 0; #X connect 261 13 269 0; #X connect 261 14 270 0; #X connect 261 15 271 0; #X connect 261 16 272 0; #X connect 261 17 273 0; #X connect 280 0 274 0; #X connect 280 1 275 0; #X connect 280 2 276 0; #X connect 280 3 277 0; #X connect 280 4 278 0; #X connect 280 5 279 0; #X connect 280 6 281 0; #X connect 280 7 282 0; #X connect 280 8 283 0; #X connect 280 9 284 0; #X connect 280 10 285 0; #X connect 280 11 286 0; #X connect 280 12 287 0; #X connect 280 13 288 0; #X connect 280 14 289 0; #X connect 280 15 290 0; #X connect 280 16 291 0; #X connect 280 17 292 0; #X connect 299 0 293 0; #X connect 299 1 294 0; #X connect 299 2 295 0; #X connect 299 3 296 0; #X connect 299 4 297 0; #X connect 299 5 298 0; #X connect 299 6 300 0; #X connect 299 7 301 0; #X connect 299 8 302 0; #X connect 299 9 303 0; #X connect 299 10 304 0; #X connect 299 11 305 0; #X connect 299 12 306 0; #X connect 299 13 307 0; #X connect 299 14 308 0; #X connect 299 15 309 0; #X connect 299 16 310 0; #X connect 299 17 311 0; #X connect 318 0 312 0; #X connect 318 1 313 0; #X connect 318 2 314 0; #X connect 318 3 315 0; #X connect 318 4 316 0; #X connect 318 5 317 0; #X connect 318 6 319 0; #X connect 318 7 320 0; #X connect 318 8 321 0; #X connect 318 9 322 0; #X connect 318 10 323 0; #X connect 318 11 324 0; #X connect 318 12 325 0; #X connect 318 13 326 0; #X connect 318 14 327 0; #X connect 318 15 328 0; #X connect 318 16 329 0; #X connect 318 17 330 0; #X connect 334 0 471 0; #X connect 334 1 432 0; #X connect 334 2 393 0; #X connect 334 3 354 0; #X connect 354 0 335 0; #X connect 354 1 336 0; #X connect 354 2 337 0; #X connect 354 3 338 0; #X connect 354 4 340 0; #X connect 354 5 341 0; #X connect 354 6 342 0; #X connect 354 7 343 0; #X connect 354 8 344 0; #X connect 354 9 345 0; #X connect 354 10 346 0; #X connect 354 11 347 0; #X connect 354 12 348 0; #X connect 354 13 349 0; #X connect 354 14 350 0; #X connect 354 15 351 0; #X connect 354 16 352 0; #X connect 354 17 353 0; #X connect 354 18 355 0; #X connect 354 19 356 0; #X connect 354 20 357 0; #X connect 354 21 358 0; #X connect 354 22 359 0; #X connect 354 23 360 0; #X connect 354 24 361 0; #X connect 354 25 362 0; #X connect 354 26 363 0; #X connect 354 27 364 0; #X connect 354 28 365 0; #X connect 354 29 366 0; #X connect 354 30 367 0; #X connect 354 31 368 0; #X connect 354 32 369 0; #X connect 354 33 370 0; #X connect 354 34 371 0; #X connect 354 35 372 0; #X connect 354 36 373 0; #X connect 354 37 374 0; #X connect 393 0 375 0; #X connect 393 1 376 0; #X connect 393 2 377 0; #X connect 393 3 378 0; #X connect 393 4 379 0; #X connect 393 5 380 0; #X connect 393 6 381 0; #X connect 393 7 382 0; #X connect 393 8 383 0; #X connect 393 9 384 0; #X connect 393 10 385 0; #X connect 393 11 386 0; #X connect 393 12 387 0; #X connect 393 13 388 0; #X connect 393 14 389 0; #X connect 393 15 390 0; #X connect 393 16 391 0; #X connect 393 17 392 0; #X connect 393 18 394 0; #X connect 393 19 395 0; #X connect 393 20 396 0; #X connect 393 21 397 0; #X connect 393 22 398 0; #X connect 393 23 399 0; #X connect 393 24 400 0; #X connect 393 25 401 0; #X connect 393 26 402 0; #X connect 393 27 403 0; #X connect 393 28 404 0; #X connect 393 29 405 0; #X connect 393 30 406 0; #X connect 393 31 407 0; #X connect 393 32 408 0; #X connect 393 33 409 0; #X connect 393 34 410 0; #X connect 393 35 411 0; #X connect 393 36 412 0; #X connect 393 37 413 0; #X connect 432 0 414 0; #X connect 432 1 415 0; #X connect 432 2 416 0; #X connect 432 3 417 0; #X connect 432 4 418 0; #X connect 432 5 419 0; #X connect 432 6 420 0; #X connect 432 7 421 0; #X connect 432 8 422 0; #X connect 432 9 423 0; #X connect 432 10 424 0; #X connect 432 11 425 0; #X connect 432 12 426 0; #X connect 432 13 427 0; #X connect 432 14 428 0; #X connect 432 15 429 0; #X connect 432 16 430 0; #X connect 432 17 431 0; #X connect 432 18 433 0; #X connect 432 19 434 0; #X connect 432 20 435 0; #X connect 432 21 436 0; #X connect 432 22 437 0; #X connect 432 23 438 0; #X connect 432 24 439 0; #X connect 432 25 440 0; #X connect 432 26 441 0; #X connect 432 27 442 0; #X connect 432 28 443 0; #X connect 432 29 444 0; #X connect 432 30 445 0; #X connect 432 31 446 0; #X connect 432 32 447 0; #X connect 432 33 448 0; #X connect 432 34 449 0; #X connect 432 35 450 0; #X connect 432 36 451 0; #X connect 432 37 452 0; #X connect 471 0 453 0; #X connect 471 1 454 0; #X connect 471 2 455 0; #X connect 471 3 456 0; #X connect 471 4 457 0; #X connect 471 5 458 0; #X connect 471 6 459 0; #X connect 471 7 460 0; #X connect 471 8 461 0; #X connect 471 9 462 0; #X connect 471 10 463 0; #X connect 471 11 464 0; #X connect 471 12 465 0; #X connect 471 13 466 0; #X connect 471 14 467 0; #X connect 471 15 468 0; #X connect 471 16 469 0; #X connect 471 17 470 0; #X connect 471 18 472 0; #X connect 471 19 473 0; #X connect 471 20 474 0; #X connect 471 21 475 0; #X connect 471 22 476 0; #X connect 471 23 477 0; #X connect 471 24 478 0; #X connect 471 25 479 0; #X connect 471 26 480 0; #X connect 471 27 481 0; #X connect 471 28 482 0; #X connect 471 29 483 0; #X connect 471 30 484 0; #X connect 471 31 485 0; #X connect 471 32 486 0; #X connect 471 33 487 0; #X connect 471 34 488 0; #X connect 471 35 489 0; #X connect 471 36 490 0; #X connect 471 37 491 0; #X connect 492 0 737 0; #X connect 492 1 668 0; #X connect 492 2 597 0; #X connect 492 3 526 0; #X connect 526 0 527 0; #X connect 526 1 561 0; #X connect 527 0 493 0; #X connect 527 1 494 0; #X connect 527 2 495 0; #X connect 527 3 496 0; #X connect 527 4 497 0; #X connect 527 5 498 0; #X connect 527 6 499 0; #X connect 527 7 500 0; #X connect 527 8 501 0; #X connect 527 9 502 0; #X connect 527 10 503 0; #X connect 527 11 504 0; #X connect 527 12 505 0; #X connect 527 13 506 0; #X connect 527 14 507 0; #X connect 527 15 508 0; #X connect 527 16 509 0; #X connect 527 17 510 0; #X connect 527 18 511 0; #X connect 527 19 512 0; #X connect 527 20 513 0; #X connect 527 21 514 0; #X connect 527 22 515 0; #X connect 527 23 516 0; #X connect 527 24 517 0; #X connect 527 25 518 0; #X connect 527 26 519 0; #X connect 527 27 520 0; #X connect 527 28 521 0; #X connect 527 29 522 0; #X connect 527 30 523 0; #X connect 527 31 524 0; #X connect 527 32 525 0; #X connect 561 0 528 0; #X connect 561 1 529 0; #X connect 561 2 530 0; #X connect 561 3 531 0; #X connect 561 4 532 0; #X connect 561 5 533 0; #X connect 561 6 534 0; #X connect 561 7 535 0; #X connect 561 8 536 0; #X connect 561 9 537 0; #X connect 561 10 538 0; #X connect 561 11 539 0; #X connect 561 12 540 0; #X connect 561 13 541 0; #X connect 561 14 542 0; #X connect 561 15 543 0; #X connect 561 16 544 0; #X connect 561 17 545 0; #X connect 561 18 546 0; #X connect 561 19 547 0; #X connect 561 20 548 0; #X connect 561 21 549 0; #X connect 561 22 550 0; #X connect 561 23 551 0; #X connect 561 24 552 0; #X connect 561 25 553 0; #X connect 561 26 554 0; #X connect 561 27 555 0; #X connect 561 28 556 0; #X connect 561 29 557 0; #X connect 561 30 558 0; #X connect 561 31 559 0; #X connect 561 32 560 0; #X connect 597 0 598 0; #X connect 597 1 632 0; #X connect 598 0 564 0; #X connect 598 1 565 0; #X connect 598 2 566 0; #X connect 598 3 567 0; #X connect 598 4 568 0; #X connect 598 5 569 0; #X connect 598 6 570 0; #X connect 598 7 571 0; #X connect 598 8 572 0; #X connect 598 9 573 0; #X connect 598 10 574 0; #X connect 598 11 575 0; #X connect 598 12 576 0; #X connect 598 13 577 0; #X connect 598 14 578 0; #X connect 598 15 579 0; #X connect 598 16 580 0; #X connect 598 17 581 0; #X connect 598 18 582 0; #X connect 598 19 583 0; #X connect 598 20 584 0; #X connect 598 21 585 0; #X connect 598 22 586 0; #X connect 598 23 587 0; #X connect 598 24 588 0; #X connect 598 25 589 0; #X connect 598 26 590 0; #X connect 598 27 591 0; #X connect 598 28 592 0; #X connect 598 29 593 0; #X connect 598 30 594 0; #X connect 598 31 595 0; #X connect 598 32 596 0; #X connect 632 0 599 0; #X connect 632 1 600 0; #X connect 632 2 601 0; #X connect 632 3 602 0; #X connect 632 4 603 0; #X connect 632 5 604 0; #X connect 632 6 605 0; #X connect 632 7 606 0; #X connect 632 8 607 0; #X connect 632 9 608 0; #X connect 632 10 609 0; #X connect 632 11 610 0; #X connect 632 12 611 0; #X connect 632 13 612 0; #X connect 632 14 613 0; #X connect 632 15 614 0; #X connect 632 16 615 0; #X connect 632 17 616 0; #X connect 632 18 617 0; #X connect 632 19 618 0; #X connect 632 20 619 0; #X connect 632 21 620 0; #X connect 632 22 621 0; #X connect 632 23 622 0; #X connect 632 24 623 0; #X connect 632 25 624 0; #X connect 632 26 625 0; #X connect 632 27 626 0; #X connect 632 28 627 0; #X connect 632 29 628 0; #X connect 632 30 629 0; #X connect 632 31 630 0; #X connect 632 32 631 0; #X connect 668 0 669 0; #X connect 668 1 703 0; #X connect 669 0 635 0; #X connect 669 1 636 0; #X connect 669 2 637 0; #X connect 669 3 638 0; #X connect 669 4 639 0; #X connect 669 5 640 0; #X connect 669 6 641 0; #X connect 669 7 642 0; #X connect 669 8 643 0; #X connect 669 9 644 0; #X connect 669 10 645 0; #X connect 669 11 646 0; #X connect 669 12 647 0; #X connect 669 13 648 0; #X connect 669 14 649 0; #X connect 669 15 650 0; #X connect 669 16 651 0; #X connect 669 17 652 0; #X connect 669 18 653 0; #X connect 669 19 654 0; #X connect 669 20 655 0; #X connect 669 21 656 0; #X connect 669 22 657 0; #X connect 669 23 658 0; #X connect 669 24 659 0; #X connect 669 25 660 0; #X connect 669 26 661 0; #X connect 669 27 662 0; #X connect 669 28 663 0; #X connect 669 29 664 0; #X connect 669 30 665 0; #X connect 669 31 666 0; #X connect 669 32 667 0; #X connect 703 0 670 0; #X connect 703 1 671 0; #X connect 703 2 672 0; #X connect 703 3 673 0; #X connect 703 4 674 0; #X connect 703 5 675 0; #X connect 703 6 676 0; #X connect 703 7 677 0; #X connect 703 8 678 0; #X connect 703 9 679 0; #X connect 703 10 680 0; #X connect 703 11 681 0; #X connect 703 12 682 0; #X connect 703 13 683 0; #X connect 703 14 684 0; #X connect 703 15 685 0; #X connect 703 16 686 0; #X connect 703 17 687 0; #X connect 703 18 688 0; #X connect 703 19 689 0; #X connect 703 20 690 0; #X connect 703 21 691 0; #X connect 703 22 692 0; #X connect 703 23 693 0; #X connect 703 24 694 0; #X connect 703 25 695 0; #X connect 703 26 696 0; #X connect 703 27 697 0; #X connect 703 28 698 0; #X connect 703 29 699 0; #X connect 703 30 700 0; #X connect 703 31 701 0; #X connect 703 32 702 0; #X connect 737 0 738 0; #X connect 737 1 772 0; #X connect 738 0 704 0; #X connect 738 1 705 0; #X connect 738 2 706 0; #X connect 738 3 707 0; #X connect 738 4 708 0; #X connect 738 5 709 0; #X connect 738 6 710 0; #X connect 738 7 711 0; #X connect 738 8 712 0; #X connect 738 9 713 0; #X connect 738 10 714 0; #X connect 738 11 715 0; #X connect 738 12 716 0; #X connect 738 13 717 0; #X connect 738 14 718 0; #X connect 738 15 719 0; #X connect 738 16 720 0; #X connect 738 17 721 0; #X connect 738 18 722 0; #X connect 738 19 723 0; #X connect 738 20 724 0; #X connect 738 21 725 0; #X connect 738 22 726 0; #X connect 738 23 727 0; #X connect 738 24 728 0; #X connect 738 25 729 0; #X connect 738 26 730 0; #X connect 738 27 731 0; #X connect 738 28 732 0; #X connect 738 29 733 0; #X connect 738 30 734 0; #X connect 738 31 735 0; #X connect 738 32 736 0; #X connect 772 0 739 0; #X connect 772 1 740 0; #X connect 772 2 741 0; #X connect 772 3 742 0; #X connect 772 4 743 0; #X connect 772 5 744 0; #X connect 772 6 745 0; #X connect 772 7 746 0; #X connect 772 8 747 0; #X connect 772 9 748 0; #X connect 772 10 749 0; #X connect 772 11 750 0; #X connect 772 12 751 0; #X connect 772 13 752 0; #X connect 772 14 753 0; #X connect 772 15 754 0; #X connect 772 16 755 0; #X connect 772 17 756 0; #X connect 772 18 757 0; #X connect 772 19 758 0; #X connect 772 20 759 0; #X connect 772 21 760 0; #X connect 772 22 761 0; #X connect 772 23 762 0; #X connect 772 24 763 0; #X connect 772 25 764 0; #X connect 772 26 765 0; #X connect 772 27 766 0; #X connect 772 28 767 0; #X connect 772 29 768 0; #X connect 772 30 769 0; #X connect 772 31 770 0; #X connect 772 32 771 0; iem_utils-0.0.20240903/iem_spec2/0000700000000000000000000000000014665566711013050 5ustar00iem_utils-0.0.20240903/iem_spec2/CONTENT.txt0000600000000000000000000000306414665566711014730 0ustar00 content of iem_spec2 Release 1.21 from March 2018 -------------------- frequency domain signal stuff ------------------------------- spec2_1p1z_freq~ a 1p1z recursive filter forms the current spectrum, the recursion goes from a lower frequency bin to a higher one (frequency shape filtering of spectrum) spec2_1p1z_time~ a 1p1z recursive filter forms the current spectrum bin by bin isolated to the previous spectrum bin by bin (time shape filtering of spectrum) spec2_abs~ works like |abs~| spec2_add_scalar~, spec2_+s~ works like |+~ 1| spec2_add~, spec2+~ works like |+~| spec2_block_delay~ delays a signal by 1 signal vector blocksize spec2_clip_max~ works like |min~| spec2_clip_min~ works like |max~| spec2_dbtopow~ works like |dbtopow~| spec2_dbtorms~ works like |dbtorms~| spec2_matrix_bundle_stat~ a special matrix multiplication spec2_mul_scalar~, spec2_*s~ works like |*~ 1| spec2_mul~, spec2_*~ works like |*~| spec2_powtodb~ works like |powtodb~| spec2_rmstodb~ works like |rmstodb~| spec2_shift~ works like |lrshift~| spec2_sqrt~ works like |sqrt~| spec2_stretch~ stretches the half spectrum by a scalar factor spec2_sub~, spec2-~ works like |-~| spec2_sum~ accumulates all the frequency bins of the half spectrum and puts it out spec2_tab_conv~ calculates a convolution of 2 spectra spec2_tabreceive_enable~ works like |tabreceive~| with an enable input spec2_tabreceive~ works like |tabreceive~| all spectra will be calculated from index 0 to index blocksize/2, that are blocksize/2 + 1 frequency bins.iem_utils-0.0.20240903/iem_spec2/GnuLGPL.txt0000600000000000000000000006346714665566711015043 0ustar00 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! iem_utils-0.0.20240903/iem_spec2/LICENSE.txt0000600000000000000000000000247314665566711014703 0ustar00This library extends the performance of Miller S. Puckette's realtime-computermusic-environment puredata (pd). iem_spec2 contains 1 external library "iem_spec2.dll" with 23 objects and their help files. iem_tab is published under the Gnu Lesser General Public License that is included (GnuLGPL.txt). Copyright (C) 2000-2018 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details ( GnuLGPL.txt ). (e.g. http://www.gnu.org/copyleft/lesser.html) You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Graz, March 1st 2018 Thomas Musil iem_utils-0.0.20240903/iem_spec2/Makefile0000600000000000000000000000373514665566711014522 0ustar00#!/usr/bin/make -f # Makefile to the 'iem_spec2' library for Pure Data. # Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build # settings and rules (https://github.com/pure-data/pd-lib-builder). lib.name = iem_spec2 ## iemlib.h lives in include/ cflags = -Iinclude # special file that does not provide a class lib.setup.sources = src/$(lib.name).c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) # class.sources = $(filter-out $(lib.setup.sources),$(wildcard src/*.c)) class.sources = \ src/spec2_1p1z_freq~.c \ src/spec2_1p1z_time~.c \ src/spec2_abs~.c \ src/spec2_add_scalar~.c \ src/spec2_add~.c \ src/spec2_block_delay~.c \ src/spec2_clip_max~.c \ src/spec2_clip_min~.c \ src/spec2_dbtopow~.c \ src/spec2_dbtorms~.c \ src/spec2_matrix_bundle_stat~.c \ src/spec2_mul_scalar~.c \ src/spec2_mul~.c \ src/spec2_powtodb~.c \ src/spec2_rmstodb~.c \ src/spec2_shift~.c \ src/spec2_sqrt~.c \ src/spec2_stretch~.c \ src/spec2_sub~.c \ src/spec2_sum~.c \ src/spec2_tab_conv~.c \ src/spec2_tabreceive_enable~.c \ src/spec2_tabreceive~.c \ $(empty) datafiles = \ $(wildcard *.txt) \ $(wildcard *.pdf) \ $(wildcard *.pd) \ $(wildcard *.gif) \ $(wildcard *.bat) \ $(wildcard *.sh) \ $(wildcard *.wav) \ $(empty) #cflags = -DVERSION=$(shell cat VERSION.txt) ## build a multi-object library make-lib-executable=yes ## suppress "unused" warnings #suppress-wunused=yes ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # This Makefile is based on the Makefile from pd-lib-builder written by # Katja Vetter. You can get it from: # https://github.com/pure-data/pd-lib-builder PDLIBBUILDER_DIR=pd-lib-builder/ include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder)) iem_utils-0.0.20240903/iem_spec2/READ_ME.txt0000600000000000000000000000427614665566711014720 0ustar00This library extends the performance of Miller S. Puckette's realtime-computermusic-environment puredata (pd). iem_spec2 contains 1 external library "iem_spec2.dll" with 23 objects and their help files (see CONTENT.txt). The main topic is the efficient manipulation of signal blocks in the frequency domain (between fft~ and ifft~). All objects calculate only blocksize/2 + 1 samples of a signal vector, the 2nd half of the signal vector will be ignored and could have strange values. This objects are very experimental. iem_spec2 is published under the Gnu Lesser General Public License (see LICENSE.txt and GnuLGPL.txt). iem_spec2 (Release 1.21) is written by Thomas Musil from IEM KUG Graz Austria and it is compiled against pd-0.48-1. You have to add the library -lib iem_spec2 (Menue: File: Preferences: Startup...: New...). For Windows "install_path" could be: "C:/Users/xx_ME_xx/AppData/Roaming/Pd" or "C:/Program Files (x86)/Common Files/Pd" or "C:/Users/xx_ME_xx/Documents/Pd/externals" or "C:/Program Files (x86)/pd/extra". For Apple OSX: "install_path" could be: "~/Library/Pd" or "/Library/Pd" or "/Applications/Pd.app/Contents/Resources/extra". For Linux: "install_path" could be: "~/.local/lib/pd/extra" or "~/pd-externals" or "/usr/local/lib/pd-externals" or "/usr/local/lib/pd/extra" or "/usr/lib/pd/extra". Make sure that you get the desired version of iem_spec2 if there are multiple installations on your computer (-verbose). Copyright (C) 2000-2018 Thomas MUSIL [musil_at_iem.at] THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-0.0.20240903/iem_spec2/include/0000700000000000000000000000000014665566711014473 5ustar00iem_utils-0.0.20240903/iem_spec2/include/iem_spec2.h0000600000000000000000000000047314665566711016520 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #ifndef __IEMSPEC2_H__ #define __IEMSPEC2_H__ #define DELLINE_DEF_VEC_SIZE 64 #endif iem_utils-0.0.20240903/iem_spec2/include/iemlib.h0000600000000000000000000001360714665566711016116 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2018 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) #ifdef _WIN32 //t_symbol *iemgui_key_sym=0; #include #else //extern t_symbol *iemgui_key_sym; #include #endif extern int sys_noloadbang; //millers m_pd.h beg /* Microsoft Visual Studio is not C99, it does not provide stdint.h */ #ifdef _MSC_VER typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else # include #endif #if !defined(PD_FLOATSIZE) /* if compiled pd version < 0.47*/ # define PD_FLOATSIZE 32 #endif typedef union { float f; unsigned int ui; }t_iemdenormal_f; typedef union { double f; unsigned int ui[2]; }t_iemdenormal_d; #ifndef _MSC_VER /* Micrsoft compiler can't handle "inline" function/macros */ #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) /* a test for NANs and denormals. Should only be necessary on x86 variants. */ /* on arm, the impact is less noticeable, but...why not? */ static inline int IEM_DENORMAL_F(float f) /* malformed float 32 */ { t_iemdenormal_f pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } static inline int IEM_DENORMAL_D(double f) /* malformed double 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 typedef union { t_float f; unsigned int ui; }t_iemdenormal_t32; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 32 */ { t_iemdenormal_t32 pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } #elif PD_FLOATSIZE == 64 typedef union { t_float f; unsigned int ui[2]; }t_iemdenormal_t64; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif /* PD_FLOATSIZE */ #else /* not INTEL or ARM */ #define IEM_DENORMAL_T(f) 0 #define IEM_DENORMAL_D(f) 0 #endif #else /* _MSC_VER */ #define IEM_DENORMAL_F(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) static int IEM_DENORMAL_D(double f) /* malformed t_float 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 #define IEM_DENORMAL_T(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) #else /* 64 bits... don't know what to do here */ //#define IEM_DENORMAL_T(f) (!(((f) >= 0) || ((f) <= 0))) int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif #endif /* _MSC_VER */ //millers m_pd.h end /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #ifndef BUILD_DATE # define BUILD_DATE "" __DATE__ " : " __TIME__ #endif #if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43) # define iem_open sys_open # define iem_close sys_close # define iem_fopen sys_fopen # define iem_fclose sys_fclose #else # define iem_open open # define iem_close close # define iem_fopen fopen # define iem_fclose fclose #endif // millers d_osc.c beg #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) \ || defined(__OpenBSD__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \ defined(ANDROID) #include #endif #ifdef __MINGW32__ #include #endif #ifdef _MSC_VER /* _MSVC lacks BYTE_ORDER and LITTLE_ENDIAN */ #define LITTLE_ENDIAN 0x0001 #define BYTE_ORDER LITTLE_ENDIAN #endif #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 #else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ #endif union tabfudge { double tf_d; int32_t tf_i[2]; }; // millers d_osc.c end // millers d_delay.c beg #define IEMDEFDELVS 64 #define IEMXTRASAMPS 4 #define IEMSAMPBLK 4 // millers d_delay.c end #endif iem_utils-0.0.20240903/iem_spec2/pd-lib-builder/0000700000000000000000000000000014665566711015643 5ustar00iem_utils-0.0.20240903/iem_spec2/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711017677 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/iem_spec2/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711021753 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/iem_spec2/pd-lib-builder/README.md0000600000000000000000000001314614665566711017131 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/iem_spec2/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711020437 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/iem_spec2/spec2_1p1z_freq~-help.pd0000600000000000000000000000471614665566711017437 0ustar00#N canvas 20 32 724 388 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 256 float 0; #X coords 0 100 255 0 300 200 1; #X restore 346 82 graph; #X text 130 39 iem_spec2 calculates only blocksize/2 + 1 samples of block; #N canvas 0 0 633 408 tables 0; #N canvas 0 0 450 300 graph1 0; #X array hann 259 float 0; #X coords 0 1 258 -1 200 140 1; #X restore 30 31 graph; #X obj 246 34 loadbang; #X msg 246 55 \; hann cosinesum 256 0.5 -0.5; #X connect 1 0 2 0; #X restore 149 82 pd tables; #X obj 42 145 noise~; #X obj 237 93 osc~ 11025; #X msg 292 58 0; #X obj 42 169 bpq2~ 7000 6 100; #X msg 206 187 1 0 0; #X msg 205 121 0.1 0 0.9; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X text 18 5 spec2_1p1z_freq~; #N canvas 190 113 569 461 spec_analyse_by_1p1z_freq 0; #X obj 100 51 inlet~; #X obj 352 46 block~ 256 2; #X obj 102 156 rfft~; #X obj 101 108 *~; #X obj 298 46 inlet; #X obj 114 86 spec2_tabreceive~ hann; #X obj 97 186 *~; #X obj 124 186 *~; #X obj 104 211 +~; #X obj 104 266 powtodb~; #X obj 104 291 tabsend~ scope; #X obj 180 174 /; #X obj 101 131 *~ 0.032; #X msg 189 149 1 32; #X obj 188 127 loadbang; #X obj 300 225 spec2_1p1z_freq~ 0.5 0 0.5; #X connect 0 0 3 0; #X connect 2 0 6 0; #X connect 2 0 6 1; #X connect 2 1 7 0; #X connect 2 1 7 1; #X connect 3 0 12 0; #X connect 4 0 15 0; #X connect 5 0 3 1; #X connect 6 0 8 0; #X connect 7 0 8 1; #X connect 8 0 15 0; #X connect 9 0 10 0; #X connect 11 0 12 1; #X connect 12 0 2 0; #X connect 13 0 11 0; #X connect 14 0 13 0; #X connect 15 0 9 0; #X restore 42 214 pd spec_analyse_by_1p1z_freq; #X msg 205 143 0.3 0 0.7; #X msg 205 165 0.5 0 0.5; #X msg 105 123 6; #X msg 107 143 3; #X msg 134 122 16; #X msg 164 121 66; #X text 168 3 filter the spectrum with a 1p1z-IIR filter; #X text 169 14 first time from the left to right; #X text 169 26 second time from the right to left; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 7 0 10 0; #X connect 9 0 8 1; #X connect 10 0 20 0; #X connect 11 0 20 1; #X connect 12 0 20 1; #X connect 21 0 20 1; #X connect 22 0 20 1; #X connect 23 0 10 2; #X connect 24 0 10 2; #X connect 25 0 10 2; #X connect 26 0 10 2; iem_utils-0.0.20240903/iem_spec2/spec2_1p1z_time~-help.pd0000600000000000000000000000420314665566711017427 0ustar00#N canvas 20 32 712 376 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 256 float 0; #X coords 0 100 255 0 300 200 1; #X restore 346 82 graph; #X text 18 5 spec2_1p1z_time~; #X text 132 20 iem_spec2 calculates only blocksize/2 + 1 samples of block; #N canvas 0 0 629 404 tables 0; #N canvas 0 0 450 300 graph1 0; #X array hann 259 float 0; #X coords 0 1 258 -1 200 140 1; #X restore 30 31 graph; #X obj 246 34 loadbang; #X msg 246 55 \; hann cosinesum 256 0.5 -0.5; #X connect 1 0 2 0; #X restore 149 82 pd tables; #X obj 42 145 noise~; #X obj 237 93 osc~ 11025; #X msg 292 58 0; #X obj 42 169 bpq2~ 7000 6 100; #X msg 201 187 1 0 0; #X msg 200 165 0.1 0 0.9; #X msg 200 143 0.01 0 0.99; #N canvas 190 113 557 449 spec_analyse_by_1p1z_time 0; #X obj 100 51 inlet~; #X obj 352 46 block~ 256 2; #X obj 102 156 rfft~; #X obj 101 108 *~; #X obj 300 225 spec2_1p1z_time~ 0.5 0 0.5; #X obj 298 46 inlet; #X obj 114 86 spec2_tabreceive~ hann; #X obj 97 186 *~; #X obj 124 186 *~; #X obj 104 211 +~; #X obj 104 266 powtodb~; #X obj 104 291 tabsend~ scope; #X obj 180 174 /; #X obj 101 131 *~ 0.032; #X msg 189 149 1 32; #X obj 188 127 loadbang; #X connect 0 0 3 0; #X connect 2 0 7 0; #X connect 2 0 7 1; #X connect 2 1 8 0; #X connect 2 1 8 1; #X connect 3 0 13 0; #X connect 4 0 10 0; #X connect 5 0 4 0; #X connect 6 0 3 1; #X connect 7 0 9 0; #X connect 8 0 9 1; #X connect 9 0 4 0; #X connect 10 0 11 0; #X connect 12 0 13 1; #X connect 13 0 2 0; #X connect 14 0 12 0; #X connect 15 0 14 0; #X restore 42 214 pd spec_analyse_by_1p1z_time; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X text 168 3 makes a feedback of the spectrum; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 8 0 11 0; #X connect 10 0 9 1; #X connect 11 0 15 0; #X connect 12 0 15 1; #X connect 13 0 15 1; #X connect 14 0 15 1; iem_utils-0.0.20240903/iem_spec2/spec2_abs~-help.pd0000600000000000000000000000064714665566711016373 0ustar00#N canvas 52 28 470 264 10; #X text 102 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 183 49 like; #X obj 29 52 spec2_abs~; #X text 30 16 spec2_abs~; #X obj 226 52 abs~; #X text 109 25 with (blocksize/2 + 1) bins; #X text 106 14 take absolute value of a signal spectrum; iem_utils-0.0.20240903/iem_spec2/spec2_add_scalar~-help.pd0000600000000000000000000000064214665566711017676 0ustar00#N canvas 52 28 575 275 10; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 361 51 like; #X obj 412 52 +~ 0; #X text 134 53 1.arg: value to add; #X text 106 14 add a value to a signal spectrum with (blocksize/2 + 1) bins; #X obj 30 52 spec2+s~ 0; #X text 30 14 spec2+s~; iem_utils-0.0.20240903/iem_spec2/spec2_add~-help.pd0000600000000000000000000000057214665566711016353 0ustar00#N canvas 52 28 474 268 10; #X obj 30 52 spec2+~; #X text 86 51 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 30 15 spec2+~; #X text 183 49 like; #X obj 234 50 +~; #X text 106 14 add 2 signal spectras with (blocksize/2 + 1) bins; iem_utils-0.0.20240903/iem_spec2/spec2_block_delay~-help.pd0000600000000000000000000000421114665566711020065 0ustar00#N canvas 90 35 769 482 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array array101 192 float 0; #X coords 0 1 191 -1 382 128 1; #X restore 319 224 graph; #X obj 46 156 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 19 4 spec2_block_delay~; #X text 202 216 no arguments; #X text 90 402 IEM KUG; #X text 74 390 musil; #X text 104 390 @; #X text 110 390 iem.at; #X text 73 412 Graz \, Austria; #X text 25 379 (c) Thomas Musil 2000 - 2006; #X obj 84 217 spec2_block_delay~; #X text 146 21 but copy only (blocksize/2 + 1) samples; #N canvas 0 0 470 320 init 0; #X obj 52 43 t f f; #X obj 50 -10 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 43 77 + 0.5; #X obj 52 -36 loadbang; #X obj 50 11 for++ -64 63; #X obj 56 107 / 64; #X obj 101 105 + 64; #X obj 57 147 tabwrite array100; #X msg 161 -9 \; array100 xticks 0 32 2; #X msg 174 75 \; array101 xticks 0 32 2; #X msg 177 125 \; array101 xlabel -1.1 0 32 64 96 128 160 192; #X msg 165 30 \; array100 xlabel -1.1 0 32 64 96 128; #X connect 0 0 2 0; #X connect 0 1 6 0; #X connect 1 0 4 0; #X connect 2 0 5 0; #X connect 3 0 1 0; #X connect 3 0 8 0; #X connect 3 0 11 0; #X connect 3 0 9 0; #X connect 3 0 10 0; #X connect 4 0 0 0; #X connect 5 0 7 0; #X connect 6 0 7 1; #X restore 323 394 pd init; #N canvas 0 0 450 300 graph1 0; #X array array100 128 float 0; #X coords 0 1 127 -1 256 128 1; #X restore 319 62 graph; #X obj 84 192 tabplay~ array100; #X obj 46 252 tabwrite~ array101; #X text 161 4 delay spectrum around blocksize samples; #X text 484 372 0 .. 32: preceding signal (== 0); #X text 480 385 33 .. 63: ignored input ramp; #X text 481 399 64 .. 96: delayed ramp signal; #X text 477 412 97 .. 127: ignored input ramp; #X text 473 425 128 .. 160: delayed ramp signal; #X text 471 438 161 .. 191: ignored input signal (== 0); #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 5 0 18 0; #X connect 5 0 19 0; #X connect 14 0 19 0; #X connect 18 0 14 0; iem_utils-0.0.20240903/iem_spec2/spec2_clip_max~-help.pd0000600000000000000000000000203014665566711017406 0ustar00#N canvas 52 28 606 339 10; #X text 230 141 no arg; #X text 81 272 IEM KUG; #X text 65 260 musil; #X text 95 260 @; #X text 101 260 iem.at; #X text 64 282 Graz \, Austria; #X text 16 249 (c) Thomas Musil 2000 - 2006; #X text 351 143 like; #X obj 128 141 spec2_clip_max~; #X obj 128 118 sig~; #X floatatom 128 98 5 0 0 0 - - -; #X obj 212 118 sig~; #X floatatom 212 98 5 0 0 0 - - -; #X obj 401 144 min~; #X text 9 6 spec2_clip_max~; #X obj 21 61 dsp; #X obj 21 38 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 21 107 5 0 0 0 - - -; #X floatatom 34 86 5 0 0 0 - - -; #X text 120 28 iem_spec2 calculates only blocksize/2 + 1 samples of block; #X text 139 9 restrict a signal to lie lower than max limit; #X obj 84 179 print~; #X obj 85 159 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X connect 8 0 21 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 11 0 8 1; #X connect 12 0 11 0; #X connect 15 0 17 0; #X connect 15 1 18 0; #X connect 16 0 15 0; #X connect 22 0 21 0; iem_utils-0.0.20240903/iem_spec2/spec2_clip_min~-help.pd0000600000000000000000000000203314665566711017407 0ustar00#N canvas 52 28 546 330 10; #X text 230 141 no arg; #X text 81 272 IEM KUG; #X text 65 260 musil; #X text 95 260 @; #X text 101 260 iem.at; #X text 64 282 Graz \, Austria; #X text 16 249 (c) Thomas Musil 2000 - 2006; #X text 351 143 like; #X obj 128 118 sig~; #X floatatom 128 98 5 0 0 0 - - -; #X obj 212 118 sig~; #X floatatom 212 98 5 0 0 0 - - -; #X obj 21 61 dsp; #X obj 21 38 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 21 107 5 0 0 0 - - -; #X floatatom 34 86 5 0 0 0 - - -; #X text 120 28 iem_spec2 calculates only blocksize/2 + 1 samples of block; #X text 9 6 spec2_clip_min~; #X text 139 9 restrict a signal to lie higher than min limit; #X obj 401 144 max~; #X obj 128 141 spec2_clip_min~; #X obj 84 179 print~; #X obj 85 159 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X connect 8 0 20 0; #X connect 9 0 8 0; #X connect 10 0 20 1; #X connect 11 0 10 0; #X connect 12 0 14 0; #X connect 12 1 15 0; #X connect 13 0 12 0; #X connect 20 0 21 0; #X connect 22 0 21 0; iem_utils-0.0.20240903/iem_spec2/spec2_dbtopow~-help.pd0000600000000000000000000000066314665566711017302 0ustar00#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X obj 243 54 dbtopow~; #X obj 26 53 spec2_dbtopow~; #X text 29 15 spec2_dbtopow~; #X text 132 13 convert dB to power of a signal spectrum; iem_utils-0.0.20240903/iem_spec2/spec2_dbtorms~-help.pd0000600000000000000000000000066714665566711017302 0ustar00#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X text 29 15 spec2_dbtorms~; #X obj 243 54 dbtorms~; #X obj 26 53 spec2_dbtorms~; #X text 132 13 convert dB to rms value of a signal spectrum; iem_utils-0.0.20240903/iem_spec2/spec2_matrix_bundle_stat~-help.pd0000600000000000000000000001101714665566711021507 0ustar00#N canvas 106 40 882 682 10; #X obj 18 44 dsp; #X obj 18 14 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 18 100 5 0 0 0 - - -; #X floatatom 33 74 5 0 0 0 - - -; #X obj 46 322 sig~ 1; #X obj 96 353 sig~ 2; #X obj 145 377 sig~ 4; #X obj 195 402 sig~ 8; #X obj 234 431 sig~ 16; #X obj 47 488 unsig~; #X floatatom 47 512 5 0 0 0 - - -; #X obj 245 491 unsig~; #X floatatom 245 515 5 0 0 0 - - -; #X obj 298 442 any; #X msg 298 154 bundle 0 0 0 0 0; #X msg 298 180 bundle 1 1 1 1 1; #X msg 298 201 bundle 2 2 2 2 2; #X msg 298 227 bundle 1 0 0 0 0; #X msg 298 247 bundle 0 1 0 0 0; #X msg 298 267 bundle 0 0 1 0 0; #X msg 298 287 bundle 0 0 0 1 0; #X msg 298 307 bundle 0 0 0 0 1; #X msg 298 333 bundle 2 0 0 0 0; #X msg 298 353 bundle 0 2 0 0 0; #X msg 298 373 bundle 0 0 2 0 0; #X msg 298 393 bundle 0 0 0 2 0; #X msg 298 413 bundle 0 0 0 0 2; #X obj 432 442 pp element; #X obj 432 419 pack 0 0; #X obj 432 397 f; #X floatatom 475 368 4 1 5 0 - - -; #X floatatom 445 368 4 0 2 0 - - -; #X obj 422 375 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 706 15 SIG_OUT = A * SIG_IN; #X text 234 14 multiplies a n-dimensional signal-in-vector with a dynamic static (like sig~) signal-matrix to a n-dimensional signal-out-vector ; #X text 725 33 A is quadratic; #X text 662 50 dim(SIG_OUT) = dim(SIG_IN) = n; #X text 234 51 each matrix-column has only one one \, the other elements are zero; #X text 301 475 2.arg Nr. of outlets = rows; #X text 301 464 1.arg Nr. of inlets = columns; #X text 517 336 message "element"; #X text 531 365 2.) item column_index (1 .. nr_columns); #X text 531 353 1.) item row_index (0 .. nr_rows); #X text 446 111 message "bundle"; #X text 556 381 where the single one of the column will be placed; #X text 557 393 if (row-index == 0) -> the column has only zeros; #X text 449 126 (nr_inlets = nr_columns) row-indices (0 .. nr_row); #X text 454 162 if (row-index == 0) -> the column has only zeros; #X text 453 150 where the single one of each column will be placed ; #N canvas 176 206 818 475 block_______________________ 0; #X obj 564 88 block~ 128 2; #X obj 48 29 inlet~; #X obj 51 260 outlet~; #X obj 103 30 inlet~; #X obj 159 29 inlet~; #X obj 214 30 inlet~; #X obj 272 30 inlet~; #X obj 246 257 outlet~; #X obj 51 209 spec2_matrix_bundle_stat~ 5 2; #X obj 350 30 inlet; #X obj 586 308 for++ 0 127 0.1; #X obj 586 332 moses 64; #X msg 586 359 1 \$1; #X msg 637 358 0 \$1; #X obj 586 287 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 586 267 loadbang; #X obj 540 240 table \$0_rect 128; #X obj 586 385 tabwrite \$0_rect; #X obj 64 57 tabreceive~ \$0_rect; #X obj 48 79 *~; #X obj 116 81 tabreceive~ \$0_rect; #X obj 100 103 *~; #X obj 170 103 tabreceive~ \$0_rect; #X obj 154 125 *~; #X obj 220 124 tabreceive~ \$0_rect; #X obj 204 146 *~; #X obj 270 146 tabreceive~ \$0_rect; #X obj 254 168 *~; #X connect 1 0 19 0; #X connect 3 0 21 0; #X connect 4 0 23 0; #X connect 5 0 25 0; #X connect 6 0 27 0; #X connect 8 0 2 0; #X connect 8 1 7 0; #X connect 9 0 8 0; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 11 1 13 0; #X connect 12 0 17 0; #X connect 13 0 17 0; #X connect 14 0 10 0; #X connect 15 0 14 0; #X connect 18 0 19 1; #X connect 19 0 8 0; #X connect 20 0 21 1; #X connect 21 0 8 1; #X connect 22 0 23 1; #X connect 23 0 8 2; #X connect 24 0 25 1; #X connect 25 0 8 3; #X connect 26 0 27 1; #X connect 27 0 8 4; #X restore 48 463 pd block_______________________; #X text 50 13 spec2_matrix_bundle_stat~; #X text 90 575 IEM KUG; #X text 74 563 musil; #X text 104 563 @; #X text 110 563 iem.at; #X text 73 585 Graz \, Austria; #X text 25 552 (c) Thomas Musil 2000 - 2006; #X text 234 83 it calculates matrix only with (blocksize/2 + 1) samples per signalvector; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 4 0 49 0; #X connect 5 0 49 1; #X connect 6 0 49 2; #X connect 7 0 49 3; #X connect 8 0 49 4; #X connect 9 0 10 0; #X connect 11 0 12 0; #X connect 13 0 49 5; #X connect 14 0 13 0; #X connect 15 0 13 0; #X connect 16 0 13 0; #X connect 17 0 13 0; #X connect 18 0 13 0; #X connect 19 0 13 0; #X connect 20 0 13 0; #X connect 21 0 13 0; #X connect 22 0 13 0; #X connect 23 0 13 0; #X connect 24 0 13 0; #X connect 25 0 13 0; #X connect 26 0 13 0; #X connect 28 0 27 0; #X connect 29 0 28 0; #X connect 30 0 28 1; #X connect 31 0 29 1; #X connect 32 0 29 0; #X connect 49 0 9 0; #X connect 49 1 11 0; iem_utils-0.0.20240903/iem_spec2/spec2_mul_scalar~-help.pd0000600000000000000000000000067614665566711017752 0ustar00#N canvas 52 28 591 268 10; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 361 51 like; #X text 30 14 spec2*s~; #X text 107 26 with (blocksize/2 + 1) bins; #X text 106 14 multiply a value with a signal spectrum; #X text 134 53 1.arg: value to multiply; #X obj 30 52 spec2*s~ 0; #X obj 412 52 *~ 0; iem_utils-0.0.20240903/iem_spec2/spec2_mul~-help.pd0000600000000000000000000000060114665566711016411 0ustar00#N canvas 52 28 474 268 10; #X text 86 51 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 183 49 like; #X text 30 15 spec2*~; #X obj 30 52 spec2*~; #X obj 234 50 *~; #X text 106 14 multiply 2 signal spectras with (blocksize/2 + 1) bins ; iem_utils-0.0.20240903/iem_spec2/spec2_powtodb~-help.pd0000600000000000000000000000066314665566711017302 0ustar00#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X obj 26 53 spec2_powtodb~; #X text 29 15 spec2_powtodb~; #X obj 243 54 powtodb~; #X text 133 13 convert power to db of a signal spectrum; iem_utils-0.0.20240903/iem_spec2/spec2_rmstodb~-help.pd0000600000000000000000000000066714665566711017302 0ustar00#N canvas 52 29 470 263 10; #X text 120 53 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 211 52 like; #X text 135 24 with (blocksize/2 + 1) bins; #X text 29 15 spec2_rmstodb~; #X text 132 13 convert rms value to db of a signal spectrum; #X obj 26 53 spec2_rmstodb~; #X obj 243 54 rmstodb~; iem_utils-0.0.20240903/iem_spec2/spec2_shift~-help.pd0000600000000000000000000000262514665566711016741 0ustar00#N canvas 10 8 548 293 10; #X obj 15 90 dsp; #X obj 15 67 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 15 131 5 0 0 0 - - -; #X floatatom 28 114 5 0 0 0 - - -; #N canvas 0 0 450 300 graph2 0; #X array array100 64 float 1; #A 0 -0.550001 -0.750001 -0.700001 -0.600001 -0.500001 -0.400001 -0.400001 -0.350001 -0.25 -0.2 -0.15 -0.1 -0.0500001 -0.0500001 3.72529e-008 0.0500001 0.0500001 0.1 0.1 0.15 0.2 0.2 0.250001 0.250001 0.300001 0.350001 0.350001 0.400001 0.500001 0.500001 0.516668 0.533334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 66 graph; #X text 83 210 IEM KUG; #X text 67 198 musil; #X text 97 198 @; #X text 103 198 iem.at; #X text 66 220 Graz \, Austria; #X text 18 187 (c) Thomas Musil 2000 - 2006; #N canvas 0 0 450 300 graph2 0; #X array array101 64 float 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 126 graph; #X obj 143 102 spec2_shift~ 10; #X obj 144 131 tabsend~ array101; #X obj 142 71 tabreceive~ array100; #X floatatom 105 51 5 -32 32 0 - - -; #X text 15 10 spec2_shift~; #X text 248 101 1.arg: shift width; #X text 136 6 shift a spectrum of (blocksize/2 + 1) to the left or right about n bins (+- blocksize/2); #X text 80 37 shift width; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 12 0 13 0; #X connect 14 0 12 0; #X connect 15 0 12 0; iem_utils-0.0.20240903/iem_spec2/spec2_sqrt~-help.pd0000600000000000000000000000162514665566711016614 0ustar00#N canvas 52 28 437 304 10; #X text 218 120 no arg; #X text 89 234 IEM KUG; #X text 73 222 musil; #X text 103 222 @; #X text 109 222 iem.at; #X text 72 244 Graz \, Austria; #X text 24 211 (c) Thomas Musil 2000 - 2006; #X text 327 115 like; #X text 109 25 with (blocksize/2 + 1) bins; #X text 17 13 spec2_sqrt~; #X obj 144 120 spec2_sqrt~; #X obj 359 116 sqrt~; #X obj 143 98 sig~ 16; #X obj 143 148 print~; #X obj 111 119 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 29 97 dsp; #X obj 29 71 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 143 79 5 0 0 0 - - -; #X floatatom 29 142 5 0 0 0 - - -; #X floatatom 42 122 5 0 0 0 - - -; #X text 106 14 take square root value of a signal spectrum; #X connect 10 0 13 0; #X connect 12 0 10 0; #X connect 14 0 13 0; #X connect 15 0 18 0; #X connect 15 1 19 0; #X connect 16 0 15 0; #X connect 17 0 12 0; iem_utils-0.0.20240903/iem_spec2/spec2_stretch~-help.pd0000600000000000000000000000267614665566711017306 0ustar00#N canvas 10 8 548 293 10; #X obj 15 90 dsp; #X obj 15 67 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 15 131 5 0 0 0 - - -; #X floatatom 28 114 5 0 0 0 - - -; #N canvas 0 0 450 300 graph2 0; #X array array100 64 float 1; #A 0 -0.550001 -0.750001 -0.700001 -0.600001 -0.500001 -0.400001 -0.400001 -0.350001 -0.25 -0.2 -0.15 -0.1 -0.0500001 -0.0500001 3.72529e-008 0.0500001 0.0500001 0.1 0.1 0.15 0.2 0.2 0.250001 0.250001 0.300001 0.350001 0.350001 0.400001 0.500001 0.500001 0.516668 0.533334 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 66 graph; #X text 83 210 IEM KUG; #X text 67 198 musil; #X text 97 198 @; #X text 103 198 iem.at; #X text 66 220 Graz \, Austria; #X text 18 187 (c) Thomas Musil 2000 - 2006; #N canvas 0 0 450 300 graph2 0; #X array array101 64 float 0; #X coords 0 1 63 -1 64 40 1; #X restore 436 126 graph; #X obj 144 131 tabsend~ array101; #X obj 142 71 tabreceive~ array100; #X floatatom 93 41 5 20 500 0 - - -; #X obj 143 102 spec2_stretch~ 1; #X obj 93 58 / 100; #X floatatom 93 78 5 0 0 0 - - -; #X text 16 10 spec2_stretch~; #X text 137 6 stretch a spectrum of (blocksize/2 + 1) by a factor; #X text 256 102 1.arg: stretch factor; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 13 0 15 0; #X connect 14 0 16 0; #X connect 15 0 12 0; #X connect 16 0 17 0; #X connect 17 0 15 0; iem_utils-0.0.20240903/iem_spec2/spec2_sub~-help.pd0000600000000000000000000000060114665566711016405 0ustar00#N canvas 52 28 466 260 10; #X text 86 51 no arg; #X text 83 169 IEM KUG; #X text 67 157 musil; #X text 97 157 @; #X text 103 157 iem.at; #X text 66 179 Graz \, Austria; #X text 18 146 (c) Thomas Musil 2000 - 2006; #X text 183 49 like; #X obj 30 52 spec2-~; #X text 30 15 spec2-~; #X obj 234 50 -~; #X text 106 14 subtract 2 signal spectras with (blocksize/2 + 1) bins ; iem_utils-0.0.20240903/iem_spec2/spec2_sum~-help.pd0000600000000000000000000000377514665566711016437 0ustar00#N canvas 90 35 781 494 10; #X obj 42 70 dsp; #X obj 42 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X floatatom 42 111 5 0 0 0 - - -; #X floatatom 55 94 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array array101 192 float 0; #X coords 0 50 191 -50 382 128 1; #X restore 319 224 graph; #X obj 46 156 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 202 216 no arguments; #X text 90 402 IEM KUG; #X text 74 390 musil; #X text 104 390 @; #X text 110 390 iem.at; #X text 73 412 Graz \, Austria; #X text 25 379 (c) Thomas Musil 2000 - 2006; #N canvas 0 0 754 332 init 0; #X obj 52 43 t f f; #X obj 50 -10 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 52 -36 loadbang; #X obj 57 147 tabwrite array100; #X msg 161 -9 \; array100 xticks 0 32 2; #X msg 174 75 \; array101 xticks 0 32 2; #X msg 165 30 \; array100 xlabel -1.1 0 32 64 96 128; #X obj 50 11 for++ 0 127; #X obj 56 107 / 128; #X msg 431 -9 \; array100 yticks 0 0.5 2; #X msg 435 30 \; array100 ylabel -6 -1 -0.5 0 0.5 1; #X msg 177 125 \; array101 xlabel -55 0 32 64 96 128 160 192; #X msg 444 75 \; array101 yticks 0 25 2; #X msg 447 125 \; array101 ylabel -6 -50 -25 0 25 50; #X connect 0 0 8 0; #X connect 0 1 3 1; #X connect 1 0 7 0; #X connect 2 0 1 0; #X connect 2 0 4 0; #X connect 2 0 6 0; #X connect 2 0 5 0; #X connect 2 0 11 0; #X connect 2 0 9 0; #X connect 2 0 10 0; #X connect 2 0 12 0; #X connect 2 0 13 0; #X connect 7 0 0 0; #X connect 8 0 3 0; #X restore 323 394 pd init; #N canvas 0 0 450 300 graph1 0; #X array array100 128 float 0; #X coords 0 1 127 -1 256 128 1; #X restore 319 62 graph; #X obj 84 192 tabplay~ array100; #X obj 46 252 tabwrite~ array101; #X obj 84 218 spec2_sum~; #X text 19 4 spec2_sum~; #X text 400 5 (blocksize/2 + 1) bins; #X text 161 4 accumulate the sum of the spectrum with; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 5 0 15 0; #X connect 5 0 16 0; #X connect 15 0 17 0; #X connect 17 0 16 0; iem_utils-0.0.20240903/iem_spec2/spec2_tab_conv~-help.pd0000600000000000000000000001147414665566711017421 0ustar00#N canvas 9 18 777 596 10; #X obj 44 49 dsp; #X obj 44 26 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 44 90 5 0 0 0 - - -; #X floatatom 57 73 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array win 50 float 0; #X coords 0 1 49 -1 200 140 1; #X restore 267 333 graph; #X floatatom 64 144 7 0 0 0 - - -; #X obj 189 188 noise~; #X floatatom 316 170 5 2 40 0 - - -; #X msg 316 147 8; #X text 22 -1 spec2_tab_conv~; #X obj 64 166 osc~ 5000; #N canvas 148 208 734 434 gen_win 0; #X obj 92 43 inlet; #X obj 92 121 - 1; #X obj 92 142 t f f; #X obj 92 167 / 20; #X obj 92 188 * 3.14159; #X obj 92 211 sin; #X msg 92 232 \$1 \$1; #X obj 92 254 *; #X obj 92 65 t b f b; #X msg 253 218 1 \$1; #X obj 253 240 /; #X obj 224 367 outlet; #X obj 225 315 f; #X msg 224 337 set win \$1; #X obj 527 33 table hwin 50; #X obj 242 124 tab_const hwin; #X obj 92 274 tabwrite hwin; #X obj 191 146 tab_sum hwin; #X obj 253 264 tab_mul_scalar hwin hwin; #X obj 191 192 tab_copy hwin win; #X obj 93 95 for++ 1 20; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 2 1 16 1; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X connect 7 0 16 0; #X connect 8 0 20 0; #X connect 8 1 3 1; #X connect 8 1 12 1; #X connect 8 1 20 1; #X connect 8 2 15 0; #X connect 9 0 10 0; #X connect 10 0 18 0; #X connect 12 0 13 0; #X connect 13 0 11 0; #X connect 17 0 19 0; #X connect 17 1 9 0; #X connect 19 0 12 0; #X connect 20 0 1 0; #X connect 20 1 17 0; #X restore 316 189 pd gen_win; #X obj 316 124 loadbang; #N canvas 6 92 777 603 spec2_blockfilter~ 0; #X obj 59 29 inlet~; #X obj 72 488 outlet~; #X obj 61 101 rfft~; #X obj 71 392 rifft~; #X obj 407 22 inlet; #X text 199 240 1.arg: table-name; #X obj 474 23 block~ 256 2; #N canvas 0 0 450 300 graph1 0; #X array hsin 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 423 296 graph; #X obj 458 140 for++ 0 255 0.1; #X obj 458 119 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 458 160 t f f; #X obj 457 190 / 256; #X obj 457 210 * 3.14159; #X obj 457 229 sin; #X obj 457 251 tabwrite hsin; #X obj 72 51 tabreceive~ hsin; #X obj 60 73 *~; #X obj 458 95 loadbang; #X obj 241 100 rfft~; #X obj 252 50 tabreceive~ hsin; #X obj 240 72 *~; #X obj 241 26 inlet~; #X obj 84 417 tabreceive~ hsin; #X obj 72 439 *~; #X text 199 251 2.arg: table-size; #X obj 72 463 /~ 32768; #X obj 59 290 spec2_dbtorms~; #X obj 65 363 spec2*~; #X obj 122 366 spec2*~; #X obj 58 178 spec2+~; #X obj 47 151 spec2*~; #X obj 94 151 spec2*~; #X obj 58 201 spec2_powtodb~; #X obj 59 247 spec2_tab_conv~ win 8; #X connect 0 0 16 0; #X connect 2 0 30 0; #X connect 2 0 30 1; #X connect 2 1 31 0; #X connect 2 1 31 1; #X connect 3 0 23 0; #X connect 4 0 33 0; #X connect 8 0 10 0; #X connect 9 0 8 0; #X connect 10 0 11 0; #X connect 10 1 14 1; #X connect 11 0 12 0; #X connect 12 0 13 0; #X connect 13 0 14 0; #X connect 15 0 16 1; #X connect 16 0 2 0; #X connect 17 0 9 0; #X connect 18 0 27 1; #X connect 18 1 28 1; #X connect 19 0 20 1; #X connect 20 0 18 0; #X connect 21 0 20 0; #X connect 22 0 23 1; #X connect 23 0 25 0; #X connect 25 0 1 0; #X connect 26 0 27 0; #X connect 26 0 28 0; #X connect 27 0 3 0; #X connect 28 0 3 1; #X connect 29 0 32 0; #X connect 30 0 29 0; #X connect 31 0 29 1; #X connect 32 0 33 0; #X connect 33 0 26 0; #X restore 64 211 pd spec2_blockfilter~ using spec2_tab_conv~; #X text 550 227 1.arg: table-name; #X text 551 240 2.arg: table-size; #X msg 429 209 set win 8; #X obj 408 234 spec2_tab_conv~ win 8; #X obj 68 298 dac~; #X obj 144 311 prvu~; #X obj 145 339 vu 15 120 empty empty -1 -8 0 8 -66577 -1 1 0; #X floatatom 143 505 5 0 0 0 - - -; #X floatatom 154 479 5 0 0 0 - - -; #X msg 156 288 reset; #X text 146 4 convolute a spectrum of size (blocksize/2 + 1) with a table of size n; #X obj 69 266 *~ 0.003; #X obj 133 255 dbtorms; #X obj 201 252 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 161 131 mtof; #X obj 165 111 hsl 137 15 0 136 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X text 98 553 IEM KUG; #X text 82 541 musil; #X text 112 541 @; #X text 118 541 iem.at; #X text 81 563 Graz \, Austria; #X text 33 530 (c) Thomas Musil 2000 - 2006; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 5 0 10 0; #X connect 6 0 13 1; #X connect 7 0 11 0; #X connect 8 0 7 0; #X connect 10 0 13 0; #X connect 11 0 13 2; #X connect 12 0 8 0; #X connect 13 0 25 0; #X connect 16 0 17 0; #X connect 19 0 20 0; #X connect 20 0 21 0; #X connect 20 1 22 0; #X connect 23 0 19 0; #X connect 25 0 19 0; #X connect 25 0 18 0; #X connect 25 0 18 1; #X connect 26 0 25 1; #X connect 27 0 26 0; #X connect 28 0 5 0; #X connect 29 0 28 0; iem_utils-0.0.20240903/iem_spec2/spec2_tabreceive_enable~-help.pd0000600000000000000000000001065014665566711021240 0ustar00#N canvas 22 17 939 438 10; #X obj 44 49 dsp; #X obj 44 26 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 44 90 5 0 0 0 - - -; #X floatatom 57 73 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 512 float 0; #X coords 0 1 511 -1 512 100 1; #X restore 371 240 graph; #X obj 121 178 tabwrite~ scope; #X obj 211 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 0 450 300 graph2 0; #X array filter 256 float 1; #A 0 0 0 0 0 0 0 0 0.04 0.04 0.08 0.14 0.18 0.2 0.24 0.26 0.28 0.32 0.34 0.36 0.38 0.4 0.42 0.44 0.44 0.46 0.5 0.54 0.58 0.6 0.62 0.646667 0.673334 0.7 0.74 0.76 0.78 0 0 0 0 0 0 -0.06 -0.0866667 -0.113333 -0.14 -0.175 -0.21 -0.245 -0.28 -0.31 -0.34 -0.366667 -0.393333 -0.42 -0.45 -0.48 -0.52 -0.56 -0.58 -0.62 -0.62 -0.66 -0.67 -0.68 -0.7 -0.74 -0.76 -0.78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.78 0.76 0.68 0.62 0.58 0.5 0.473334 0.446667 0.42 0.38 0.34 0.3 0.266667 0.233333 0.2 0.17 0.14 0.11 0.08 0.05 0.02 0 0 0 0 0 0 -0.68 -0.68 -0.62 -0.56 -0.52 -0.48 -0.45 -0.42 -0.37 -0.32 -0.28 -0.24 -0.19 -0.14 -0.12 -0.1 -0.08 -0.02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 255 -1 256 100 1; #X restore 502 -33 graph; #X obj 136 91 del 100; #X msg 781 2 \; filter const 0; #X text 14 -28 spec2_tabreceive_enable~; #X obj 278 47 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X text 295 47 enable; #X text 209 -15 and enables/disables reading the table; #N canvas 63 41 965 587 spec2_blockfilter~ 0; #X obj 100 51 inlet~; #X obj 102 381 outlet~; #X obj 271 120 block~ 256 2; #N canvas 0 0 450 300 graph1 0; #X array rect 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 460 21 graph; #X obj 276 459 tab_const rect; #X obj 279 396 t b b; #X msg 304 421 0 128 1; #X msg 224 419 128 128 0; #X obj 279 374 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 279 350 loadbang; #X obj 101 309 /~ 256; #X obj 101 108 *~; #X obj 114 85 spec2_tabreceive~ rect; #N canvas 0 0 450 300 graph1 0; #X array real 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 177 graph; #N canvas 0 0 450 300 graph1 0; #X array imag 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 326 graph; #X obj 697 56 inlet; #X obj 697 80 t b; #X text 351 190 1.arg: table-name; #X obj 291 54 inlet; #X obj 101 131 rfft~; #X obj 102 280 rifft~; #X obj 158 260 spec2+~; #X obj 40 257 spec2-~; #X obj 32 212 spec2*~; #X obj 85 215 spec2*~; #X obj 146 214 spec2*~; #X obj 205 214 spec2*~; #X obj 247 149 spec2_tabreceive_enable~ real 0; #X obj 263 174 spec2_tabreceive_enable~ imag 0; #X text 352 205 2.arg: enable-state; #X obj 697 102 tab_rfft filter real imag 256; #X connect 0 0 11 0; #X connect 5 0 7 0; #X connect 5 1 6 0; #X connect 6 0 4 0; #X connect 7 0 4 0; #X connect 8 0 5 0; #X connect 9 0 8 0; #X connect 10 0 1 0; #X connect 11 0 19 0; #X connect 12 0 11 1; #X connect 15 0 16 0; #X connect 16 0 30 0; #X connect 18 0 27 0; #X connect 18 0 28 0; #X connect 19 0 23 0; #X connect 19 0 25 0; #X connect 19 1 24 0; #X connect 19 1 26 0; #X connect 20 0 10 0; #X connect 21 0 20 1; #X connect 22 0 20 0; #X connect 23 0 22 0; #X connect 24 0 22 1; #X connect 25 0 21 0; #X connect 26 0 21 1; #X connect 27 0 23 1; #X connect 27 0 26 1; #X connect 28 0 24 1; #X connect 28 0 25 1; #X restore 158 141 pd spec2_blockfilter~ using spec2_tabreceive_enable~ ; #X text 749 122 1.arg: table-name; #X msg 561 99 symbol filter; #X text 749 134 2.arg: enable-state; #X obj 536 129 spec2_tabreceive_enable~ filter 1; #X msg 496 89 1; #X msg 524 89 0; #X obj 159 117 dirac~; #X text 150 2 iem_spec2 calculates only (blocksize/2 + 1) samples; #X text 180 -27 receives spectrum from table with (blocksize/2 + 1) ; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 6 0 14 2; #X connect 6 0 8 0; #X connect 8 0 5 0; #X connect 8 0 21 0; #X connect 11 0 14 1; #X connect 14 0 5 0; #X connect 16 0 18 0; #X connect 19 0 18 0; #X connect 20 0 18 0; #X connect 21 0 14 0; iem_utils-0.0.20240903/iem_spec2/spec2_tabreceive~-help.pd0000600000000000000000000000773614665566711017745 0ustar00#N canvas 9 28 944 451 10; #X obj 44 49 dsp; #X obj 44 26 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X floatatom 44 90 5 0 0 0 - - -; #X floatatom 57 73 5 0 0 0 - - -; #N canvas 0 0 450 300 graph1 0; #X array scope 512 float 0; #X coords 0 1 511 -1 512 100 1; #X restore 350 236 graph; #X obj 211 175 tabwrite~ scope; #X obj 269 55 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 17 -25 spec2_tabreceive~; #N canvas 0 0 450 300 graph2 0; #X array filter 256 float 1; #A 0 0 0 0 0 0 0 0 0.04 0.04 0.08 0.14 0.18 0.2 0.24 0.26 0.28 0.32 0.34 0.36 0.38 0.4 0.42 0.44 0.44 0.46 0.5 0.54 0.58 0.6 0.62 0.646667 0.673334 0.7 0.74 0.76 0.78 0 0 0 0 0 0 -0.06 -0.0866667 -0.113333 -0.14 -0.175 -0.21 -0.245 -0.28 -0.31 -0.34 -0.366667 -0.393333 -0.42 -0.45 -0.48 -0.52 -0.56 -0.58 -0.62 -0.62 -0.66 -0.67 -0.68 -0.7 -0.74 -0.76 -0.78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.78 0.76 0.68 0.62 0.58 0.5 0.473334 0.446667 0.42 0.38 0.34 0.3 0.266667 0.233333 0.2 0.17 0.14 0.11 0.08 0.05 0.02 0 0 0 0 0 0 -0.68 -0.68 -0.62 -0.56 -0.52 -0.48 -0.45 -0.42 -0.37 -0.32 -0.28 -0.24 -0.19 -0.14 -0.12 -0.1 -0.08 -0.02 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 255 -1 256 100 1; #X restore 488 -33 graph; #X obj 226 88 del 100; #X msg 767 2 \; filter const 0; #N canvas 70 41 953 575 spec2_blockfilter~ 0; #X obj 100 51 inlet~; #X obj 102 381 outlet~; #X obj 271 120 block~ 256 2; #N canvas 0 0 450 300 graph1 0; #X array rect 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 460 21 graph; #X obj 276 459 tab_const rect; #X obj 279 396 t b b; #X msg 304 421 0 128 1; #X msg 224 419 128 128 0; #X obj 279 374 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 279 350 loadbang; #X obj 100 135 rfft~; #X obj 101 284 rifft~; #X obj 101 309 /~ 256; #X obj 101 108 *~; #X obj 114 85 spec2_tabreceive~ rect; #N canvas 0 0 450 300 graph1 0; #X array real 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 177 graph; #N canvas 0 0 450 300 graph1 0; #X array imag 256 float 0; #X coords 0 1 255 -1 200 140 1; #X restore 691 326 graph; #X obj 697 56 inlet; #X obj 697 80 t b; #X obj 246 153 spec2_tabreceive~ real; #X obj 262 178 spec2_tabreceive~ imag; #X text 407 178 1.arg: table-name; #X obj 157 264 spec2+~; #X obj 39 261 spec2-~; #X obj 31 216 spec2*~; #X obj 84 219 spec2*~; #X obj 145 218 spec2*~; #X obj 204 218 spec2*~; #X obj 697 102 tab_rfft filter real imag 256; #X connect 0 0 13 0; #X connect 5 0 7 0; #X connect 5 1 6 0; #X connect 6 0 4 0; #X connect 7 0 4 0; #X connect 8 0 5 0; #X connect 9 0 8 0; #X connect 10 0 24 0; #X connect 10 0 26 0; #X connect 10 1 25 0; #X connect 10 1 27 0; #X connect 11 0 12 0; #X connect 12 0 1 0; #X connect 13 0 10 0; #X connect 14 0 13 1; #X connect 17 0 18 0; #X connect 18 0 28 0; #X connect 19 0 24 1; #X connect 19 0 27 1; #X connect 20 0 25 1; #X connect 20 0 26 1; #X connect 22 0 11 1; #X connect 23 0 11 0; #X connect 24 0 23 0; #X connect 25 0 23 1; #X connect 26 0 22 0; #X connect 27 0 22 1; #X restore 248 137 pd spec2_blockfilter~ using spec2_tabreceive~; #X obj 582 122 spec2_tabreceive~ filter; #X text 735 121 1.arg: table-name; #X msg 607 92 symbol filter; #X text 90 302 IEM KUG; #X text 74 290 musil; #X text 104 290 @; #X text 110 290 iem.at; #X text 73 312 Graz \, Austria; #X text 25 279 (c) Thomas Musil 2000 - 2006; #X obj 249 114 dirac~; #X text 143 -11 iem_spec2 calculates only (blocksize/2 + 1) samples ; #X text 140 -27 receives spectrum from table with (blocksize/2 + 1) ; #X connect 0 0 2 0; #X connect 0 1 3 0; #X connect 1 0 0 0; #X connect 6 0 11 1; #X connect 6 0 9 0; #X connect 9 0 5 0; #X connect 9 0 21 0; #X connect 11 0 5 0; #X connect 14 0 12 0; #X connect 21 0 11 0; iem_utils-0.0.20240903/iem_spec2/src/0000700000000000000000000000000014665566711013637 5ustar00iem_utils-0.0.20240903/iem_spec2/src/VC6/0000700000000000000000000000000014665566711014235 5ustar00iem_utils-0.0.20240903/iem_spec2/src/VC6/iem_spec2.dsp0000600000000000000000000000500714665566711016617 0ustar00# Microsoft Developer Studio Project File - Name="iem_spec2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_spec2 - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak" CFG="iem_spec2 - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_spec2 - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_spec2 - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_spec2 - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_spec2 - Win32 Release" # Name "iem_spec2 - Win32 Debug" !IF "$(CFG)" == "iem_spec2 - Win32 Release" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_spec2/src/VC6/iem_spec2.dsw0000600000000000000000000000107114665566711016623 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_spec2"=.\iem_spec2.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_spec2/src/VC6/makefile_win0000600000000000000000000000256114665566711016620 0ustar00 all: ..\iem_spec2.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_spec2.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_spec2_setup \ /out:..\iem_spec2.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_spec2/src/VC7/0000700000000000000000000000000014665566711014236 5ustar00iem_utils-0.0.20240903/iem_spec2/src/VC7/iem_spec2.vcproj0000600000000000000000000000243114665566711017333 0ustar00 iem_utils-0.0.20240903/iem_spec2/src/VC7/makefile_vc7proj0000600000000000000000000000262014665566711017412 0ustar00TARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_spec2/src/VC9/0000700000000000000000000000000014665566711014240 5ustar00iem_utils-0.0.20240903/iem_spec2/src/VC9/iem_spec2.sln0000600000000000000000000000156314665566711016633 0ustar00 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_spec2", "iem_spec2.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_spec2/src/VC9/iem_spec2.vcproj0000600000000000000000000000357514665566711017347 0ustar00 iem_utils-0.0.20240903/iem_spec2/src/VC9/makefile_vc9proj0000600000000000000000000000257614665566711017430 0ustar00TARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_spec2/src/iem_spec2.c0000600000000000000000000000451114665566711015654 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" static t_class *iem_spec2_class; static void *iem_spec2_new(void) { t_object *x = (t_object *)pd_new(iem_spec2_class); return (x); } void spec2_1p1z_freq_tilde_setup(void); void spec2_1p1z_time_tilde_setup(void); void spec2_abs_tilde_setup(void); void spec2_add_scalar_tilde_setup(void); void spec2_add_tilde_setup(void); void spec2_block_delay_tilde_setup(void); void spec2_clip_max_tilde_setup(void); void spec2_clip_min_tilde_setup(void); void spec2_dbtopow_tilde_setup(void); void spec2_dbtorms_tilde_setup(void); void spec2_matrix_bundle_stat_tilde_setup(void); void spec2_mul_scalar_tilde_setup(void); void spec2_mul_tilde_setup(void); void spec2_powtodb_tilde_setup(void); void spec2_rmstodb_tilde_setup(void); void spec2_shift_tilde_setup(void); void spec2_sqrt_tilde_setup(void); void spec2_stretch_tilde_setup(void); void spec2_sub_tilde_setup(void); void spec2_sum_tilde_setup(void); void spec2_tab_conv_tilde_setup(void); void spec2_tabreceive_enable_tilde_setup(void); void spec2_tabreceive_tilde_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_spec2_setup(void) { iem_spec2_class = class_new(gensym("iem_spec2"), iem_spec2_new, 0, sizeof(t_object), CLASS_NOINLET, 0); spec2_1p1z_freq_tilde_setup(); spec2_1p1z_time_tilde_setup(); spec2_abs_tilde_setup(); spec2_add_scalar_tilde_setup(); spec2_add_tilde_setup(); spec2_block_delay_tilde_setup(); spec2_clip_max_tilde_setup(); spec2_clip_min_tilde_setup(); spec2_dbtopow_tilde_setup(); spec2_dbtorms_tilde_setup(); spec2_matrix_bundle_stat_tilde_setup(); spec2_mul_scalar_tilde_setup(); spec2_mul_tilde_setup(); spec2_powtodb_tilde_setup(); spec2_rmstodb_tilde_setup(); spec2_shift_tilde_setup(); spec2_sqrt_tilde_setup(); spec2_stretch_tilde_setup(); spec2_sub_tilde_setup(); spec2_sum_tilde_setup(); spec2_tab_conv_tilde_setup(); spec2_tabreceive_enable_tilde_setup(); spec2_tabreceive_tilde_setup(); post("iem_spec2 (1.21) library loaded! (c) Thomas Musil "BUILD_DATE); post(" musil%ciem.at iem KUG Graz Austria", '@'); } iem_utils-0.0.20240903/iem_spec2/src/iem_spec2.dsp0000600000000000000000000000506414665566711016224 0ustar00# Microsoft Developer Studio Project File - Name="iem_spec2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_spec2 - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak" CFG="iem_spec2 - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_spec2 - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_spec2 - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_spec2 - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_spec2 - Win32 Release" # Name "iem_spec2 - Win32 Debug" !IF "$(CFG)" == "iem_spec2 - Win32 Release" !ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_vc12proj # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_spec2/src/iem_spec2.dsw0000600000000000000000000000107114665566711016225 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_spec2"=.\iem_spec2.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_spec2/src/iem_spec2.sln0000600000000000000000000000156414665566711016233 0ustar00 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_spec2", "iem_spec2.vcxproj", "{95441F75-6F85-457D-9174-37575E559755}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {95441F75-6F85-457D-9174-37575E559755}.Debug|Win32.ActiveCfg = Debug|Win32 {95441F75-6F85-457D-9174-37575E559755}.Debug|Win32.Build.0 = Debug|Win32 {95441F75-6F85-457D-9174-37575E559755}.Release|Win32.ActiveCfg = Release|Win32 {95441F75-6F85-457D-9174-37575E559755}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_spec2/src/iem_spec2.vcxproj0000600000000000000000000000611514665566711017127 0ustar00 Debug Win32 Release Win32 MakeFileProj {95441F75-6F85-457D-9174-37575E559755} Makefile v110 Makefile v110 .\Release\ .\Release\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_spec2.exe .\Debug\ .\Debug\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_spec2.exe iem_utils-0.0.20240903/iem_spec2/src/makefile_vc12proj0000600000000000000000000000262614665566711017075 0ustar00TARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_COMP = cl VIS_CPP_LINK = link VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 11.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Windows Kits\8.1" PD_INST_PATH = "$(PROGRAMFILES)\pd-0.48-1" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include /I..\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\Lib\winv6.3\um\x86\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: $(VIS_CPP_COMP) $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) $(VIS_CPP_LINK) $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_spec2/src/makefile_vc9proj0000600000000000000000000000263014665566711017016 0ustar00TARGET = iem_spec2 all: ..\$(TARGET).dll VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "$(PROGRAMFILES)\pd" PD_WIN_INCLUDE_PATH = /I. /I..\..\include /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /DHAVE_G_CANVAS_H /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_spec2/src/makefile_win0000600000000000000000000000256114665566711016222 0ustar00 all: ..\iem_spec2.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_spec2.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_spec2_setup \ /out:..\iem_spec2.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_spec2/src/spec2_1p1z_freq~.c0000600000000000000000000002453314665566711017116 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_1p1z_freq~ - filter the spectrum with a 1.order IIR twice, once forwards, once backwards --- */ typedef struct spec2_1p1z_freq_tilde { t_object x_obj; t_float x_a0; t_float x_a1; t_float x_b1; t_float *x_begmem; int x_blocksize; t_float x_msi; } t_spec2_1p1z_freq_tilde; t_class *spec2_1p1z_freq_tilde_class; static void spec2_1p1z_freq_tilde_list(t_spec2_1p1z_freq_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { x->x_a0 = (t_float)atom_getfloatarg(0, argc, argv); x->x_a1 = (t_float)atom_getfloatarg(1, argc, argv); x->x_b1 = (t_float)atom_getfloatarg(2, argc, argv); } } static t_int *spec2_1p1z_freq_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)(w[3]); int i, m, n = (int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec1, *vec2, *vec3; t_float in_old, out_old, f; vec2 = x->x_begmem + n + 1; vec1 = vec2 - 1; vec3 = vec2 + 2*n; *vec2++ = in[0]; for(i=1; ix_begmem + 2; in_old = 0.0f; out_old = 0.0f; for(i=0; ix_begmem + 3*n - 2; in_old = 0.0f; out_old = 0.0f; for(i=0; ix_begmem + n + 1; for(i=0; i<=n; i++) { out[i] = *vec2++; } return(w+5); } static t_int *spec2_1p1z_freq_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)(w[3]); int i, m, n = (int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec1, *vec2, *vec3; t_float in_old, out_old, f; m = 3*n; vec2 = x->x_begmem + n + 1; vec1 = vec2; // vec3 = vec2 + 2*n + 2 - 2; vec3 = vec2 + 2*n; x->x_begmem[0] = 0.0f; x->x_begmem[m-1] = 0.0f; i = n; while(i) { f = in[0]; vec2[0] = f; vec1[0] = f; vec3[0] = f; f = in[1]; vec2[1] = f; vec1[-1] = f; vec3[-1] = f; f = in[2]; vec2[2] = f; vec1[-2] = f; vec3[-2] = f; f = in[3]; vec2[3] = f; vec1[-3] = f; vec3[-3] = f; f = in[4]; vec2[4] = f; vec1[-4] = f; vec3[-4] = f; f = in[5]; vec2[5] = f; vec1[-5] = f; vec3[-5] = f; f = in[6]; vec2[6] = f; vec1[-6] = f; vec3[-6] = f; f = in[7]; vec2[7] = f; vec1[-7] = f; vec3[-7] = f; f = in[8]; vec2[8] = f; vec1[-8] = f; vec3[-8] = f; f = in[9]; vec2[9] = f; vec1[-9] = f; vec3[-9] = f; f = in[10]; vec2[10] = f; vec1[-10] = f; vec3[-10] = f; f = in[11]; vec2[11] = f; vec1[-11] = f; vec3[-11] = f; f = in[12]; vec2[12] = f; vec1[-12] = f; vec3[-12] = f; f = in[13]; vec2[13] = f; vec1[-13] = f; vec3[-13] = f; f = in[14]; vec2[14] = f; vec1[-14] = f; vec3[-14] = f; f = in[15]; vec2[15] = f; vec1[-15] = f; vec3[-15] = f; in += 16; vec1 -= 16; vec2 += 16; vec3 -= 16; i -= 16; } f = in[0]; vec2[0] = f; vec1[0] = f; vec3[0] = f; vec2 = x->x_begmem; in_old = 0.0f; out_old = 0.0f; i = m; while(i) { f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old; f = vec2[1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[1] = out_old; f = vec2[2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[2] = out_old; f = vec2[3]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[3] = out_old; f = vec2[4]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[4] = out_old; f = vec2[5]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[5] = out_old; f = vec2[6]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[6] = out_old; f = vec2[7]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[7] = out_old; f = vec2[8]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[8] = out_old; f = vec2[9]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[9] = out_old; f = vec2[10]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[10] = out_old; f = vec2[11]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[11] = out_old; f = vec2[12]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[12] = out_old; f = vec2[13]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[13] = out_old; f = vec2[14]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[14] = out_old; f = vec2[15]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[15] = out_old; vec2 += 16; i -= 16; } f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old; f = vec2[1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[1] = out_old; f = vec2[2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[2] = out_old; // vec2 = x->x_begmem + 3*n - 1 + 3; vec2 = x->x_begmem + 3*n + 2; in_old = 0.0f; out_old = 0.0f; for(i=0; ix_begmem + n + 1; i = n; while(i) { out[0] = vec2[0]; out[1] = vec2[1]; out[2] = vec2[2]; out[3] = vec2[3]; out[4] = vec2[4]; out[5] = vec2[5]; out[6] = vec2[6]; out[7] = vec2[7]; out[8] = vec2[8]; out[9] = vec2[9]; out[10] = vec2[10]; out[11] = vec2[11]; out[12] = vec2[12]; out[13] = vec2[13]; out[14] = vec2[14]; out[15] = vec2[15]; vec2 += 16; out += 16; i -= 16; } out[0] = vec2[0]; return(w+5); } static void spec2_1p1z_freq_tilde_dsp(t_spec2_1p1z_freq_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize) { x->x_begmem = (t_float *)getbytes(3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_begmem = (t_float *)resizebytes(x->x_begmem, 3*(x->x_blocksize+1)*sizeof(t_float), 3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } if(n&15) dsp_add(spec2_1p1z_freq_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_1p1z_freq_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void spec2_1p1z_freq_tilde_free(t_spec2_1p1z_freq_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, 3*(x->x_blocksize+1)*sizeof(t_float)); } static void *spec2_1p1z_freq_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)pd_new(spec2_1p1z_freq_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_begmem = (t_float *)0; if(argc >= 3) spec2_1p1z_freq_tilde_list(x, s, argc, argv); else { x->x_a0 = 1.0f; x->x_a1 = 0.0f; x->x_b1 = 0.0f; } x->x_msi = 0.0f; return (x); } void spec2_1p1z_freq_tilde_setup(void) { spec2_1p1z_freq_tilde_class = class_new(gensym("spec2_1p1z_freq~"), (t_newmethod)spec2_1p1z_freq_tilde_new, (t_method)spec2_1p1z_freq_tilde_free, sizeof(t_spec2_1p1z_freq_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_1p1z_freq_tilde_class, t_spec2_1p1z_freq_tilde, x_msi); class_addmethod(spec2_1p1z_freq_tilde_class, (t_method)spec2_1p1z_freq_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addlist(spec2_1p1z_freq_tilde_class, (t_method)spec2_1p1z_freq_tilde_list); // class_sethelpsymbol(spec2_1p1z_freq_tilde_class, gensym("iemhelp2/spec2_1p1z_freq~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_1p1z_time~.c0000600000000000000000000001412614665566711017114 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_1p1z_time~ ------------------------------ */ static t_class *spec2_1p1z_time_tilde_class; typedef struct _spec2_1p1z_time_tilde { t_object x_obj; t_float x_a0; t_float x_a1; t_float x_b1; t_float *x_begmem_forw; t_float *x_begmem_back; int x_blocksize; t_float x_msi; } t_spec2_1p1z_time_tilde; static void spec2_1p1z_time_tilde_list(t_spec2_1p1z_time_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { x->x_a0 = (t_float)atom_getfloatarg(0, argc, argv); x->x_a1 = (t_float)atom_getfloatarg(1, argc, argv); x->x_b1 = (t_float)atom_getfloatarg(2, argc, argv); } } static t_int *spec2_1p1z_time_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec_forw = x->x_begmem_forw; t_float *vec_back = x->x_begmem_back; t_float f; for(i=0; i<=n; i++) { f = in[i]; out[i] = a0*f + a1*vec_forw[i] + b1*vec_back[i]; vec_forw[i] = f; vec_back[i] = out[i]; } return(w+5); } static t_int *spec2_1p1z_time_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)(w[3]); int n = (t_int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec_forw = x->x_begmem_forw; t_float *vec_back = x->x_begmem_back; t_float ff; while(n) { t_float f[16]; f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; f[8] = in[8]; f[9] = in[9]; f[10] = in[10]; f[11] = in[11]; f[12] = in[12]; f[13] = in[13]; f[14] = in[14]; f[15] = in[15]; out[0] = a0*f[0] + a1*vec_forw[0] + b1*vec_back[0]; out[1] = a0*f[1] + a1*vec_forw[1] + b1*vec_back[1]; out[2] = a0*f[2] + a1*vec_forw[2] + b1*vec_back[2]; out[3] = a0*f[3] + a1*vec_forw[3] + b1*vec_back[3]; out[4] = a0*f[4] + a1*vec_forw[4] + b1*vec_back[4]; out[5] = a0*f[5] + a1*vec_forw[5] + b1*vec_back[5]; out[6] = a0*f[6] + a1*vec_forw[6] + b1*vec_back[6]; out[7] = a0*f[7] + a1*vec_forw[7] + b1*vec_back[7]; out[8] = a0*f[8] + a1*vec_forw[8] + b1*vec_back[8]; out[9] = a0*f[9] + a1*vec_forw[9] + b1*vec_back[9]; out[10] = a0*f[10] + a1*vec_forw[10] + b1*vec_back[10]; out[11] = a0*f[11] + a1*vec_forw[11] + b1*vec_back[11]; out[12] = a0*f[12] + a1*vec_forw[12] + b1*vec_back[12]; out[13] = a0*f[13] + a1*vec_forw[13] + b1*vec_back[13]; out[14] = a0*f[14] + a1*vec_forw[14] + b1*vec_back[14]; out[15] = a0*f[15] + a1*vec_forw[15] + b1*vec_back[15]; vec_forw[0] = f[0]; vec_forw[1] = f[1]; vec_forw[2] = f[2]; vec_forw[3] = f[3]; vec_forw[4] = f[4]; vec_forw[5] = f[5]; vec_forw[6] = f[6]; vec_forw[7] = f[7]; vec_forw[8] = f[8]; vec_forw[9] = f[9]; vec_forw[10] = f[10]; vec_forw[11] = f[11]; vec_forw[12] = f[12]; vec_forw[13] = f[13]; vec_forw[14] = f[14]; vec_forw[15] = f[15]; vec_back[0] = out[0]; vec_back[1] = out[1]; vec_back[2] = out[2]; vec_back[3] = out[3]; vec_back[4] = out[4]; vec_back[5] = out[5]; vec_back[6] = out[6]; vec_back[7] = out[7]; vec_back[8] = out[8]; vec_back[9] = out[9]; vec_back[10] = out[10]; vec_back[11] = out[11]; vec_back[12] = out[12]; vec_back[13] = out[13]; vec_back[14] = out[14]; vec_back[15] = out[15]; in += 16; out += 16; vec_forw += 16; vec_back += 16; n -= 16; } ff = in[0]; out[0] = a0*ff + a1*vec_forw[0] + b1*vec_back[0]; vec_forw[0] = ff; vec_back[0] = out[0]; return(w+5); } static void spec2_1p1z_time_tilde_dsp(t_spec2_1p1z_time_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize)/*first time*/ { x->x_begmem_forw = (t_float *)getbytes(2 * (n+1) * sizeof(t_float)); x->x_blocksize = n; x->x_begmem_back = x->x_begmem_forw + n + 1; } else if(x->x_blocksize != n) { x->x_begmem_forw = (t_float *)resizebytes(x->x_begmem_forw, 2*(x->x_blocksize+1)*sizeof(t_float), 2*(n+1)*sizeof(t_float)); x->x_blocksize = n; x->x_begmem_back = x->x_begmem_forw + n +1; } if(n&15) dsp_add(spec2_1p1z_time_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_1p1z_time_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_1p1z_time_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)pd_new(spec2_1p1z_time_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_begmem_forw = (t_float *)0; if(argc >= 3) spec2_1p1z_time_tilde_list(x, s, argc, argv); else { x->x_a0 = 1.0f; x->x_a1 = 0.0f; x->x_b1 = 0.0f; } x->x_msi = 0.0f; return (x); } static void spec2_1p1z_time_tilde_free(t_spec2_1p1z_time_tilde *x) { if(x->x_begmem_forw) freebytes(x->x_begmem_forw, 2 * (x->x_blocksize+1) * sizeof(t_float)); } void spec2_1p1z_time_tilde_setup(void) { spec2_1p1z_time_tilde_class = class_new(gensym("spec2_1p1z_time~"), (t_newmethod)spec2_1p1z_time_tilde_new, (t_method)spec2_1p1z_time_tilde_free, sizeof(t_spec2_1p1z_time_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_1p1z_time_tilde_class, t_spec2_1p1z_time_tilde, x_msi); class_addlist(spec2_1p1z_time_tilde_class, (t_method)spec2_1p1z_time_tilde_list); class_addmethod(spec2_1p1z_time_tilde_class, (t_method)spec2_1p1z_time_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_1p1z_time_tilde_class, gensym("iemhelp2/spec2_1p1z_time~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_abs~.c0000600000000000000000000000432314665566711016046 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* ------------------------ spec2_abs_tilde~ ------------------------- */ static t_class *spec2_abs_tilde_class; typedef struct _spec2_abs_tilde { t_object x_obj; t_float x_msi; } t_spec2_abs_tilde; static t_int *spec2_abs_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; while(n--) { *in++ = fabs(*out++); } return(w+4); } static t_int *spec2_abs_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]; while(n) { in[0] = fabs(out[0]); in[1] = fabs(out[1]); in[2] = fabs(out[2]); in[3] = fabs(out[3]); in[4] = fabs(out[4]); in[5] = fabs(out[5]); in[6] = fabs(out[6]); in[7] = fabs(out[7]); in[8] = fabs(out[8]); in[9] = fabs(out[9]); in[10] = fabs(out[10]); in[11] = fabs(out[11]); in[12] = fabs(out[12]); in[13] = fabs(out[13]); in[14] = fabs(out[14]); in[15] = fabs(out[15]); in += 16; out += 16; n -= 16; } in[0] = fabs(out[0]); return(w+4); } static void spec2_abs_tilde_dsp(t_spec2_abs_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_abs_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); else dsp_add(spec2_abs_tilde_perf16, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_abs_tilde_new(void) { t_spec2_abs_tilde *x = (t_spec2_abs_tilde *)pd_new(spec2_abs_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_abs_tilde_setup(void) { spec2_abs_tilde_class = class_new(gensym("spec2_abs~"), (t_newmethod)spec2_abs_tilde_new, 0, sizeof(t_spec2_abs_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_abs_tilde_class, t_spec2_abs_tilde, x_msi); class_addmethod(spec2_abs_tilde_class, (t_method)spec2_abs_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_abs_tilde_class, gensym("iemhelp2/spec2_abs~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_add_scalar~.c0000600000000000000000000000546214665566711017363 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_add_scalar~ ------------------------------ */ static t_class *spec2_add_scalar_tilde_class; typedef struct _spec2_add_scalar_tilde { t_object x_obj; t_float x_f; t_float x_msi; } t_spec2_add_scalar_tilde; static void spec2_add_scalar_tilde_ft1(t_spec2_add_scalar_tilde *x, t_floatarg f) { x->x_f = f; } static t_int *spec2_add_scalar_tilde_perform(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)(w[2]); int i, n = (t_int)(w[3]); t_float f = x->x_f; for(i=0; i<=n; i++) { io[i] += f; } return(w+4); } static t_int *spec2_add_scalar_tilde_perf16(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)(w[2]); int n = (t_int)(w[3]); t_float f = x->x_f; while(n) { io[0] += f; io[1] += f; io[2] += f; io[3] += f; io[4] += f; io[5] += f; io[6] += f; io[7] += f; io[8] += f; io[9] += f; io[10] += f; io[11] += f; io[12] += f; io[13] += f; io[14] += f; io[15] += f; io += 16; n -= 16; } io[0] += f; return(w+4); } static void spec2_add_scalar_tilde_dsp(t_spec2_add_scalar_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_add_scalar_tilde_perform, 3, sp[0]->s_vec, x, n); else dsp_add(spec2_add_scalar_tilde_perf16, 3, sp[0]->s_vec, x, n); } static void *spec2_add_scalar_tilde_new(t_floatarg f) { t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)pd_new(spec2_add_scalar_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_f = f; x->x_msi = 0.0f; return (x); } static void spec2_add_scalar_tilde_free(t_spec2_add_scalar_tilde *x) { } void spec2_add_scalar_tilde_setup(void) { spec2_add_scalar_tilde_class = class_new(gensym("spec2_add_scalar~"), (t_newmethod)spec2_add_scalar_tilde_new, (t_method)spec2_add_scalar_tilde_free, sizeof(t_spec2_add_scalar_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)spec2_add_scalar_tilde_new, gensym("spec2+s~"), A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_add_scalar_tilde_class, t_spec2_add_scalar_tilde, x_msi); class_addmethod(spec2_add_scalar_tilde_class, (t_method)spec2_add_scalar_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(spec2_add_scalar_tilde_class, (t_method)spec2_add_scalar_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_add_scalar_tilde_class, gensym("iemhelp2/spec2_add_scalar~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_add~.c0000600000000000000000000000521114665566711016026 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_add~ ------------------------------ */ static t_class *spec2_add_tilde_class; typedef struct _spec2_add_tilde { t_object x_obj; t_float x_msi; } t_spec2_add_tilde; static t_int *spec2_add_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { out[i] = in1[i] + in2[i]; } return(w+5); } static t_int *spec2_add_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { out[0] = in1[0] + in2[0]; out[1] = in1[1] + in2[1]; out[2] = in1[2] + in2[2]; out[3] = in1[3] + in2[3]; out[4] = in1[4] + in2[4]; out[5] = in1[5] + in2[5]; out[6] = in1[6] + in2[6]; out[7] = in1[7] + in2[7]; out[8] = in1[8] + in2[8]; out[9] = in1[9] + in2[9]; out[10] = in1[10] + in2[10]; out[11] = in1[11] + in2[11]; out[12] = in1[12] + in2[12]; out[13] = in1[13] + in2[13]; out[14] = in1[14] + in2[14]; out[15] = in1[15] + in2[15]; in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] + in2[0]; return(w+5); } static void spec2_add_tilde_dsp(t_spec2_add_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_add_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_add_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_add_tilde_new(void) { t_spec2_add_tilde *x = (t_spec2_add_tilde *)pd_new(spec2_add_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_add_tilde_free(t_spec2_add_tilde *x) { } void spec2_add_tilde_setup(void) { spec2_add_tilde_class = class_new(gensym("spec2_add~"), (t_newmethod)spec2_add_tilde_new, (t_method)spec2_add_tilde_free, sizeof(t_spec2_add_tilde), 0, 0); class_addcreator((t_newmethod)spec2_add_tilde_new, gensym("spec2+~"), 0); CLASS_MAINSIGNALIN(spec2_add_tilde_class, t_spec2_add_tilde, x_msi); class_addmethod(spec2_add_tilde_class, (t_method)spec2_add_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_add_tilde_class, gensym("iemhelp2/spec2_add~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_block_delay~.c0000600000000000000000000000774214665566711017561 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_block_delay~ ------------------------------ */ static t_class *spec2_block_delay_tilde_class; typedef struct _spec2_block_delay_tilde { t_object x_obj; t_float *x_begmem; int x_blocksize; t_float x_msi; } t_spec2_block_delay_tilde; static t_int *spec2_block_delay_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float *rw_vec; rw_vec = x->x_begmem; for(i=0; i<=n; i++) { t_float f = in[i]; out[i] = rw_vec[i]; rw_vec[i] = f; } return(w+5); } static t_int *spec2_block_delay_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float *rw_vec, ff; rw_vec = x->x_begmem; while(n) { t_float f[16]; f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; f[8] = in[8]; f[9] = in[9]; f[10] = in[10]; f[11] = in[11]; f[12] = in[12]; f[13] = in[13]; f[14] = in[14]; f[15] = in[15]; out[0] = rw_vec[0]; out[1] = rw_vec[1]; out[2] = rw_vec[2]; out[3] = rw_vec[3]; out[4] = rw_vec[4]; out[5] = rw_vec[5]; out[6] = rw_vec[6]; out[7] = rw_vec[7]; out[8] = rw_vec[8]; out[9] = rw_vec[9]; out[10] = rw_vec[10]; out[11] = rw_vec[11]; out[12] = rw_vec[12]; out[13] = rw_vec[13]; out[14] = rw_vec[14]; out[15] = rw_vec[15]; rw_vec[0] = f[0]; rw_vec[1] = f[1]; rw_vec[2] = f[2]; rw_vec[3] = f[3]; rw_vec[4] = f[4]; rw_vec[5] = f[5]; rw_vec[6] = f[6]; rw_vec[7] = f[7]; rw_vec[8] = f[8]; rw_vec[9] = f[9]; rw_vec[10] = f[10]; rw_vec[11] = f[11]; rw_vec[12] = f[12]; rw_vec[13] = f[13]; rw_vec[14] = f[14]; rw_vec[15] = f[15]; rw_vec += 16; in += 16; out += 16; n -= 16; } ff = in[0]; out[0] = rw_vec[0]; rw_vec[0] = ff; return(w+5); } static void spec2_block_delay_tilde_dsp(t_spec2_block_delay_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize)/*first time*/ { x->x_begmem = (t_float *)getbytes((n+1) * sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_begmem = (t_float *)resizebytes(x->x_begmem, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } if(n&15) dsp_add(spec2_block_delay_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_block_delay_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_block_delay_tilde_new(void) { t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)pd_new(spec2_block_delay_tilde_class); x->x_blocksize = 0; x->x_begmem = (t_float *)0; outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_block_delay_tilde_free(t_spec2_block_delay_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, (x->x_blocksize+1) * sizeof(t_float)); } void spec2_block_delay_tilde_setup(void) { spec2_block_delay_tilde_class = class_new(gensym("spec2_block_delay~"), (t_newmethod)spec2_block_delay_tilde_new, (t_method)spec2_block_delay_tilde_free, sizeof(t_spec2_block_delay_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_block_delay_tilde_class, t_spec2_block_delay_tilde, x_msi); class_addmethod(spec2_block_delay_tilde_class, (t_method)spec2_block_delay_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_block_delay_tilde_class, gensym("iemhelp2/spec2_block_delay~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_clip_max~.c0000600000000000000000000000714514665566711017102 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_clip_max~ ------------------------------ */ static t_class *spec2_clip_max_tilde_class; typedef struct _spec2_clip_max_tilde { t_object x_obj; t_float x_msi; } t_spec2_clip_max_tilde; static t_int *spec2_clip_max_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *max = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { if(in[i] > max[i]) out[i] = max[i]; else out[i] = in[i]; } return(w+5); } static t_int *spec2_clip_max_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *max = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { if(in[0] > max[0]) out[0] = max[0]; else out[0] = in[0]; if(in[1] > max[1]) out[1] = max[1]; else out[1] = in[1]; if(in[2] > max[2]) out[2] = max[2]; else out[2] = in[2]; if(in[3] > max[3]) out[3] = max[3]; else out[3] = in[3]; if(in[4] > max[4]) out[4] = max[4]; else out[4] = in[4]; if(in[5] > max[5]) out[5] = max[5]; else out[5] = in[5]; if(in[6] > max[6]) out[6] = max[6]; else out[6] = in[6]; if(in[7] > max[7]) out[7] = max[7]; else out[7] = in[7]; if(in[8] > max[8]) out[8] = max[8]; else out[8] = in[8]; if(in[9] > max[9]) out[9] = max[9]; else out[9] = in[9]; if(in[10] > max[10]) out[10] = max[10]; else out[10] = in[10]; if(in[11] > max[11]) out[11] = max[11]; else out[11] = in[11]; if(in[12] > max[12]) out[12] = max[12]; else out[12] = in[12]; if(in[13] > max[13]) out[13] = max[13]; else out[13] = in[13]; if(in[14] > max[14]) out[14] = max[14]; else out[14] = in[14]; if(in[15] > max[15]) out[15] = max[15]; else out[15] = in[15]; in += 16; max += 16; out += 16; n -= 16; } if(in[0] > max[0]) out[0] = max[0]; else out[0] = in[0]; return(w+5); } static void spec2_clip_max_tilde_dsp(t_spec2_clip_max_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_clip_max_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_clip_max_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_clip_max_tilde_new(void) { t_spec2_clip_max_tilde *x = (t_spec2_clip_max_tilde *)pd_new(spec2_clip_max_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_clip_max_tilde_free(t_spec2_clip_max_tilde *x) { } void spec2_clip_max_tilde_setup(void) { spec2_clip_max_tilde_class = class_new(gensym("spec2_clip_max~"), (t_newmethod)spec2_clip_max_tilde_new, (t_method)spec2_clip_max_tilde_free, sizeof(t_spec2_clip_max_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_clip_max_tilde_class, t_spec2_clip_max_tilde, x_msi); class_addmethod(spec2_clip_max_tilde_class, (t_method)spec2_clip_max_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_clip_max_tilde_class, gensym("iemhelp2/spec2_clip_max~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_clip_min~.c0000600000000000000000000000714514665566711017100 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_clip_min~ ------------------------------ */ static t_class *spec2_clip_min_tilde_class; typedef struct _spec2_clip_min_tilde { t_object x_obj; t_float x_msi; } t_spec2_clip_min_tilde; static t_int *spec2_clip_min_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *min = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { if(in[i] < min[i]) out[i] = min[i]; else out[i] = in[i]; } return(w+5); } static t_int *spec2_clip_min_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *min = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { if(in[0] < min[0]) out[0] = min[0]; else out[0] = in[0]; if(in[1] < min[1]) out[1] = min[1]; else out[1] = in[1]; if(in[2] < min[2]) out[2] = min[2]; else out[2] = in[2]; if(in[3] < min[3]) out[3] = min[3]; else out[3] = in[3]; if(in[4] < min[4]) out[4] = min[4]; else out[4] = in[4]; if(in[5] < min[5]) out[5] = min[5]; else out[5] = in[5]; if(in[6] < min[6]) out[6] = min[6]; else out[6] = in[6]; if(in[7] < min[7]) out[7] = min[7]; else out[7] = in[7]; if(in[8] < min[8]) out[8] = min[8]; else out[8] = in[8]; if(in[9] < min[9]) out[9] = min[9]; else out[9] = in[9]; if(in[10] < min[10]) out[10] = min[10]; else out[10] = in[10]; if(in[11] < min[11]) out[11] = min[11]; else out[11] = in[11]; if(in[12] < min[12]) out[12] = min[12]; else out[12] = in[12]; if(in[13] < min[13]) out[13] = min[13]; else out[13] = in[13]; if(in[14] < min[14]) out[14] = min[14]; else out[14] = in[14]; if(in[15] < min[15]) out[15] = min[15]; else out[15] = in[15]; in += 16; min += 16; out += 16; n -= 16; } if(in[0] < min[0]) out[0] = min[0]; else out[0] = in[0]; return(w+5); } static void spec2_clip_min_tilde_dsp(t_spec2_clip_min_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_clip_min_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_clip_min_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_clip_min_tilde_new(void) { t_spec2_clip_min_tilde *x = (t_spec2_clip_min_tilde *)pd_new(spec2_clip_min_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_clip_min_tilde_free(t_spec2_clip_min_tilde *x) { } void spec2_clip_min_tilde_setup(void) { spec2_clip_min_tilde_class = class_new(gensym("spec2_clip_min~"), (t_newmethod)spec2_clip_min_tilde_new, (t_method)spec2_clip_min_tilde_free, sizeof(t_spec2_clip_min_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_clip_min_tilde_class, t_spec2_clip_min_tilde, x_msi); class_addmethod(spec2_clip_min_tilde_class, (t_method)spec2_clip_min_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_clip_min_tilde_class, gensym("iemhelp2/spec2_clip_min~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_dbtopow~.c0000600000000000000000000000337314665566711016763 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_dbtopow_tilde~ ------------------------- */ static t_class *spec2_dbtopow_tilde_class; typedef struct _spec2_dbtopow_tilde { t_object x_obj; t_float x_msi; } t_spec2_dbtopow_tilde; static t_int *spec2_dbtopow_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for (; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { if(f > 870.0f) f = 870.0f; *out = exp((SPEC2LOGTEN * 0.1f) * (f-100.0f)); } } return(w+4); } static void spec2_dbtopow_tilde_dsp(t_spec2_dbtopow_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_dbtopow_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_dbtopow_tilde_new(void) { t_spec2_dbtopow_tilde *x = (t_spec2_dbtopow_tilde *)pd_new(spec2_dbtopow_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_dbtopow_tilde_setup(void) { spec2_dbtopow_tilde_class = class_new(gensym("spec2_dbtopow~"), (t_newmethod)spec2_dbtopow_tilde_new, 0, sizeof(t_spec2_dbtopow_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_dbtopow_tilde_class, t_spec2_dbtopow_tilde, x_msi); class_addmethod(spec2_dbtopow_tilde_class, (t_method)spec2_dbtopow_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_dbtopow_tilde_class, gensym("iemhelp2/spec2_dbtopow~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_dbtorms~.c0000600000000000000000000000337414665566711016760 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_dbtorms_tilde~ ------------------------- */ static t_class *spec2_dbtorms_tilde_class; typedef struct _spec2_dbtorms_tilde { t_object x_obj; t_float x_msi; } t_spec2_dbtorms_tilde; static t_int *spec2_dbtorms_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for (; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { if(f > 485.0f) f = 485.0f; *out = exp((SPEC2LOGTEN * 0.05f) * (f-100.0f)); } } return(w+4); } static void spec2_dbtorms_tilde_dsp(t_spec2_dbtorms_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_dbtorms_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_dbtorms_tilde_new(void) { t_spec2_dbtorms_tilde *x = (t_spec2_dbtorms_tilde *)pd_new(spec2_dbtorms_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_dbtorms_tilde_setup(void) { spec2_dbtorms_tilde_class = class_new(gensym("spec2_dbtorms~"), (t_newmethod)spec2_dbtorms_tilde_new, 0, sizeof(t_spec2_dbtorms_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_dbtorms_tilde_class, t_spec2_dbtorms_tilde, x_msi); class_addmethod(spec2_dbtorms_tilde_class, (t_method)spec2_dbtorms_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_dbtorms_tilde_class, gensym("iemhelp2/spec2_dbtorms~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_matrix_bundle_stat~.c0000600000000000000000000001713614665566711021177 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* ---------- spec2_matrix_bundle_stat~ - signal matrix multiplication object with message matrix-coeff. ----------- */ typedef struct spec2_matrix_bundle_stat_tilde { t_object x_obj; int *x_matbuf; t_float **x_io; t_float *x_outsumbuf; int x_outsumbufsize; int x_n_in; /* columns */ int x_n_out; /* rows */ t_float x_msi; } t_spec2_matrix_bundle_stat_tilde; t_class *spec2_matrix_bundle_stat_tilde_class; static void spec2_matrix_bundle_stat_tilde_element(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { int inindex, outindex; int *matrix = x->x_matbuf; if(argc < 2) { post("spec2_matrix_bundle_stat~ : bad list: output_row_index input_col_index !"); return; } outindex = (int)atom_getint(argv); argv++; inindex = (int)atom_getint(argv) - 1; if(inindex >= x->x_n_in) inindex = x->x_n_in - 1; if(inindex < 0) inindex = 0; if(outindex >= x->x_n_out) outindex = x->x_n_out; if(outindex < 0) outindex = 0; matrix[inindex] = outindex; } static void spec2_matrix_bundle_stat_tilde_list(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { int outindex, i, n=x->x_n_in; int *matrix = x->x_matbuf; if(argc < n) { post("spec2_matrix_bundle_stat~ : bad list: (number_of_input_cols = %d) * output_row_index !", n); return; } for(i=0; i= x->x_n_out) outindex = x->x_n_out; if(outindex < 0) outindex = 0; matrix[i] = outindex; } } static void spec2_matrix_bundle_stat_tilde_bundle(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { spec2_matrix_bundle_stat_tilde_list(x, &s_list, argc, argv); } /* the dsp thing */ static t_int *spec2_matrix_bundle_stat_tilde_perform(t_int *w) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)(w[1]); int n = (int)(w[2]); t_float **io = x->x_io; t_float *outsum; int *mat = x->x_matbuf; int n_in = x->x_n_in; /* columns */ int n_out = x->x_n_out; /* rows */ t_float *in, *out; int i, j, thrw; outsum = x->x_outsumbuf; for(j=0; jx_outsumbuf + n*thrw; for(i=0; i<=n; i++) *outsum++ += *in++; } } outsum = x->x_outsumbuf; for(j=0; jx_io; t_float *outsum; int *mat = x->x_matbuf; int n_in = x->x_n_in; /* columns */ int n_out = x->x_n_out; /* rows */ t_float *in, *out; int i, j, thrw; for(j=0; jx_outsumbuf + j*(n+1); for(i=n; i; i -= 8, outsum += 8) { outsum[0] = 0.0f; outsum[1] = 0.0f; outsum[2] = 0.0f; outsum[3] = 0.0f; outsum[4] = 0.0f; outsum[5] = 0.0f; outsum[6] = 0.0f; outsum[7] = 0.0f; } outsum[0] = 0.0f; } for(j=0; jx_outsumbuf + (n+1)*thrw; for(i=n; i; i -= 8, outsum += 8, in += 8) { outsum[0] += in[0]; outsum[1] += in[1]; outsum[2] += in[2]; outsum[3] += in[3]; outsum[4] += in[4]; outsum[5] += in[5]; outsum[6] += in[6]; outsum[7] += in[7]; } outsum[0] += in[0]; } } for(j=0; jx_outsumbuf + j*(n+1); for (i=n; i; i -= 8, out += 8, outsum += 8) { out[0] = outsum[0]; out[1] = outsum[1]; out[2] = outsum[2]; out[3] = outsum[3]; out[4] = outsum[4]; out[5] = outsum[5]; out[6] = outsum[6]; out[7] = outsum[7]; } out[0] = outsum[0]; } return (w+3); } static void spec2_matrix_bundle_stat_tilde_dsp(t_spec2_matrix_bundle_stat_tilde *x, t_signal **sp) { int i, n=x->x_n_out*sp[0]->s_n/2; if(!x->x_outsumbuf) { x->x_outsumbufsize = n; x->x_outsumbuf = (t_float *)getbytes((x->x_outsumbufsize+x->x_n_out) * sizeof(t_float)); } else if(x->x_outsumbufsize != n) { x->x_outsumbuf = (t_float *)resizebytes(x->x_outsumbuf, (x->x_outsumbufsize+x->x_n_out)*sizeof(t_float), (n+x->x_n_out)*sizeof(t_float)); x->x_outsumbufsize = n; } n = x->x_n_in + x->x_n_out; for(i=0; ix_io[i] = sp[i]->s_vec; /*post("iovec_addr = %d", (unsigned int)x->x_io[i]);*/ } n = sp[0]->s_n/2; if(n&7) dsp_add(spec2_matrix_bundle_stat_tilde_perform, 2, x, n); else dsp_add(spec2_matrix_bundle_stat_tilde_perf8, 2, x, n); } /* setup/setdown things */ static void spec2_matrix_bundle_stat_tilde_free(t_spec2_matrix_bundle_stat_tilde *x) { freebytes(x->x_matbuf, x->x_n_in * sizeof(int)); freebytes(x->x_io, (x->x_n_in + x->x_n_out) * sizeof(t_float *)); if(x->x_outsumbuf) freebytes(x->x_outsumbuf, (x->x_outsumbufsize+1) * sizeof(t_float)); } static void *spec2_matrix_bundle_stat_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)pd_new(spec2_matrix_bundle_stat_tilde_class); int i; switch (argc) { case 0: x->x_n_in = x->x_n_out = 1; break; case 1: x->x_n_in = x->x_n_out = (int)atom_getint(argv); break; default: x->x_n_in = (int)atom_getint(argv); x->x_n_out = (int)atom_getint(argv+1); break; } if(x->x_n_in < 1) x->x_n_in = 1; if(x->x_n_out < 1) x->x_n_out = 1; i = x->x_n_in - 1; while(i--) inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); i = x->x_n_out; while(i--) outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_outsumbuf = (t_float *)0; x->x_outsumbufsize = 0; x->x_matbuf = (int *)getbytes(x->x_n_in * sizeof(int)); x->x_io = (t_float **)getbytes((x->x_n_in + x->x_n_out) * sizeof(t_float *)); return (x); } void spec2_matrix_bundle_stat_tilde_setup(void) { spec2_matrix_bundle_stat_tilde_class = class_new(gensym("spec2_matrix_bundle_stat~"), (t_newmethod)spec2_matrix_bundle_stat_tilde_new, (t_method)spec2_matrix_bundle_stat_tilde_free, sizeof(t_spec2_matrix_bundle_stat_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_matrix_bundle_stat_tilde_class, t_spec2_matrix_bundle_stat_tilde, x_msi); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addlist(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_list); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_element, gensym("element"), A_GIMME, 0); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_bundle, gensym("bundle"), A_GIMME, 0); // class_sethelpsymbol(spec2_matrix_bundle_stat_tilde_class, gensym("iemhelp2/spec2_matrix_bundle_stat~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_mul_scalar~.c0000600000000000000000000000546114665566711017427 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_mul_scalar~ ------------------------------ */ static t_class *spec2_mul_scalar_tilde_class; typedef struct _spec2_mul_scalar_tilde { t_object x_obj; t_float x_f; t_float x_msi; } t_spec2_mul_scalar_tilde; static void spec2_mul_scalar_tilde_ft1(t_spec2_mul_scalar_tilde *x, t_floatarg f) { x->x_f = f; } static t_int *spec2_mul_scalar_tilde_perform(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)(w[2]); int i, n = (t_int)(w[3]); t_float f = x->x_f; for(i=0; i<=n; i++) { io[i] *= f; } return(w+4); } static t_int *spec2_mul_scalar_tilde_perf16(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)(w[2]); int n = (t_int)(w[3]); t_float f = x->x_f; while(n) { io[0] *= f; io[1] *= f; io[2] *= f; io[3] *= f; io[4] *= f; io[5] *= f; io[6] *= f; io[7] *= f; io[8] *= f; io[9] *= f; io[10] *= f; io[11] *= f; io[12] *= f; io[13] *= f; io[14] *= f; io[15] *= f; io += 16; n -= 16; } io[0] *= f; return(w+4); } static void spec2_mul_scalar_tilde_dsp(t_spec2_mul_scalar_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_mul_scalar_tilde_perform, 3, sp[0]->s_vec, x, n); else dsp_add(spec2_mul_scalar_tilde_perf16, 3, sp[0]->s_vec, x, n); } static void *spec2_mul_scalar_tilde_new(t_floatarg f) { t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)pd_new(spec2_mul_scalar_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_f = f; x->x_msi = 0.0f; return (x); } static void spec2_mul_scalar_tilde_free(t_spec2_mul_scalar_tilde *x) { } void spec2_mul_scalar_tilde_setup(void) { spec2_mul_scalar_tilde_class = class_new(gensym("spec2_mul_scalar~"), (t_newmethod)spec2_mul_scalar_tilde_new, (t_method)spec2_mul_scalar_tilde_free, sizeof(t_spec2_mul_scalar_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)spec2_mul_scalar_tilde_new, gensym("spec2*s~"), A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_mul_scalar_tilde_class, t_spec2_mul_scalar_tilde, x_msi); class_addmethod(spec2_mul_scalar_tilde_class, (t_method)spec2_mul_scalar_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(spec2_mul_scalar_tilde_class, (t_method)spec2_mul_scalar_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_mul_scalar_tilde_class, gensym("iemhelp2/spec2_mul_scalar~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_mul~.c0000600000000000000000000000521014665566711016072 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_mul~ ------------------------------ */ static t_class *spec2_mul_tilde_class; typedef struct _spec2_mul_tilde { t_object x_obj; t_float x_msi; } t_spec2_mul_tilde; static t_int *spec2_mul_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { out[i] = in1[i] * in2[i]; } return(w+5); } static t_int *spec2_mul_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { out[0] = in1[0] * in2[0]; out[1] = in1[1] * in2[1]; out[2] = in1[2] * in2[2]; out[3] = in1[3] * in2[3]; out[4] = in1[4] * in2[4]; out[5] = in1[5] * in2[5]; out[6] = in1[6] * in2[6]; out[7] = in1[7] * in2[7]; out[8] = in1[8] * in2[8]; out[9] = in1[9] * in2[9]; out[10] = in1[10] * in2[10]; out[11] = in1[11] * in2[11]; out[12] = in1[12] * in2[12]; out[13] = in1[13] * in2[13]; out[14] = in1[14] * in2[14]; out[15] = in1[15] * in2[15]; in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] * in2[0]; return(w+5); } static void spec2_mul_tilde_dsp(t_spec2_mul_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_mul_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_mul_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_mul_tilde_new(void) { t_spec2_mul_tilde *x = (t_spec2_mul_tilde *)pd_new(spec2_mul_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_mul_tilde_free(t_spec2_mul_tilde *x) { } void spec2_mul_tilde_setup(void) { spec2_mul_tilde_class = class_new(gensym("spec2_mul~"), (t_newmethod)spec2_mul_tilde_new, (t_method)spec2_mul_tilde_free, sizeof(t_spec2_mul_tilde), 0, 0); class_addcreator((t_newmethod)spec2_mul_tilde_new, gensym("spec2*~"), 0); CLASS_MAINSIGNALIN(spec2_mul_tilde_class, t_spec2_mul_tilde, x_msi); class_addmethod(spec2_mul_tilde_class, (t_method)spec2_mul_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_mul_tilde_class, gensym("iemhelp2/spec2_mul~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_powtodb~.c0000600000000000000000000000336614665566711016765 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_powtodb_tilde~ ------------------------- */ static t_class *spec2_powtodb_tilde_class; typedef struct _spec2_powtodb_tilde { t_object x_obj; t_float x_msi; } t_spec2_powtodb_tilde; static t_int *spec2_powtodb_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for(; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { t_float g = 100.0f + 10.0f/SPEC2LOGTEN * log(f); *out = (g < 0.0f ? 0.0f : g); } } return(w+4); } static void spec2_powtodb_tilde_dsp(t_spec2_powtodb_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_powtodb_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_powtodb_tilde_new(void) { t_spec2_powtodb_tilde *x = (t_spec2_powtodb_tilde *)pd_new(spec2_powtodb_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_powtodb_tilde_setup(void) { spec2_powtodb_tilde_class = class_new(gensym("spec2_powtodb~"), (t_newmethod)spec2_powtodb_tilde_new, 0, sizeof(t_spec2_powtodb_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_powtodb_tilde_class, t_spec2_powtodb_tilde, x_msi); class_addmethod(spec2_powtodb_tilde_class, (t_method)spec2_powtodb_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_powtodb_tilde_class, gensym("iemhelp2/spec2_powtodb~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_rmstodb~.c0000600000000000000000000000336714665566711016762 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include #define SPEC2LOGTEN 2.302585092994f /* ------------------------ spec2_rmstodb_tilde~ ------------------------- */ static t_class *spec2_rmstodb_tilde_class; typedef struct _spec2_rmstodb_tilde { t_object x_obj; t_float x_msi; } t_spec2_rmstodb_tilde; static t_int *spec2_rmstodb_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; for(; n--; in++, out++) { t_float f = *in; if(f <= 0.0f) *out = 0.0f; else { t_float g = 100.0f + 20.0f/SPEC2LOGTEN * log(f); *out = (g < 0.0f ? 0.0f : g); } } return(w+4); } static void spec2_rmstodb_tilde_dsp(t_spec2_rmstodb_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_rmstodb_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_rmstodb_tilde_new(void) { t_spec2_rmstodb_tilde *x = (t_spec2_rmstodb_tilde *)pd_new(spec2_rmstodb_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_rmstodb_tilde_setup(void) { spec2_rmstodb_tilde_class = class_new(gensym("spec2_rmstodb~"), (t_newmethod)spec2_rmstodb_tilde_new, 0, sizeof(t_spec2_rmstodb_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_rmstodb_tilde_class, t_spec2_rmstodb_tilde, x_msi); class_addmethod(spec2_rmstodb_tilde_class, (t_method)spec2_rmstodb_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_rmstodb_tilde_class, gensym("iemhelp2/spec2_rmstodb~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_shift~.c0000600000000000000000000000562114665566711016420 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_shift~ - shift spectral bins to left (lower, negative) or to right (higher, positiv) --- */ typedef struct spec2_shift_tilde { t_object x_obj; int x_blocksize; t_float x_add; t_float *x_spec; t_float x_msi; } t_spec2_shift_tilde; t_class *spec2_shift_tilde_class; static t_int *spec2_shift_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_shift_tilde *x = (t_spec2_shift_tilde *)(w[3]); int i, j, n = (t_int)(w[4])+1; t_float *spec=x->x_spec; t_float add=x->x_add; if((add >= n) || (add <= -n)) { for(i=0; i= 0) { for(i=0; ix_add = add; } static void spec2_shift_tilde_dsp(t_spec2_shift_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes((n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_shift_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_shift_tilde_new(t_floatarg add) { t_spec2_shift_tilde *x = (t_spec2_shift_tilde *)pd_new(spec2_shift_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_add = add; x->x_spec = (t_float *)0; return (x); } static void spec2_shift_tilde_free(t_spec2_shift_tilde *x) { if(x->x_spec) freebytes(x->x_spec, (x->x_blocksize+1) * sizeof(t_float)); } void spec2_shift_tilde_setup(void) { spec2_shift_tilde_class = class_new(gensym("spec2_shift~"), (t_newmethod)spec2_shift_tilde_new, 0, sizeof(t_spec2_shift_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_shift_tilde_class, t_spec2_shift_tilde, x_msi); class_addmethod(spec2_shift_tilde_class, (t_method)spec2_shift_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addfloat(spec2_shift_tilde_class, (t_method)spec2_shift_tilde_add); // class_sethelpsymbol(spec2_shift_tilde_class, gensym("iemhelp/spec2_shift~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_sqrt~.c0000600000000000000000000000326314665566711016274 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include /* ------------------------ spec2_sqrt_tilde~ ------------------------- */ static t_class *spec2_sqrt_tilde_class; typedef struct _spec2_sqrt_tilde { t_object x_obj; t_float x_msi; } t_spec2_sqrt_tilde; static t_int *spec2_sqrt_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; while(n--) { t_sample f = *in++; if (f<0.0) { *out++=0.0; } else { #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43)) t_float g = q8_rsqrt(f); *out++ = f*g*(1.5 - 0.5 * g * g * f); #else *out++ = sqrt(f); #endif } } return(w+4); } static void spec2_sqrt_tilde_dsp(t_spec2_sqrt_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; dsp_add(spec2_sqrt_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_sqrt_tilde_new(void) { t_spec2_sqrt_tilde *x = (t_spec2_sqrt_tilde *)pd_new(spec2_sqrt_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_sqrt_tilde_setup(void) { spec2_sqrt_tilde_class = class_new(gensym("spec2_sqrt~"), (t_newmethod)spec2_sqrt_tilde_new, 0, sizeof(t_spec2_sqrt_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_sqrt_tilde_class, t_spec2_sqrt_tilde, x_msi); class_addmethod(spec2_sqrt_tilde_class, (t_method)spec2_sqrt_tilde_dsp, gensym("dsp"), A_CANT, 0); } iem_utils-0.0.20240903/iem_spec2/src/spec2_stretch~.c0000600000000000000000000000552314665566711016760 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_stretch~ - stretch spectral bins --- */ typedef struct spec2_stretch_tilde { t_object x_obj; int x_blocksize; t_float x_mul; t_float *x_spec; t_float x_msi; } t_spec2_stretch_tilde; t_class *spec2_stretch_tilde_class; static t_int *spec2_stretch_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_stretch_tilde *x = (t_spec2_stretch_tilde *)(w[3]); int i, j, m, n = (t_int)(w[4])+1; t_float yn0, yn1, fract; t_float *spec=x->x_spec; t_float mul=x->x_mul; t_float rcp_mul = 1.0f / mul; for(i=0; i n) m = n; for(i=0; ix_mul = mul; } static void spec2_stretch_tilde_dsp(t_spec2_stretch_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes((n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_stretch_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void *spec2_stretch_tilde_new(t_floatarg mul) { t_spec2_stretch_tilde *x = (t_spec2_stretch_tilde *)pd_new(spec2_stretch_tilde_class); outlet_new(&x->x_obj, &s_signal); if(mul <= 0.0f) mul = 1.0f; x->x_blocksize = 0; x->x_mul = mul; x->x_spec = (t_float *)0; return (x); } static void spec2_stretch_tilde_free(t_spec2_stretch_tilde *x) { if(x->x_spec) freebytes(x->x_spec, (x->x_blocksize+1) * sizeof(t_float)); } void spec2_stretch_tilde_setup(void) { spec2_stretch_tilde_class = class_new(gensym("spec2_stretch~"), (t_newmethod)spec2_stretch_tilde_new, 0, sizeof(t_spec2_stretch_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_stretch_tilde_class, t_spec2_stretch_tilde, x_msi); class_addmethod(spec2_stretch_tilde_class, (t_method)spec2_stretch_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addfloat(spec2_stretch_tilde_class, (t_method)spec2_stretch_tilde_mul); // class_sethelpsymbol(spec2_stretch_tilde_class, gensym("iemhelp/spec2_stretch~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_sub~.c0000600000000000000000000000521014665566711016066 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* -------------------------- spec2_sub~ ------------------------------ */ static t_class *spec2_sub_tilde_class; typedef struct _spec2_sub_tilde { t_object x_obj; t_float x_msi; } t_spec2_sub_tilde; static t_int *spec2_sub_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]); for(i=0; i<=n; i++) { out[i] = in1[i] - in2[i]; } return(w+5); } static t_int *spec2_sub_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]); while(n) { out[0] = in1[0] - in2[0]; out[1] = in1[1] - in2[1]; out[2] = in1[2] - in2[2]; out[3] = in1[3] - in2[3]; out[4] = in1[4] - in2[4]; out[5] = in1[5] - in2[5]; out[6] = in1[6] - in2[6]; out[7] = in1[7] - in2[7]; out[8] = in1[8] - in2[8]; out[9] = in1[9] - in2[9]; out[10] = in1[10] - in2[10]; out[11] = in1[11] - in2[11]; out[12] = in1[12] - in2[12]; out[13] = in1[13] - in2[13]; out[14] = in1[14] - in2[14]; out[15] = in1[15] - in2[15]; in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] - in2[0]; return(w+5); } static void spec2_sub_tilde_dsp(t_spec2_sub_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_sub_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_sub_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); } static void *spec2_sub_tilde_new(void) { t_spec2_sub_tilde *x = (t_spec2_sub_tilde *)pd_new(spec2_sub_tilde_class); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } static void spec2_sub_tilde_free(t_spec2_sub_tilde *x) { } void spec2_sub_tilde_setup(void) { spec2_sub_tilde_class = class_new(gensym("spec2_sub~"), (t_newmethod)spec2_sub_tilde_new, (t_method)spec2_sub_tilde_free, sizeof(t_spec2_sub_tilde), 0, 0); class_addcreator((t_newmethod)spec2_sub_tilde_new, gensym("spec2-~"), 0); CLASS_MAINSIGNALIN(spec2_sub_tilde_class, t_spec2_sub_tilde, x_msi); class_addmethod(spec2_sub_tilde_class, (t_method)spec2_sub_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_sub_tilde_class, gensym("iemhelp2/spec2_sub~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_sum~.c0000600000000000000000000000513414665566711016106 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" /* ------------------------ spec2_sum_tilde~ ------------------------- */ static t_class *spec2_sum_tilde_class; typedef struct _spec2_sum_tilde { t_object x_obj; t_float x_msi; } t_spec2_sum_tilde; static t_int *spec2_sum_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float sum = 0.0f; int n, hn; n = hn = w[3]; sum = *in++; while(n--) sum += (*in++)*2.0f; while(hn--) *out++ = sum; *out++ = sum; return(w+4); } static t_int *spec2_sum_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float sum=0.0f; int n, hn; n = hn = w[3]; sum = *in++; while(n) { sum += 2.0f*in[0]; sum += 2.0f*in[1]; sum += 2.0f*in[2]; sum += 2.0f*in[3]; sum += 2.0f*in[4]; sum += 2.0f*in[5]; sum += 2.0f*in[6]; sum += 2.0f*in[7]; sum += 2.0f*in[8]; sum += 2.0f*in[9]; sum += 2.0f*in[10]; sum += 2.0f*in[11]; sum += 2.0f*in[12]; sum += 2.0f*in[13]; sum += 2.0f*in[14]; sum += 2.0f*in[15]; in += 16; n -= 16; } while(hn) { out[0] = sum; out[1] = sum; out[2] = sum; out[3] = sum; out[4] = sum; out[5] = sum; out[6] = sum; out[7] = sum; out[8] = sum; out[9] = sum; out[10] = sum; out[11] = sum; out[12] = sum; out[13] = sum; out[14] = sum; out[15] = sum; out += 16; hn -= 16; } out[0] = sum; return(w+4); } static void spec2_sum_tilde_dsp(t_spec2_sum_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; if(n&15) dsp_add(spec2_sum_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); else dsp_add(spec2_sum_tilde_perf16, 3, sp[0]->s_vec, sp[0]->s_vec, n); } static void *spec2_sum_tilde_new(void) { t_spec2_sum_tilde *x = (t_spec2_sum_tilde *)pd_new(spec2_sum_tilde_class); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); } void spec2_sum_tilde_setup(void) { spec2_sum_tilde_class = class_new(gensym("spec2_sum~"), (t_newmethod)spec2_sum_tilde_new, 0, sizeof(t_spec2_sum_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_sum_tilde_class, t_spec2_sum_tilde, x_msi); class_addmethod(spec2_sum_tilde_class, (t_method)spec2_sum_tilde_dsp, gensym("dsp"), A_CANT, 0); // class_sethelpsymbol(spec2_sum_tilde_class, gensym("iemhelp2/spec2_sum~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_tab_conv~.c0000600000000000000000000001020014665566711017063 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" /* -- spec2_tab_conv~ - convolute a spectrum with a table --- */ typedef struct spec2_tab_conv_tilde { t_object x_obj; t_float *x_spec; iemarray_t *x_beg_array; int x_blocksize; int x_winsize; int x_has_changed; t_symbol *x_sym_array; t_float x_msi; } t_spec2_tab_conv_tilde; t_class *spec2_tab_conv_tilde_class; static void spec2_tab_conv_tilde_set(t_spec2_tab_conv_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 2) && IS_A_SYMBOL(argv, 0) && IS_A_FLOAT(argv, 1)) { x->x_sym_array = (t_symbol *)(atom_getsymbol(argv)); x->x_winsize = (int)(atom_getint(argv+1)); x->x_has_changed = 1; } } static t_int *spec2_tab_conv_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_tab_conv_tilde *x = (t_spec2_tab_conv_tilde *)(w[3]); t_float sum=0.0f; t_float *vec1, *vec2, *vec3; iemarray_t*win; int i, m, n = (int)(w[4])+1; int j, ws=x->x_winsize; vec2 = x->x_spec + n; vec1 = vec2; vec3 = vec2 + 2*n - 2; for(i=0; ix_spec + n - ws/2; win = x->x_beg_array; for(i=0; is_n)/2; t_garray *a; int n_points; if(x->x_has_changed) { x->x_has_changed = 0; if(!(a = (t_garray *)pd_findbyclass(x->x_sym_array, garray_class))) { if(*x->x_sym_array->s_name) pd_error(x, "spec2_tab_conv~: %s: no such array", x->x_sym_array->s_name); } else if(!iemarray_getarray(a, &n_points, &x->x_beg_array)) pd_error(x, "%s: bad template for spec2_tab_conv~", x->x_sym_array->s_name); else { if(n_points > (n+1)) n_points = n+1; if(x->x_winsize < 0) x->x_winsize = 0; if(x->x_winsize > n_points) x->x_winsize = n_points; } } if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes(3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, 3*(x->x_blocksize+1)*sizeof(t_float), 3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_tab_conv_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } static void spec2_tab_conv_tilde_free(t_spec2_tab_conv_tilde *x) { if(x->x_spec) freebytes(x->x_spec, 3*(x->x_blocksize+1)*sizeof(t_float)); } static void *spec2_tab_conv_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_tab_conv_tilde *x = (t_spec2_tab_conv_tilde *)pd_new(spec2_tab_conv_tilde_class); if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_FLOAT(argv,1)) { x->x_sym_array = (t_symbol *)(atom_getsymbol(argv)); x->x_winsize = (int)(atom_getint(argv+1)); x->x_spec = (t_float *)0; x->x_beg_array = (iemarray_t *)0; x->x_blocksize = 0; x->x_has_changed = 1; outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return(x); } else { post("spec2_tab_conv~-ERROR: needs 2 args: convolution-array-name + convolution-array-size !!!"); return(0); } } void spec2_tab_conv_tilde_setup(void) { spec2_tab_conv_tilde_class = class_new(gensym("spec2_tab_conv~"), (t_newmethod)spec2_tab_conv_tilde_new, (t_method)spec2_tab_conv_tilde_free, sizeof(t_spec2_tab_conv_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_tab_conv_tilde_class, t_spec2_tab_conv_tilde, x_msi); class_addmethod(spec2_tab_conv_tilde_class, (t_method)spec2_tab_conv_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addmethod(spec2_tab_conv_tilde_class, (t_method)spec2_tab_conv_tilde_set, gensym("set"), A_GIMME, 0); // class_sethelpsymbol(spec2_tab_conv_tilde_class, gensym("iemhelp/spec2_tab_conv~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_tabreceive_enable~.c0000600000000000000000000001125014665566711020715 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" /* ------------------------ spec2_tabreceive_enable~ ------------------------- */ static t_class *spec2_tabreceive_enable_tilde_class; typedef struct _spec2_tabreceive_enable_tilde { t_object x_obj; iemarray_t *x_vec; t_symbol *x_arrayname; int x_enable; } t_spec2_tabreceive_enable_tilde; static void spec2_tabreceive_enable_tilde_symbol(t_spec2_tabreceive_enable_tilde *x, t_symbol *s) { x->x_arrayname = s; } static void spec2_tabreceive_enable_tilde_float(t_spec2_tabreceive_enable_tilde *x, t_floatarg f) { int i=(int)f; if(i) i = 1; x->x_enable = i; } static t_int *spec2_tabreceive_enable_tilde_perform(t_int *w) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1, i; iemarray_t *vec = x->x_vec; if(vec && x->x_enable) { for(i=0; ix_vec; if(vec && x->x_enable) { while(n) { out[0] = iemarray_getfloat(vec, 0); out[1] = iemarray_getfloat(vec, 1); out[2] = iemarray_getfloat(vec, 2); out[3] = iemarray_getfloat(vec, 3); out[4] = iemarray_getfloat(vec, 4); out[5] = iemarray_getfloat(vec, 5); out[6] = iemarray_getfloat(vec, 6); out[7] = iemarray_getfloat(vec, 7); out[8] = iemarray_getfloat(vec, 8); out[9] = iemarray_getfloat(vec, 9); out[10] = iemarray_getfloat(vec, 10); out[11] = iemarray_getfloat(vec, 11); out[12] = iemarray_getfloat(vec, 12); out[13] = iemarray_getfloat(vec, 13); out[14] = iemarray_getfloat(vec, 14); out[15] = iemarray_getfloat(vec, 15); vec += 16; out += 16; n -= 16; } out[0] = iemarray_getfloat(vec, 0); } else { while(n) { out[0] = 0.0f; out[1] = 0.0f; out[2] = 0.0f; out[3] = 0.0f; out[4] = 0.0f; out[5] = 0.0f; out[6] = 0.0f; out[7] = 0.0f; out[8] = 0.0f; out[9] = 0.0f; out[10] = 0.0f; out[11] = 0.0f; out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 0.0f; out += 16; n -= 16; } out[0] = 0.0f; } return(w+4); } static void spec2_tabreceive_enable_tilde_dsp(t_spec2_tabreceive_enable_tilde *x, t_signal **sp) { t_garray *a; int vecsize; if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) pd_error(x, "spec2_tabreceive_enable~: %s: no such array", x->x_arrayname->s_name); } else if(!iemarray_getarray(a, &vecsize, &x->x_vec)) pd_error(x, "%s: bad template for spec2_tabreceive_enable~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; if(n < vecsize) vecsize = n; vecsize /= 2; if(vecsize&15) dsp_add(spec2_tabreceive_enable_tilde_perform, 3, x, sp[0]->s_vec, vecsize); else dsp_add(spec2_tabreceive_enable_tilde_perf16, 3, x, sp[0]->s_vec, vecsize); } } static void *spec2_tabreceive_enable_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)pd_new(spec2_tabreceive_enable_tilde_class); x->x_enable = 0; if((argc >= 1) && IS_A_SYMBOL(argv,0)) x->x_arrayname = atom_getsymbolarg(0, argc, argv); if((argc >= 2) && IS_A_FLOAT(argv,1)) x->x_enable = (int)atom_getintarg(1, argc, argv); if(x->x_enable) x->x_enable = 1; outlet_new(&x->x_obj, &s_signal); return (x); } void spec2_tabreceive_enable_tilde_setup(void) { spec2_tabreceive_enable_tilde_class = class_new(gensym("spec2_tabreceive_enable~"), (t_newmethod)spec2_tabreceive_enable_tilde_new, 0, sizeof(t_spec2_tabreceive_enable_tilde), 0, A_GIMME, 0); class_addmethod(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addsymbol(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_symbol); class_addfloat(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_float); // class_sethelpsymbol(spec2_tabreceive_enable_tilde_class, gensym("iemhelp2/spec2_tabreceive_enable~-help")); } iem_utils-0.0.20240903/iem_spec2/src/spec2_tabreceive~.c0000600000000000000000000000756314665566711017423 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" /* ------------------------ spec2_tabreceive~ ------------------------- */ static t_class *spec2_tabreceive_tilde_class; typedef struct _spec2_tabreceive_tilde { t_object x_obj; iemarray_t *x_vec; t_symbol *x_arrayname; } t_spec2_tabreceive_tilde; static void spec2_tabreceive_tilde_symbol(t_spec2_tabreceive_tilde *x, t_symbol *s) { x->x_arrayname = s; } static t_int *spec2_tabreceive_tilde_perform(t_int *w) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1, i; iemarray_t *vec = x->x_vec; if(vec) { for(i=0; ix_vec; if(vec) { while(n) { out[0] = iemarray_getfloat(vec, 0); out[1] = iemarray_getfloat(vec, 1); out[2] = iemarray_getfloat(vec, 2); out[3] = iemarray_getfloat(vec, 3); out[4] = iemarray_getfloat(vec, 4); out[5] = iemarray_getfloat(vec, 5); out[6] = iemarray_getfloat(vec, 6); out[7] = iemarray_getfloat(vec, 7); out[8] = iemarray_getfloat(vec, 8); out[9] = iemarray_getfloat(vec, 9); out[10] = iemarray_getfloat(vec, 10); out[11] = iemarray_getfloat(vec, 11); out[12] = iemarray_getfloat(vec, 12); out[13] = iemarray_getfloat(vec, 13); out[14] = iemarray_getfloat(vec, 14); out[15] = iemarray_getfloat(vec, 15); vec += 16; out += 16; n -= 16; } out[0] = iemarray_getfloat(vec, 0); } else { while(n) { out[0] = 0.0f; out[1] = 0.0f; out[2] = 0.0f; out[3] = 0.0f; out[4] = 0.0f; out[5] = 0.0f; out[6] = 0.0f; out[7] = 0.0f; out[8] = 0.0f; out[9] = 0.0f; out[10] = 0.0f; out[11] = 0.0f; out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 0.0f; out += 16; n -= 16; } out[0] = 0.0f; } return(w+4); } static void spec2_tabreceive_tilde_dsp(t_spec2_tabreceive_tilde *x, t_signal **sp) { t_garray *a; int vecsize; if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) pd_error(x, "spec2_tabreceive~: %s: no such array", x->x_arrayname->s_name); } else if(!iemarray_getarray(a, &vecsize, &x->x_vec)) pd_error(x, "%s: bad template for spec2_tabreceive~", x->x_arrayname->s_name); else { int n = sp[0]->s_n; if(n < vecsize) vecsize = n; vecsize /= 2; if(vecsize&15) dsp_add(spec2_tabreceive_tilde_perform, 3, x, sp[0]->s_vec, vecsize); else dsp_add(spec2_tabreceive_tilde_perf16, 3, x, sp[0]->s_vec, vecsize); } } static void *spec2_tabreceive_tilde_new(t_symbol *s) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)pd_new(spec2_tabreceive_tilde_class); x->x_arrayname = s; outlet_new(&x->x_obj, &s_signal); return (x); } void spec2_tabreceive_tilde_setup(void) { spec2_tabreceive_tilde_class = class_new(gensym("spec2_tabreceive~"), (t_newmethod)spec2_tabreceive_tilde_new, 0, sizeof(t_spec2_tabreceive_tilde), 0, A_DEFSYM, 0); class_addmethod(spec2_tabreceive_tilde_class, (t_method)spec2_tabreceive_tilde_dsp, gensym("dsp"), A_CANT, 0); class_addsymbol(spec2_tabreceive_tilde_class, (t_method)spec2_tabreceive_tilde_symbol); // class_sethelpsymbol(spec2_tabreceive_tilde_class, gensym("iemhelp/spec2_tabreceive~-help")); } iem_utils-0.0.20240903/iem_tab/0000700000000000000000000000000014665566711012602 5ustar00iem_utils-0.0.20240903/iem_tab/CONTENT.txt0000600000000000000000000001116114665566711014457 0ustar00 content of iem_tab Release 1.21 from March 2018 -------------------- table or array stuff ------------------------------- tab_abs calculates the absolute value of every sample within begin- and end-index tab_add calculates the sum of every sample of 2 tables within begin- and end-index tab_add_scalar calculates the sum of every sample with a scalar value within begin- and end-index tab_carth2polar converts the samples of 2 tables read as carthesian coordinates within begin- and end-index into samples read as polar coordinates tab_complex_inv calculates the complex inversion of every sample of 2 tables within begin- and end-index tab_complex_mul calculates the complex product of every sample of 4 tables within begin- and end-index tab_const sets the content of a table to a scalar value within begin- and end-index tab_conv calculates the convolution of 2 tables within begin- and end-index tab_copy copies the content from one to an other table within begin- and end-index tab_counter increments every sample of destination table in dependency of every sample of the source table within begin- and end-index (if source sample not equal zero then increment destination sample else reset destination sample) tab_cross_corr calculates the cross-correlation of 2 tables within begin- and end-index tab_dbtopow calculates the square value of every midi-db-sample within begin- and end-index tab_dbtorms calculates the root-mean-square value of every midi-db-sample within begin- and end-index tab_div calculates the ratio of every sample of 2 tables within begin- and end-index tab_eq calculates the equal comparsion of every sample of 2 tables within begin- and end-index tab_eq_scalar calculates the equal comparsion of every sample with a scalar value within begin- and end-index tab_fft calculates the complex fourier transformation of 2 tables within begin- and end-index tab_find_exact_peaks calculates the same as tab_find_peaks below (work in progress) tab_find_peaks calculates lists of every relative maximum in a tables within begin- and end-index, the list contains the peak-sorted index, the table-index and the maximum value of a peak tab_ge calculates the greater-equal comparsion of every sample of 2 tables within begin- and end-index tab_ge_scalar calculates the greater-equal comparsion of every sample with a scalar value within begin- and end-index tab_gt calculates the greater-than comparsion of every sample of 2 tables within begin- and end-index tab_gt_scalar calculates the greater-than comparsion of every sample with a scalar value within begin- and end-index tab_get_size calculates the size of a table tab_ifft calculates the complex inverse fourier transformation of 2 tables within begin- and end-index tab_le calculates the less-equal comparsion of every sample of 2 tables within begin- and end-index tab_le_scalar calculates the less-equal comparsion of every sample with a scalar value within begin- and end-index tab_lt calculates the less-than comparsion of every sample of 2 tables within begin- and end-index tab_lt_scalar calculates the less-than comparsion of every sample with a scalar value within begin- and end-index tab_max_index calculates the maximum value and its index of all samples within begin- and end-index tab_min_index calculates the minimum value and its index of all samples within begin- and end-index tab_min_max calculates the minimum and the maximum value all samples within begin- and end-index tab_mul calculates the product of every sample of 2 tables within begin- and end-index tab_mul_scalar calculates the product of every sample with a scalar value within begin- and end-index tab_ne calculates the not-equal comparsion of every sample of 2 tables within begin- and end-index tab_ne_scalar calculates the not-equal comparsion of every sample with a scalar value within begin- and end-index tab_powtodb calculates the midi-db value of every square-value-sample within begin- and end-index tab_reverse reverses the order of all samples of a table within begin- and end-index tab_rfft calculates the real fourier transformation of a table within begin- and end-index tab_rifft calculates the real inverse fourier transformation of 2 tables within begin- and end-index tab_rmstodb calculates the midi-db value of every root-mean-square-sample within begin- and end-index tab_sqrt calculates the squareroot value of every sample within begin- and end-index tab_sub calculates the difference of every sample of 2 tables within begin- and end-index tab_sum calculates the sum of all samples of a table within begin- and end-index iem_utils-0.0.20240903/iem_tab/GnuLGPL.txt0000600000000000000000000006346714665566711014575 0ustar00 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! iem_utils-0.0.20240903/iem_tab/LICENSE.txt0000600000000000000000000000246714665566711014440 0ustar00This library extends the performance of Miller S. Puckette's realtime-computermusic-environment puredata (pd). iem_tab contains 1 external library "iem_tab.dll" with 44 objects and their help files. iem_tab is published under the Gnu Lesser General Public License that is included (GnuLGPL.txt). Copyright (C) 2000-2018 Thomas MUSIL [musil_at_iem.at] IEM - Institute of Electronic Music and Acoustics, Graz Inffeldgasse 10/3, 8010 Graz, Austria http://iem.at This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details ( GnuLGPL.txt ). (e.g. http://www.gnu.org/copyleft/lesser.html) You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Graz, March 1st 2018 Thomas Musil iem_utils-0.0.20240903/iem_tab/Makefile0000600000000000000000000000444014665566711014246 0ustar00#!/usr/bin/make -f # Makefile to the 'iem_tab' library for Pure Data. # Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build # settings and rules (https://github.com/pure-data/pd-lib-builder). lib.name = iem_tab ## iemlib.h lives in include/ cflags = -Iinclude # special file that does not provide a class lib.setup.sources = src/$(lib.name).c # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) # class.sources = $(filter-out $(lib.setup.sources),$(wildcard src/*.c)) class.sources = \ src/tab_abs.c \ src/tab_add.c \ src/tab_add_scalar.c \ src/tab_carth2polar.c \ src/tab_complex_inv.c \ src/tab_complex_mul.c \ src/tab_const.c \ src/tab_conv.c \ src/tab_copy.c \ src/tab_counter.c \ src/tab_cross_corr.c \ src/tab_dbtorms.c \ src/tab_dbtopow.c \ src/tab_div.c \ src/tab_eq.c \ src/tab_eq_scalar.c \ src/tab_fft.c \ src/tab_find_exact_peaks.c \ src/tab_find_peaks.c \ src/tab_ge.c \ src/tab_ge_scalar.c \ src/tab_gt.c \ src/tab_gt_scalar.c \ src/tab_get_size.c \ src/tab_ifft.c \ src/tab_le.c \ src/tab_le_scalar.c \ src/tab_lt.c \ src/tab_lt_scalar.c \ src/tab_max_index.c \ src/tab_min_index.c \ src/tab_min_max.c \ src/tab_mul.c \ src/tab_mul_scalar.c \ src/tab_ne.c \ src/tab_ne_scalar.c \ src/tab_powtodb.c \ src/tab_reverse.c \ src/tab_rmstodb.c \ src/tab_rfft.c \ src/tab_rifft.c \ src/tab_sqrt.c \ src/tab_sub.c \ src/tab_sum.c \ $(empty) datafiles = \ $(wildcard *.txt) \ $(wildcard *.pdf) \ $(wildcard *.pd) \ $(wildcard *.gif) \ $(wildcard *.bat) \ $(wildcard *.sh) \ $(wildcard *.wav) \ $(empty) #cflags = -DVERSION=$(shell cat VERSION.txt) ## build a multi-object library make-lib-executable=yes ## suppress "unused" warnings #suppress-wunused=yes ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # This Makefile is based on the Makefile from pd-lib-builder written by # Katja Vetter. You can get it from: # https://github.com/pure-data/pd-lib-builder PDLIBBUILDER_DIR=pd-lib-builder/ include $(firstword $(wildcard $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder Makefile.pdlibbuilder)) iem_utils-0.0.20240903/iem_tab/README.txt0000600000000000000000000000366714665566711014316 0ustar00This library extends the performance of Miller S. Puckette's realtime-computermusic-environment puredata (pd). iem_tab contains 1 external library "iem_tab.dll" with 44 objects and their help files (see CONTENT.txt). The main topic is the manipulation of table contents. iem_tab is published under the Gnu Lesser General Public License (see LICENSE.txt and GnuLGPL.txt). iem_tab (Release 1.21) is written by Thomas Musil from IEM KUG Graz Austria and it is compiled against pd-0.48-1. You have to add the library -lib iem_tab (Menue: File: Preferences: Startup...: New...). For Windows "install_path" could be: "C:/Users/xx_ME_xx/AppData/Roaming/Pd" or "C:/Program Files (x86)/Common Files/Pd" or "C:/Users/xx_ME_xx/Documents/Pd/externals" or "C:/Program Files (x86)/pd/extra". For Apple OSX: "install_path" could be: "~/Library/Pd" or "/Library/Pd" or "/Applications/Pd.app/Contents/Resources/extra". For Linux: "install_path" could be: "~/.local/lib/pd/extra" or "~/pd-externals" or "/usr/local/lib/pd-externals" or "/usr/local/lib/pd/extra" or "/usr/lib/pd/extra". Make sure that you get the desired version of iem_tab if there are multiple installations on your computer (-verbose). Copyright (C) 2000-2018 Thomas MUSIL [musil_at_iem.at] THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-0.0.20240903/iem_tab/include/0000700000000000000000000000000014665566711014225 5ustar00iem_utils-0.0.20240903/iem_tab/include/iem_tab.h0000600000000000000000000000072414665566711016003 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #ifndef __IEMTAB_H__ #define __IEMTAB_H__ typedef struct { t_float real; t_float imag; } TAB_COMPLEX; int iem_tab_check_arrays(t_symbol *obj_name, t_symbol *array_name, iemarray_t **beg_mem, int *array_size, int max_index); #endif iem_utils-0.0.20240903/iem_tab/include/iemlib.h0000600000000000000000000001360714665566711015650 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2018 */ #ifndef __IEMLIB_H__ #define __IEMLIB_H__ #define IS_A_NULL(atom,index) ((atom+index)->a_type == A_NULL) #define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA) #define SETNULL(atom) ((atom)->a_type = A_NULL) #ifdef _WIN32 //t_symbol *iemgui_key_sym=0; #include #else //extern t_symbol *iemgui_key_sym; #include #endif extern int sys_noloadbang; //millers m_pd.h beg /* Microsoft Visual Studio is not C99, it does not provide stdint.h */ #ifdef _MSC_VER typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef signed __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else # include #endif #if !defined(PD_FLOATSIZE) /* if compiled pd version < 0.47*/ # define PD_FLOATSIZE 32 #endif typedef union { float f; unsigned int ui; }t_iemdenormal_f; typedef union { double f; unsigned int ui[2]; }t_iemdenormal_d; #ifndef _MSC_VER /* Micrsoft compiler can't handle "inline" function/macros */ #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) /* a test for NANs and denormals. Should only be necessary on x86 variants. */ /* on arm, the impact is less noticeable, but...why not? */ static inline int IEM_DENORMAL_F(float f) /* malformed float 32 */ { t_iemdenormal_f pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } static inline int IEM_DENORMAL_D(double f) /* malformed double 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 typedef union { t_float f; unsigned int ui; }t_iemdenormal_t32; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 32 */ { t_iemdenormal_t32 pun; pun.f = f; pun.ui &= 0x7f800000; return((pun.ui == 0) | (pun.ui == 0x7f800000)); } #elif PD_FLOATSIZE == 64 typedef union { t_float f; unsigned int ui[2]; }t_iemdenormal_t64; static inline int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif /* PD_FLOATSIZE */ #else /* not INTEL or ARM */ #define IEM_DENORMAL_T(f) 0 #define IEM_DENORMAL_D(f) 0 #endif #else /* _MSC_VER */ #define IEM_DENORMAL_F(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) static int IEM_DENORMAL_D(double f) /* malformed t_float 64 */ { t_iemdenormal_d pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #if PD_FLOATSIZE == 32 #define IEM_DENORMAL_T(f) ((((*(unsigned int*)&(f))&0x7f800000)==0) || \ (((*(unsigned int*)&(f))&0x7f800000)==0x7f800000)) #else /* 64 bits... don't know what to do here */ //#define IEM_DENORMAL_T(f) (!(((f) >= 0) || ((f) <= 0))) int IEM_DENORMAL_T(t_float f) /* malformed t_float 64 */ { t_iemdenormal_t64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); } #endif #endif /* _MSC_VER */ //millers m_pd.h end /* on 64bit systems we cannot use garray_getfloatarray... */ #if ((defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 40)) # define iemarray_t t_word # define iemarray_getarray garray_getfloatwords # define iemarray_getfloat(pointer, index) (pointer[index].w_float) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index].w_float = fvalue) #else # define iemarray_t t_float # define iemarray_getarray garray_getfloatarray # define iemarray_getfloat(pointer, index) (pointer[index]) # define iemarray_setfloat(pointer, index, fvalue) (pointer[index] = fvalue) #endif #ifndef BUILD_DATE # define BUILD_DATE "" __DATE__ " : " __TIME__ #endif #if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43) # define iem_open sys_open # define iem_close sys_close # define iem_fopen sys_fopen # define iem_fclose sys_fclose #else # define iem_open open # define iem_close close # define iem_fopen fopen # define iem_fclose fclose #endif // millers d_osc.c beg #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) \ || defined(__OpenBSD__) #include #endif #if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \ defined(ANDROID) #include #endif #ifdef __MINGW32__ #include #endif #ifdef _MSC_VER /* _MSVC lacks BYTE_ORDER and LITTLE_ENDIAN */ #define LITTLE_ENDIAN 0x0001 #define BYTE_ORDER LITTLE_ENDIAN #endif #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) #error No byte order defined #endif #if BYTE_ORDER == LITTLE_ENDIAN # define HIOFFSET 1 # define LOWOFFSET 0 #else # define HIOFFSET 0 /* word offset to find MSB */ # define LOWOFFSET 1 /* word offset to find LSB */ #endif union tabfudge { double tf_d; int32_t tf_i[2]; }; // millers d_osc.c end // millers d_delay.c beg #define IEMDEFDELVS 64 #define IEMXTRASAMPS 4 #define IEMSAMPBLK 4 // millers d_delay.c end #endif iem_utils-0.0.20240903/iem_tab/pd-lib-builder/0000700000000000000000000000000014665566711015375 5ustar00iem_utils-0.0.20240903/iem_tab/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711017431 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/iem_tab/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711021505 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/iem_tab/pd-lib-builder/README.md0000600000000000000000000001314614665566711016663 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/iem_tab/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711020171 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/iem_tab/src/0000700000000000000000000000000014665566711013371 5ustar00iem_utils-0.0.20240903/iem_tab/src/VC6/0000700000000000000000000000000014665566711013767 5ustar00iem_utils-0.0.20240903/iem_tab/src/VC6/iem_tab.dsp0000600000000000000000000000474514665566711016113 0ustar00# Microsoft Developer Studio Project File - Name="iem_tab" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_tab - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak" CFG="iem_tab - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_tab - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_tab - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_tab - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_tab - Win32 Release" # Name "iem_tab - Win32 Debug" !IF "$(CFG)" == "iem_tab - Win32 Release" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_win # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_tab/src/VC6/iem_tab.dsw0000600000000000000000000000106514665566711016112 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_tab"=.\iem_tab.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_tab/src/VC6/makefile_win0000600000000000000000000000305114665566711016345 0ustar00 all: ..\iem_tab.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_tab.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_tab_setup \ /out:..\iem_tab.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_tab/src/VC7/0000700000000000000000000000000014665566711013770 5ustar00iem_utils-0.0.20240903/iem_tab/src/VC7/iem_tab.vcproj0000600000000000000000000000242114665566711016616 0ustar00 iem_utils-0.0.20240903/iem_tab/src/VC7/makefile_vc7proj0000600000000000000000000000311414665566711017143 0ustar00TARGET = iem_tab all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7" VIS_SDK_PATH = "C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" PD_INST_PATH = "C:\Programme\pd-0.42-5" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_tab/src/VC9/0000700000000000000000000000000014665566711013772 5ustar00iem_utils-0.0.20240903/iem_tab/src/VC9/iem_tab.sln0000600000000000000000000000155714665566711016122 0ustar00 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_tab", "iem_tab.vcproj", "{6A44952F-0D55-44EE-9032-928368583BEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.ActiveCfg = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Debug|Win32.Build.0 = Debug|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.ActiveCfg = Release|Win32 {6A44952F-0D55-44EE-9032-928368583BEC}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_tab/src/VC9/iem_tab.vcproj0000600000000000000000000000356514665566711016632 0ustar00 iem_utils-0.0.20240903/iem_tab/src/VC9/makefile_vc9proj0000600000000000000000000000307214665566711017152 0ustar00TARGET = iem_tab all: ..\$(TARGET).dll VIS_CPP_PATH = "C:\Program Files\Microsoft Visual Studio 9.0\VC" VIS_SDK_PATH = "C:\Program Files\Microsoft SDKs\Windows\v6.0A" PD_INST_PATH = "C:\Program Files\pd-0.43.0" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\lib\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_tab/src/iem_tab.c0000600000000000000000000000725214665566711015145 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2018 */ #include "m_pd.h" #include "iemlib.h" int iem_tab_check_arrays(t_symbol *obj_name, t_symbol *array_name, iemarray_t **beg_mem, int *array_size, int max_index) { int ok=1; t_garray *a; if(!(a = (t_garray *)pd_findbyclass(array_name, garray_class))) { pd_error(0, "%s: no such array", array_name->s_name); ok = 0; } else if(!iemarray_getarray(a, array_size, beg_mem)) { pd_error(0, "%s: bad template for %s", array_name->s_name, obj_name->s_name); ok = 0; } else if(*array_size < max_index) { pd_error(0, "%s: bad array-size: %d", array_name->s_name, *array_size); ok = 0; } return(ok); } // Georg Holzmann: #ifdef IEMTAB_SINGLE_OBJ // for single externals disable the iem_tab object #else // build as library static t_class *iem_tab_class; static void *iem_tab_new(void) { t_object *x = (t_object *)pd_new(iem_tab_class); return (x); } void tab_abs_setup(void); void tab_add_setup(void); void tab_add_scalar_setup(void); void tab_carth2polar_setup(void); void tab_complex_inv_setup(void); void tab_complex_mul_setup(void); void tab_const_setup(void); void tab_conv_setup(void); void tab_copy_setup(void); void tab_counter_setup(void); void tab_cross_corr_setup(void); void tab_dbtopow_setup(void); void tab_dbtorms_setup(void); void tab_div_setup(void); void tab_eq_setup(void); void tab_eq_scalar_setup(void); void tab_fft_setup(void); void tab_find_exact_peaks_setup(void); void tab_find_peaks_setup(void); void tab_ge_setup(void); void tab_ge_scalar_setup(void); void tab_get_size_setup(void); void tab_gt_setup(void); void tab_gt_scalar_setup(void); void tab_ifft_setup(void); void tab_le_setup(void); void tab_le_scalar_setup(void); void tab_lt_setup(void); void tab_lt_scalar_setup(void); void tab_max_index_setup(void); void tab_min_index_setup(void); void tab_min_max_setup(void); void tab_mul_setup(void); void tab_mul_scalar_setup(void); void tab_ne_setup(void); void tab_ne_scalar_setup(void); void tab_powtodb_setup(void); void tab_reverse_setup(void); void tab_rfft_setup(void); void tab_rifft_setup(void); void tab_rmstodb_setup(void); void tab_sqrt_setup(void); void tab_sub_setup(void); void tab_sum_setup(void); /* ------------------------ setup routine ------------------------- */ void iem_tab_setup(void) { iem_tab_class = class_new(gensym("iem_tab"), iem_tab_new, 0, sizeof(t_object), CLASS_NOINLET, 0); tab_abs_setup(); tab_add_setup(); tab_add_scalar_setup(); tab_carth2polar_setup(); tab_complex_inv_setup(); tab_complex_mul_setup(); tab_const_setup(); tab_conv_setup(); tab_copy_setup(); tab_counter_setup(); tab_cross_corr_setup(); tab_dbtopow_setup(); tab_dbtorms_setup(); tab_div_setup(); tab_eq_setup(); tab_eq_scalar_setup(); tab_fft_setup(); tab_find_exact_peaks_setup(); tab_find_peaks_setup(); tab_ge_setup(); tab_ge_scalar_setup(); tab_gt_setup(); tab_gt_scalar_setup(); tab_get_size_setup(); tab_ifft_setup(); tab_le_setup(); tab_le_scalar_setup(); tab_lt_setup(); tab_lt_scalar_setup(); tab_max_index_setup(); tab_min_index_setup(); tab_min_max_setup(); tab_mul_setup(); tab_mul_scalar_setup(); tab_ne_setup(); tab_ne_scalar_setup(); tab_powtodb_setup(); tab_reverse_setup(); tab_rfft_setup(); tab_rifft_setup(); tab_rmstodb_setup(); tab_sqrt_setup(); tab_sub_setup(); tab_sum_setup(); post("iem_tab (1.21) library loaded! (c) Thomas Musil "BUILD_DATE); post(" musil%ciem.at iem KUG Graz Austria", '@'); } #endif // library iem_utils-0.0.20240903/iem_tab/src/iem_tab.dsp0000600000000000000000000000502214665566711015502 0ustar00# Microsoft Developer Studio Project File - Name="iem_tab" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=iem_tab - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_tab.mak" CFG="iem_tab - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_tab - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_tab - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "iem_tab - Win32 Release" # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_vc12proj" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_vc12proj.exe" # PROP BASE Bsc_Name "makefile_vc12proj.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_vc12proj" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_tab.exe" # PROP Bsc_Name "iem_tab.bsc" # PROP Target_Dir "" !ENDIF # Begin Target # Name "iem_tab - Win32 Release" # Name "iem_tab - Win32 Debug" !IF "$(CFG)" == "iem_tab - Win32 Release" !ELSEIF "$(CFG)" == "iem_tab - Win32 Debug" !ENDIF # Begin Source File SOURCE=.\makefile_vc12proj # End Source File # End Target # End Project iem_utils-0.0.20240903/iem_tab/src/iem_tab.dsw0000600000000000000000000000106514665566711015514 0ustar00Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "iem_tab"=.\iem_tab.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### iem_utils-0.0.20240903/iem_tab/src/iem_tab.sln0000600000000000000000000000156014665566711015513 0ustar00 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iem_tab", "iem_tab.vcxproj", "{72CD00D4-3993-4691-A14F-67DD3CEEAF8E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {72CD00D4-3993-4691-A14F-67DD3CEEAF8E}.Debug|Win32.ActiveCfg = Debug|Win32 {72CD00D4-3993-4691-A14F-67DD3CEEAF8E}.Debug|Win32.Build.0 = Debug|Win32 {72CD00D4-3993-4691-A14F-67DD3CEEAF8E}.Release|Win32.ActiveCfg = Release|Win32 {72CD00D4-3993-4691-A14F-67DD3CEEAF8E}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal iem_utils-0.0.20240903/iem_tab/src/iem_tab.vcxproj0000600000000000000000000000610714665566711016414 0ustar00 Debug Win32 Release Win32 MakeFileProj {72CD00D4-3993-4691-A14F-67DD3CEEAF8E} Makefile v110 Makefile v110 .\Debug\ .\Debug\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_tab.exe .\Release\ .\Release\ NMAKE /f makefile_vc12proj NMAKE /f makefile_vc12proj /a iem_tab.exe iem_utils-0.0.20240903/iem_tab/src/makefile_vc12proj0000600000000000000000000000320714665566711016623 0ustar00TARGET = iem_tab all: ..\$(TARGET).dll VIS_CPP_COMP = cl VIS_CPP_LINK = link VIS_CPP_PATH = "$(PROGRAMFILES)\Microsoft Visual Studio 11.0\VC" VIS_SDK_PATH = "$(PROGRAMFILES)\Windows Kits\8.1" PD_INST_PATH = "$(PROGRAMFILES)\pd-0.48-1" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include /I..\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -D_CRT_SECURE_NO_WARNINGS PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libcmt /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel32 \ $(VIS_CPP_PATH)\lib\libcmt.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_SDK_PATH)\Lib\winv6.3\um\x86\kernel32.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtorms.c \ tab_dbtopow.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rmstodb.c \ tab_rfft.c \ tab_rifft.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ $(TARGET).c OBJ = $(SRC:.c=.obj) .c.obj: $(VIS_CPP_COMP) $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\$(TARGET).dll: $(OBJ) $(VIS_CPP_LINK) $(PD_WIN_L_FLAGS) /dll /export:$(TARGET)_setup \ /out:..\$(TARGET).dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_tab/src/makefile_win0000600000000000000000000000316114665566711015751 0ustar00 all: ..\iem_tab.dll VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98" PD_INST_PATH = "C:\Programme\pd" PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN PD_WIN_L_FLAGS = /nologo PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib SRC = tab_abs.c \ tab_add.c \ tab_add_scalar.c \ tab_carth2polar.c \ tab_complex_inv.c \ tab_complex_mul.c \ tab_const.c \ tab_conv.c \ tab_copy.c \ tab_counter.c \ tab_cross_corr.c \ tab_dbtopow.c \ tab_dbtorms.c \ tab_div.c \ tab_eq.c \ tab_eq_scalar.c \ tab_fft.c \ tab_find_exact_peaks.c \ tab_find_peaks.c \ tab_ge.c \ tab_ge_scalar.c \ tab_gt.c \ tab_gt_scalar.c \ tab_get_size.c \ tab_ifft.c \ tab_le.c \ tab_le_scalar.c \ tab_lt.c \ tab_lt_scalar.c \ tab_max_index.c \ tab_min_index.c \ tab_min_max.c \ tab_mul.c \ tab_mul_scalar.c \ tab_ne.c \ tab_ne_scalar.c \ tab_powtodb.c \ tab_reverse.c \ tab_rfft.c \ tab_rifft.c \ tab_rmstodb.c \ tab_sqrt.c \ tab_sub.c \ tab_sum.c \ iem_tab.c OBJ = $(SRC:.c=.obj) .c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c ..\iem_tab.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_tab_setup \ /out:..\iem_tab.dll $(OBJ) $(PD_WIN_LIB) clean: del *.obj iem_utils-0.0.20240903/iem_tab/src/tab_abs.c0000600000000000000000000001041514665566711015133 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_abs ------------------------------ */ /* x_beg_mem_dst[i] = abs(x_beg_mem_src1[i]) */ typedef struct _tab_abs { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_abs; static t_class *tab_abs_class; static void tab_abs_src(t_tab_abs *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_abs_dst(t_tab_abs *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_abs_bang(t_tab_abs *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_abs_list(t_tab_abs *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_abs"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_abs-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_abs"); } } static void tab_abs_free(t_tab_abs *x) { } static void *tab_abs_new(t_symbol *s, int argc, t_atom *argv) { t_tab_abs *x = (t_tab_abs *)pd_new(tab_abs_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_abs-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_abs_setup(void) { tab_abs_class = class_new(gensym("tab_abs"), (t_newmethod)tab_abs_new, (t_method)tab_abs_free, sizeof(t_tab_abs), 0, A_GIMME, 0); class_addbang(tab_abs_class, (t_method)tab_abs_bang); class_addlist(tab_abs_class, (t_method)tab_abs_list); class_addmethod(tab_abs_class, (t_method)tab_abs_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_abs_class, (t_method)tab_abs_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_abs_class, (t_method)tab_abs_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_abs_class, gensym("iemhelp2/tab_abs-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_add.c0000600000000000000000000001245214665566711015121 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_add ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] + x_beg_mem_src2[i] */ typedef struct _tab_add { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_add; static t_class *tab_add_class; static void tab_add_src1(t_tab_add *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_add_src2(t_tab_add *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_add_dst(t_tab_add *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_add_bang(t_tab_add *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_add_list(t_tab_add *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_add"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_add-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_add"); } } static void tab_add_free(t_tab_add *x) { } static void *tab_add_new(t_symbol *s, int argc, t_atom *argv) { t_tab_add *x = (t_tab_add *)pd_new(tab_add_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_add-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_add_setup(void) { tab_add_class = class_new(gensym("tab_add"), (t_newmethod)tab_add_new, (t_method)tab_add_free, sizeof(t_tab_add), 0, A_GIMME, 0); class_addbang(tab_add_class, (t_method)tab_add_bang); class_addlist(tab_add_class, (t_method)tab_add_list); class_addmethod(tab_add_class, (t_method)tab_add_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_add_class, (t_method)tab_add_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_add_class, (t_method)tab_add_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_add_class, gensym("iemhelp2/tab_add-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_add_scalar.c0000600000000000000000000001126414665566711016446 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_add_scalar ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] + add */ typedef struct _tab_add_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_add_scalar; static t_class *tab_add_scalar_class; static void tab_add_scalar_src(t_tab_add_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_add_scalar_float(t_tab_add_scalar *x, t_floatarg add) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_add_scalar_dst(t_tab_add_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_add_scalar_list(t_tab_add_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; t_float add; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); add = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_add_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_add_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_add + add_scalar"); } } static void tab_add_scalar_free(t_tab_add_scalar *x) { } static void *tab_add_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_add_scalar *x = (t_tab_add_scalar *)pd_new(tab_add_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_add_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_add_scalar_setup(void) { tab_add_scalar_class = class_new(gensym("tab_add_scalar"), (t_newmethod)tab_add_scalar_new, (t_method)tab_add_scalar_free, sizeof(t_tab_add_scalar), 0, A_GIMME, 0); class_addfloat(tab_add_scalar_class, (t_method)tab_add_scalar_float); class_addlist(tab_add_scalar_class, (t_method)tab_add_scalar_list); class_addmethod(tab_add_scalar_class, (t_method)tab_add_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_add_scalar_class, (t_method)tab_add_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_add_scalar_class, (t_method)tab_add_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_add_scalar_class, gensym("iemhelp2/tab_add_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_carth2polar.c0000600000000000000000000001773514665566711016623 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_carth2polar ------------------------------ */ /* x_beg_mem_dst_mag[i] = sqrt(x_beg_mem_src_re[i]*x_beg_mem_src_re[i] + x_beg_mem_src_im[i]*x_beg_mem_src_im[i]) */ /* x_beg_mem_dst_arg[i] = atan2(x_beg_mem_src_im[i], x_beg_mem_src_re[i]) */ typedef struct _tab_carth2polar { t_object x_obj; int x_size_src_re; int x_size_dst_mag; int x_size_src_im; int x_size_dst_arg; int x_offset_src_re; int x_offset_dst_mag; int x_offset_src_im; int x_offset_dst_arg; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_dst_mag; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_arg; t_symbol *x_sym_src_re; t_symbol *x_sym_dst_mag; t_symbol *x_sym_src_im; t_symbol *x_sym_dst_arg; } t_tab_carth2polar; static t_class *tab_carth2polar_class; static void tab_carth2polar_src_re(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_carth2polar_src_im(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_carth2polar_dst_mag(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_dst_mag = s; } static void tab_carth2polar_dst_arg(t_tab_carth2polar *x, t_symbol *s) { x->x_sym_dst_arg = s; } static void tab_carth2polar_bang(t_tab_carth2polar *x) { int i, n; int ok_src_re, ok_dst_mag; int ok_src_im, ok_dst_arg; iemarray_t *vec_src_re, *vec_dst_mag; iemarray_t *vec_src_im, *vec_dst_arg; ok_src_re = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, 0); ok_dst_mag = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_mag, &x->x_beg_mem_dst_mag, &x->x_size_dst_mag, 0); ok_src_im = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, 0); ok_dst_arg = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_arg, &x->x_beg_mem_dst_arg, &x->x_size_dst_arg, 0); if(ok_src_re && ok_dst_mag && ok_src_im && ok_dst_arg) { if(x->x_size_src_re < x->x_size_dst_mag) n = x->x_size_src_re; else n = x->x_size_dst_mag; if(x->x_size_src_im < n) n = x->x_size_src_im; if(x->x_size_dst_arg < n) n = x->x_size_dst_arg; vec_src_re = x->x_beg_mem_src_re; vec_dst_mag = x->x_beg_mem_dst_mag; vec_src_im = x->x_beg_mem_src_im; vec_dst_arg = x->x_beg_mem_dst_arg; if(n) { t_garray *a; t_float rcp_two_pi=0.125/atan(1.0); for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_mag, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_arg, garray_class); garray_redraw(a); } } } static void tab_carth2polar_list(t_tab_carth2polar *x, t_symbol *s, int argc, t_atom *argv) { int i, n; int beg_src_re, beg_dst_mag; int beg_src_im, beg_dst_arg; int ok_src_re, ok_dst_mag; int ok_src_im, ok_dst_arg; iemarray_t *vec_src_re, *vec_dst_mag; iemarray_t *vec_src_im, *vec_dst_arg; if((argc >= 5) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst_mag = (int)atom_getintarg(2, argc, argv); beg_dst_arg = (int)atom_getintarg(3, argc, argv); n = (int)atom_getintarg(4, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_dst_mag < 0) beg_dst_mag = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst_arg < 0) beg_dst_arg = 0; if(n < 0) n = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, beg_src_re+n); ok_dst_mag = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_mag, &x->x_beg_mem_dst_mag, &x->x_size_dst_mag, beg_dst_mag+n); ok_src_im = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, beg_src_im+n); ok_dst_arg = iem_tab_check_arrays(gensym("tab_carth2polar"), x->x_sym_dst_arg, &x->x_beg_mem_dst_arg, &x->x_size_dst_arg, beg_dst_arg+n); if(ok_src_re && ok_dst_mag && ok_src_im && ok_dst_arg) { vec_src_re = x->x_beg_mem_src_re + beg_src_re; vec_dst_mag = x->x_beg_mem_dst_mag + beg_dst_mag; vec_src_im = x->x_beg_mem_src_im + beg_src_im; vec_dst_arg = x->x_beg_mem_dst_arg + beg_dst_arg; if(n) { t_garray *a; t_float rcp_two_pi=0.125/atan(1.0); for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_mag, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_arg, garray_class); garray_redraw(a); } } } else { post("tab_carth2polar-ERROR: list need 5 float arguments:"); post(" source_real_offset + source_imag_offset + destination_magnitude_offset + destination_phase_argument_offset + number_of_samples_to_convert"); } } static void tab_carth2polar_free(t_tab_carth2polar *x) { } static void *tab_carth2polar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_carth2polar *x = (t_tab_carth2polar *)pd_new(tab_carth2polar_class); t_symbol *src_re, *dst_mag, *src_im, *dst_arg; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_mag = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_arg = (t_symbol *)atom_getsymbolarg(3, argc, argv); } else { post("tab_carth2polar-ERROR: need 4 symbols arguments:"); post(" source_real_array_name + source_imag_array_name + destination_magnitude_array_name + destination_phase_argument_array_name"); return(0); } x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst_mag = dst_mag; x->x_sym_dst_arg = dst_arg; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_carth2polar_setup(void) { tab_carth2polar_class = class_new(gensym("tab_carth2polar"), (t_newmethod)tab_carth2polar_new, (t_method)tab_carth2polar_free, sizeof(t_tab_carth2polar), 0, A_GIMME, 0); class_addbang(tab_carth2polar_class, (t_method)tab_carth2polar_bang); class_addlist(tab_carth2polar_class, (t_method)tab_carth2polar_list); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_re, gensym("src1_re"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_src_im, gensym("src1_im"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_dst_mag, gensym("dst_mag"), A_DEFSYMBOL, 0); class_addmethod(tab_carth2polar_class, (t_method)tab_carth2polar_dst_arg, gensym("dst_arg"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_complex_inv.c0000600000000000000000000002015714665566711016715 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_complex_inv ------------------------------ */ /* x_beg_mem_dst_re[i] = x_beg_mem_src1_re[i] / (x_beg_mem_src1_re[i]*x_beg_mem_src1_re[i] + x_beg_mem_src1_im[i]*x_beg_mem_src1_im[i]) */ /* x_beg_mem_dst_im[i] = -x_beg_mem_src1_im[i] / (x_beg_mem_src1_re[i]*x_beg_mem_src1_re[i] + x_beg_mem_src1_im[i]*x_beg_mem_src1_im[i]) */ typedef struct _tab_complex_inv { t_object x_obj; int x_size_src1_re; int x_size_dst_re; int x_size_src1_im; int x_size_dst_im; int x_offset_src1_re; int x_offset_dst_re; int x_offset_src1_im; int x_offset_dst_im; iemarray_t *x_beg_mem_src1_re; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_src1_im; iemarray_t *x_beg_mem_dst_im; t_symbol *x_sym_scr1_re; t_symbol *x_sym_dst_re; t_symbol *x_sym_scr1_im; t_symbol *x_sym_dst_im; } t_tab_complex_inv; static t_class *tab_complex_inv_class; static void tab_complex_inv_src1_re(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_scr1_re = s; } static void tab_complex_inv_src1_im(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_scr1_im = s; } static void tab_complex_inv_dst_re(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_complex_inv_dst_im(t_tab_complex_inv *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_complex_inv_bang(t_tab_complex_inv *x) { int i, n; int ok_src1_re, ok_dst_re; int ok_src1_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_dst_im; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, 0); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, 0); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, 0); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, 0); if(ok_src1_re && ok_dst_re && ok_src1_im && ok_dst_im) { if(x->x_size_src1_re < x->x_size_dst_re) n = x->x_size_src1_re; else n = x->x_size_dst_re; if(x->x_size_src1_im < n) n = x->x_size_src1_im; if(x->x_size_dst_im < n) n = x->x_size_dst_im; vec_src1_re = x->x_beg_mem_src1_re; vec_dst_re = x->x_beg_mem_dst_re; vec_src1_im = x->x_beg_mem_src1_im; vec_dst_im = x->x_beg_mem_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } static void tab_complex_inv_list(t_tab_complex_inv *x, t_symbol *s, int argc, t_atom *argv) { int i, n; int beg_src1_re, beg_dst_re; int beg_src1_im, beg_dst_im; int ok_src1_re, ok_dst_re; int ok_src1_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_dst_im; if((argc >= 5) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4)) { beg_src1_re = (int)atom_getintarg(0, argc, argv); beg_src1_im = (int)atom_getintarg(1, argc, argv); beg_dst_re = (int)atom_getintarg(2, argc, argv); beg_dst_im = (int)atom_getintarg(3, argc, argv); n = (int)atom_getintarg(4, argc, argv); if(beg_src1_re < 0) beg_src1_re = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_src1_im < 0) beg_src1_im = 0; if(beg_dst_im < 0) beg_dst_im = 0; if(n < 0) n = 0; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, beg_src1_re+n); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+n); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, beg_src1_im+n); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_inv"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+n); if(ok_src1_re && ok_dst_re && ok_src1_im && ok_dst_im) { vec_src1_re = x->x_beg_mem_src1_re + beg_src1_re; vec_dst_re = x->x_beg_mem_dst_re + beg_dst_re; vec_src1_im = x->x_beg_mem_src1_im + beg_src1_im; vec_dst_im = x->x_beg_mem_dst_im + beg_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } else { post("tab_complex_inv-ERROR: list need 5 float arguments:"); post(" source1_real_offset + source1_imag_offset + destination_real_offset + destination_imag_offset + number_of_samples_to_complex_mul"); } } static void tab_complex_inv_free(t_tab_complex_inv *x) { } static void *tab_complex_inv_new(t_symbol *s, int argc, t_atom *argv) { t_tab_complex_inv *x = (t_tab_complex_inv *)pd_new(tab_complex_inv_class); t_symbol *src1_re, *src2_re, *dst_re, *src1_im, *src2_im, *dst_im; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = src1_re; dst_im = src1_im; } else { post("tab_complex_inv-ERROR: need 4 symbols arguments:"); post(" source1_real_array_name + source1_imag_array_name + destination_real_array_name + destination_imag_array_name"); return(0); } x->x_sym_scr1_re = src1_re; x->x_sym_scr1_im = src1_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_complex_inv_setup(void) { tab_complex_inv_class = class_new(gensym("tab_complex_inv"), (t_newmethod)tab_complex_inv_new, (t_method)tab_complex_inv_free, sizeof(t_tab_complex_inv), 0, A_GIMME, 0); class_addbang(tab_complex_inv_class, (t_method)tab_complex_inv_bang); class_addlist(tab_complex_inv_class, (t_method)tab_complex_inv_list); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_re, gensym("src1_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_im, gensym("src1_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_src1_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_inv_class, (t_method)tab_complex_inv_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_complex_mul.c0000600000000000000000000002501314665566711016712 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_complex_mul ------------------------------ */ /* x_beg_mem_dst_re[i] = x_beg_mem_src1_re[i]*x_beg_mem_src2_re[i] - x_beg_mem_src1_im[i]*x_beg_mem_src2_im[i] */ /* x_beg_mem_dst_im[i] = x_beg_mem_src1_re[i]*x_beg_mem_src2_im[i] + x_beg_mem_src1_im[i]*x_beg_mem_src2_re[i] */ typedef struct _tab_complex_mul { t_object x_obj; int x_size_src1_re; int x_size_src2_re; int x_size_dst_re; int x_size_src1_im; int x_size_src2_im; int x_size_dst_im; int x_offset_src1_re; int x_offset_src2_re; int x_offset_dst_re; int x_offset_src1_im; int x_offset_src2_im; int x_offset_dst_im; iemarray_t *x_beg_mem_src1_re; iemarray_t *x_beg_mem_src2_re; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_src1_im; iemarray_t *x_beg_mem_src2_im; iemarray_t *x_beg_mem_dst_im; t_symbol *x_sym_scr1_re; t_symbol *x_sym_scr2_re; t_symbol *x_sym_dst_re; t_symbol *x_sym_scr1_im; t_symbol *x_sym_scr2_im; t_symbol *x_sym_dst_im; } t_tab_complex_mul; static t_class *tab_complex_mul_class; static void tab_complex_mul_src1_re(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr1_re = s; } static void tab_complex_mul_src1_im(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr1_im = s; } static void tab_complex_mul_src2_re(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr2_re = s; } static void tab_complex_mul_src2_im(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_scr2_im = s; } static void tab_complex_mul_dst_re(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_complex_mul_dst_im(t_tab_complex_mul *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_complex_mul_bang(t_tab_complex_mul *x) { int i, n; int ok_src1_re, ok_src2_re, ok_dst_re; int ok_src1_im, ok_src2_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_src2_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_src2_im, *vec_dst_im; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, 0); ok_src2_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_re, &x->x_beg_mem_src2_re, &x->x_size_src2_re, 0); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, 0); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, 0); ok_src2_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_im, &x->x_beg_mem_src2_im, &x->x_size_src2_im, 0); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, 0); if(ok_src1_re && ok_src2_re && ok_dst_re && ok_src1_im && ok_src2_im && ok_dst_im) { if(x->x_size_src1_re < x->x_size_dst_re) n = x->x_size_src1_re; else n = x->x_size_dst_re; if(x->x_size_src2_re < n) n = x->x_size_src2_re; if(x->x_size_src1_im < n) n = x->x_size_src1_im; if(x->x_size_src2_im < n) n = x->x_size_src2_im; if(x->x_size_dst_im < n) n = x->x_size_dst_im; vec_src1_re = x->x_beg_mem_src1_re; vec_src2_re = x->x_beg_mem_src2_re; vec_dst_re = x->x_beg_mem_dst_re; vec_src1_im = x->x_beg_mem_src1_im; vec_src2_im = x->x_beg_mem_src2_im; vec_dst_im = x->x_beg_mem_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } static void tab_complex_mul_list(t_tab_complex_mul *x, t_symbol *s, int argc, t_atom *argv) { int i, n; int beg_src1_re, beg_src2_re, beg_dst_re; int beg_src1_im, beg_src2_im, beg_dst_im; int ok_src1_re, ok_src2_re, ok_dst_re; int ok_src1_im, ok_src2_im, ok_dst_im; iemarray_t *vec_src1_re, *vec_src2_re, *vec_dst_re; iemarray_t *vec_src1_im, *vec_src2_im, *vec_dst_im; if((argc >= 7) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4) && IS_A_FLOAT(argv,5) && IS_A_FLOAT(argv,6)) { beg_src1_re = (int)atom_getintarg(0, argc, argv); beg_src1_im = (int)atom_getintarg(1, argc, argv); beg_src2_re = (int)atom_getintarg(2, argc, argv); beg_src2_im = (int)atom_getintarg(3, argc, argv); beg_dst_re = (int)atom_getintarg(4, argc, argv); beg_dst_im = (int)atom_getintarg(5, argc, argv); n = (int)atom_getintarg(6, argc, argv); if(beg_src1_re < 0) beg_src1_re = 0; if(beg_src2_re < 0) beg_src2_re = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_src1_im < 0) beg_src1_im = 0; if(beg_src2_im < 0) beg_src2_im = 0; if(beg_dst_im < 0) beg_dst_im = 0; if(n < 0) n = 0; ok_src1_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_re, &x->x_beg_mem_src1_re, &x->x_size_src1_re, beg_src1_re+n); ok_src2_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_re, &x->x_beg_mem_src2_re, &x->x_size_src2_re, beg_src2_re+n); ok_dst_re = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+n); ok_src1_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr1_im, &x->x_beg_mem_src1_im, &x->x_size_src1_im, beg_src1_im+n); ok_src2_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_scr2_im, &x->x_beg_mem_src2_im, &x->x_size_src2_im, beg_src2_im+n); ok_dst_im = iem_tab_check_arrays(gensym("tab_complex_mul"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+n); if(ok_src1_re && ok_src2_re && ok_dst_re && ok_src1_im && ok_src2_im && ok_dst_im) { vec_src1_re = x->x_beg_mem_src1_re + beg_src1_re; vec_src2_re = x->x_beg_mem_src2_re + beg_src2_re; vec_dst_re = x->x_beg_mem_dst_re + beg_dst_re; vec_src1_im = x->x_beg_mem_src1_im + beg_src1_im; vec_src2_im = x->x_beg_mem_src2_im + beg_src2_im; vec_dst_im = x->x_beg_mem_dst_im + beg_dst_im; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } } else { post("tab_complex_mul-ERROR: list need 7 float arguments:"); post(" source1_real_offset + source1_imag_offset + source2_real_offset + source2_imag_offset + destination_real_offset + destination_imag_offset + number_of_samples_to_complex_mul"); } } static void tab_complex_mul_free(t_tab_complex_mul *x) { } static void *tab_complex_mul_new(t_symbol *s, int argc, t_atom *argv) { t_tab_complex_mul *x = (t_tab_complex_mul *)pd_new(tab_complex_mul_class); t_symbol *src1_re, *src2_re, *dst_re, *src1_im, *src2_im, *dst_im; if((argc >= 6) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_SYMBOL(argv,4) && IS_A_SYMBOL(argv,5)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); src2_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); src2_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(4, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(5, argc, argv); } else if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,4)) { src1_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src1_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); src2_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); src2_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); dst_re = src1_re; dst_im = src1_im; } else { post("tab_complex_mul-ERROR: need 6 symbols arguments:"); post(" source1_real_array_name + source1_imag_array_name + source2_real_array_name + source2_imag_array_name + destination_real_array_name + destination_imag_array_name"); return(0); } x->x_sym_scr1_re = src1_re; x->x_sym_scr1_im = src1_im; x->x_sym_scr2_re = src2_re; x->x_sym_scr2_im = src2_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_complex_mul_setup(void) { tab_complex_mul_class = class_new(gensym("tab_complex_mul"), (t_newmethod)tab_complex_mul_new, (t_method)tab_complex_mul_free, sizeof(t_tab_complex_mul), 0, A_GIMME, 0); class_addbang(tab_complex_mul_class, (t_method)tab_complex_mul_bang); class_addlist(tab_complex_mul_class, (t_method)tab_complex_mul_list); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src1_re, gensym("src1_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src2_re, gensym("src2_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src1_im, gensym("src1_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_src2_im, gensym("src2_im"), A_DEFSYMBOL, 0); class_addmethod(tab_complex_mul_class, (t_method)tab_complex_mul_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_complex_mul_class, gensym("iemhelp2/tab_complex_mul-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_const.c0000600000000000000000000000727214665566711015523 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_const ------------------------------ */ /* x_beg_mem_dst[i] = c */ typedef struct _tab_const { t_object x_obj; int x_size_dst; int x_offset_dst; t_float x_const; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_dst; } t_tab_const; static t_class *tab_const_class; static void tab_const_dst(t_tab_const *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_const_bang(t_tab_const *x) { int i, n; int ok_dst; iemarray_t *vec_dst; ok_dst = iem_tab_check_arrays(gensym("tab_const"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_dst) { n = x->x_size_dst; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_const_float(t_tab_const *x, t_floatarg c) { int i, n; int ok_dst; iemarray_t *vec_dst; ok_dst = iem_tab_check_arrays(gensym("tab_const"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_dst) { n = x->x_size_dst; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_const_list(t_tab_const *x, t_symbol *s, int argc, t_atom *argv) { int beg_dst; int i, n; int ok_dst; iemarray_t *vec_dst; t_float c; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_dst = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); c = (t_float)atom_getfloatarg(2, argc, argv); if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_dst = iem_tab_check_arrays(gensym("tab_const"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_dst) { vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_const-ERROR: list need 3 float arguments:"); post(" destination_offset + number_of_samples_to_copy + constant-value"); } } static void tab_const_free(t_tab_const *x) { } static void *tab_const_new(t_symbol *s, int argc, t_atom *argv) { t_tab_const *x = (t_tab_const *)pd_new(tab_const_class); t_symbol *dst; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { dst = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_const-ERROR: need 1 symbol argument:"); post(" destination_array_name"); return(0); } x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_const_setup(void) { tab_const_class = class_new(gensym("tab_const"), (t_newmethod)tab_const_new, (t_method)tab_const_free, sizeof(t_tab_const), 0, A_GIMME, 0); class_addbang(tab_const_class, (t_method)tab_const_bang); class_addfloat(tab_const_class, (t_method)tab_const_float); class_addlist(tab_const_class, (t_method)tab_const_list); class_addmethod(tab_const_class, (t_method)tab_const_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_conv.c0000600000000000000000000002710614665566711015340 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* ---------------------------- tab_conv ------------------------------- */ /* for(i=0; ix_sym_scr1 = s; } static void tab_conv_src2(t_tab_conv *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_conv_dst(t_tab_conv *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_conv_bang(t_tab_conv *x) { int i, j, k, l, m, n, p, q; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_sig, *vec_ir, *vec_dst; t_float sum=0.0f; ok_src1 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { t_garray *a; if((x->x_size_src1+x->x_size_src2-1) <= x->x_size_dst)// ok, the last part of dst is zero { if(x->x_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; for(i=1; i0; i--, k++) { sum = 0.0f; for(j=1; j<=i; j++) sum += iemarray_getfloat(vec_sig, -j) * iemarray_getfloat(vec_ir, j+k); iemarray_setfloat(vec_dst, 0, sum); vec_dst++; } } else { if(x->x_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; p = x->x_size_dst; q = 0; for(i=1; i= p) goto tab_conv_bang_end; } l = n - m + 1; for(i=0; i= p) goto tab_conv_bang_end; } for(i=m-1, k=0; i>0; i--, k++) { sum = 0.0f; for(j=1; j<=i; j++) sum += iemarray_getfloat(vec_sig, -j) * iemarray_getfloat(vec_ir, j+k); iemarray_setfloat(vec_dst, 0, sum); vec_dst++; q++; if(q >= p) goto tab_conv_bang_end; } for(i=m-1; i>0; i--) { sum = 0.0f; for(j=0, k=i-1; j= p) goto tab_conv_bang_end; } } tab_conv_bang_end: outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } static void tab_conv_list(t_tab_conv *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int n_src1, n_src2; int i, j, k, l, m, n, p; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_sig, *vec_ir, *vec_dst; t_float sum=0.0; if((argc >= 5) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3) && IS_A_FLOAT(argv,4)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n_src1 = (int)atom_getintarg(3, argc, argv); n_src2 = (int)atom_getintarg(4, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n_src1 < 0) n_src1 = 0; if(n_src2 < 0) n_src2 = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n_src1); ok_src2 = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n_src2); ok_dst = iem_tab_check_arrays(gensym("tab_conv"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n_src1); if(ok_src1 && ok_src2 && ok_dst) { t_garray *a; if((x->x_size_src1+x->x_size_src2-1) <= x->x_size_dst)// ok, the last part of dst is zero { if(x->x_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; l = m - 1; for(i=0; i=0; i--) { sum = 0.0; for(j=0, k=i-1; jx_size_src1 > x->x_size_src2)// src2(t-tau) is impuls response { vec_sig = x->x_beg_mem_src1; vec_ir = x->x_beg_mem_src2; n = x->x_size_src1; m = x->x_size_src2; } else// src1(t-tau) is impuls response { vec_sig = x->x_beg_mem_src2; vec_ir = x->x_beg_mem_src1; n = x->x_size_src2; m = x->x_size_src1; } vec_dst = x->x_beg_mem_dst; p = x->x_size_dst; k = 0; l = m - 1; for(i=0; i= p) goto tab_conv_list_end; } l = n - m + 1; for(i=0; i= p) goto tab_conv_list_end; } l = m - 1; for(i=l-1; i>=0; i--) { sum = 0.0; for(j=0, k=i-1; j= p) goto tab_conv_list_end; } } tab_conv_list_end: outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } else { post("tab_conv-ERROR: list need 5 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_convolute + convolution_window_width"); } } static void tab_conv_free(t_tab_conv *x) { } static void *tab_conv_new(t_symbol *s, int argc, t_atom *argv) { t_tab_conv *x = (t_tab_conv *)pd_new(tab_conv_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_conv-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_conv_setup(void) { tab_conv_class = class_new(gensym("tab_conv"), (t_newmethod)tab_conv_new, (t_method)tab_conv_free, sizeof(t_tab_conv), 0, A_GIMME, 0); class_addbang(tab_conv_class, (t_method)tab_conv_bang); // class_addlist(tab_conv_class, (t_method)tab_conv_list); class_addmethod(tab_conv_class, (t_method)tab_conv_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_conv_class, (t_method)tab_conv_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_conv_class, (t_method)tab_conv_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_copy.c0000600000000000000000000001042214665566711015336 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_copy ------------------------------ */ typedef struct _tab_copy { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_copy; static t_class *tab_copy_class; static void tab_copy_src(t_tab_copy *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_copy_dst(t_tab_copy *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_copy_bang(t_tab_copy *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_copy_list(t_tab_copy *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_copy"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_copy-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_copy"); } } static void tab_copy_free(t_tab_copy *x) { } static void *tab_copy_new(t_symbol *s, int argc, t_atom *argv) { t_tab_copy *x = (t_tab_copy *)pd_new(tab_copy_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_copy-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_copy_setup(void) { tab_copy_class = class_new(gensym("tab_copy"), (t_newmethod)tab_copy_new, (t_method)tab_copy_free, sizeof(t_tab_copy), 0, A_GIMME, 0); class_addbang(tab_copy_class, (t_method)tab_copy_bang); class_addlist(tab_copy_class, (t_method)tab_copy_list); class_addmethod(tab_copy_class, (t_method)tab_copy_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_copy_class, (t_method)tab_copy_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_copy_class, (t_method)tab_copy_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_copy_class, gensym("iemhelp2/tab_copy-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_counter.c0000600000000000000000000001306614665566711016052 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_counter ------------------------------ */ /* for(i=0; ix_sym_scr1 = s; } static void tab_counter_bang(t_tab_counter *x) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_counter_dst(t_tab_counter *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_counter_list(t_tab_counter *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_counter-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_add + add_scalar"); } } static void tab_counter_reset(t_tab_counter *x) { int beg_dst; int i, n; int ok_dst; iemarray_t *vec_dst; ok_dst = iem_tab_check_arrays(gensym("tab_counter"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_dst) { n = x->x_size_dst; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_counter_free(t_tab_counter *x) { } static void *tab_counter_new(t_symbol *s, int argc, t_atom *argv) { t_tab_counter *x = (t_tab_counter *)pd_new(tab_counter_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_counter-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_counter_setup(void) { tab_counter_class = class_new(gensym("tab_counter"), (t_newmethod)tab_counter_new, (t_method)tab_counter_free, sizeof(t_tab_counter), 0, A_GIMME, 0); class_addbang(tab_counter_class, (t_method)tab_counter_bang); class_addlist(tab_counter_class, (t_method)tab_counter_list); class_addmethod(tab_counter_class, (t_method)tab_counter_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_counter_class, (t_method)tab_counter_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_counter_class, (t_method)tab_counter_dst, gensym("dst"), A_DEFSYMBOL, 0); class_addmethod(tab_counter_class, (t_method)tab_counter_reset, gensym("reset"), 0); // class_sethelpsymbol(tab_counter_class, gensym("iemhelp2/tab_counter-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_cross_corr.c0000600000000000000000000001371214665566711016547 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_cross_corr ------------------------------ */ typedef struct _tab_cross_corr { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_n; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_float x_factor; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; t_float x_delay; int x_counter; void *x_clock; } t_tab_cross_corr; static t_class *tab_cross_corr_class; static void tab_cross_corr_tick(t_tab_cross_corr *x) { x->x_counter++; if(x->x_counter < x->x_n) { iemarray_t *vec_src1, *vec_src2, *vec_dst; t_float sum; int j, m; vec_src1 = x->x_beg_mem_src1 + x->x_counter; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst + x->x_counter; m = x->x_size_src2; sum = 0.0f; for(j=0; jx_factor); clock_delay(x->x_clock, x->x_delay); } else { t_garray *a; clock_unset(x->x_clock); outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } static void tab_cross_corr_time(t_tab_cross_corr *x, t_floatarg dtime) { if(dtime < 0.0f) dtime = 0.0f; x->x_delay = dtime; } static void tab_cross_corr_factor(t_tab_cross_corr *x, t_floatarg factor) { x->x_factor = factor; } static void tab_cross_corr_src1(t_tab_cross_corr *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_cross_corr_src2(t_tab_cross_corr *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_cross_corr_dst(t_tab_cross_corr *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_cross_corr_bang(t_tab_cross_corr *x) { int i, j, m, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; t_float sum, f; ok_src1 = iem_tab_check_arrays(gensym("tab_cross_corr"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_cross_corr"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_cross_corr"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 > x->x_size_src2) n = x->x_size_src1 - x->x_size_src2; else n = 0; if(n > x->x_size_dst) x->x_n = x->x_size_dst; else x->x_n = n; f = x->x_factor; if(n) { if(x->x_delay == 0.0f) { t_garray *a; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; m = x->x_size_src2; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } else { x->x_counter = 0; vec_src1 = x->x_beg_mem_src1 + x->x_counter; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst + x->x_counter; m = x->x_size_src2; sum = 0.0f; for(j=0; jx_clock, x->x_delay); } } } } static void tab_cross_corr_free(t_tab_cross_corr *x) { clock_free(x->x_clock); } static void *tab_cross_corr_new(t_symbol *s, int argc, t_atom *argv) { t_tab_cross_corr *x = (t_tab_cross_corr *)pd_new(tab_cross_corr_class); t_symbol *src1, *src2, *dst; t_float dtime=0.0f, factor=1.0f; if((argc >= 5) && IS_A_FLOAT(argv,4)) dtime = (t_float)atom_getfloatarg(4, argc, argv); if((argc >= 4) && IS_A_FLOAT(argv,3)) factor = (t_float)atom_getfloatarg(3, argc, argv); if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else { post("tab_cross_corr-ERROR: need 3 symbol + 2 float arguments:"); post(" source_reference_array_name + source_measure_array_name + destination_array_name + norm_factor + calculation-time-per-sample_ms"); return(0); } if(dtime < 0.0f) dtime = 0.0f; x->x_delay = dtime; x->x_factor = factor; x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); x->x_clock = clock_new(x, (t_method)tab_cross_corr_tick); return(x); } void tab_cross_corr_setup(void) { tab_cross_corr_class = class_new(gensym("tab_cross_corr"), (t_newmethod)tab_cross_corr_new, (t_method)tab_cross_corr_free, sizeof(t_tab_cross_corr), 0, A_GIMME, 0); class_addbang(tab_cross_corr_class, (t_method)tab_cross_corr_bang); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_time, gensym("time"), A_DEFFLOAT, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_factor, gensym("factor"), A_DEFFLOAT, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_cross_corr_class, (t_method)tab_cross_corr_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_cross_corr_class, gensym("iemhelp2/tab_cross_corr-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_dbtopow.c0000600000000000000000000001144414665566711016047 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_dbtopow ------------------------------ */ typedef struct _tab_dbtopow { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_dbtopow; static t_class *tab_dbtopow_class; static void tab_dbtopow_src(t_tab_dbtopow *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_dbtopow_dst(t_tab_dbtopow *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_dbtopow_bang(t_tab_dbtopow *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i 870.0) f = 870.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.1) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_dbtopow_list(t_tab_dbtopow *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_dbtopow"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i 870.0) f = 870.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.1) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_dbtopow-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_dbtopow"); } } static void tab_dbtopow_free(t_tab_dbtopow *x) { } static void *tab_dbtopow_new(t_symbol *s, int argc, t_atom *argv) { t_tab_dbtopow *x = (t_tab_dbtopow *)pd_new(tab_dbtopow_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_dbtopow-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_dbtopow_setup(void) { tab_dbtopow_class = class_new(gensym("tab_dbtopow"), (t_newmethod)tab_dbtopow_new, (t_method)tab_dbtopow_free, sizeof(t_tab_dbtopow), 0, A_GIMME, 0); class_addbang(tab_dbtopow_class, (t_method)tab_dbtopow_bang); class_addlist(tab_dbtopow_class, (t_method)tab_dbtopow_list); class_addmethod(tab_dbtopow_class, (t_method)tab_dbtopow_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtopow_class, (t_method)tab_dbtopow_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtopow_class, (t_method)tab_dbtopow_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_dbtorms.c0000600000000000000000000001153214665566711016041 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_dbtorms ------------------------------ */ /* x_beg_mem_dst[i] = sqrt(x_beg_mem_src1[i]) */ typedef struct _tab_dbtorms { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_dbtorms; static t_class *tab_dbtorms_class; static void tab_dbtorms_src(t_tab_dbtorms *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_dbtorms_dst(t_tab_dbtorms *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_dbtorms_bang(t_tab_dbtorms *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i 485.0) f = 485.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.05) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_dbtorms_list(t_tab_dbtorms *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_dbtorms"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i 485.0) f = 485.0; iemarray_setfloat(vec_dst, i, exp((IEMTABLOGTEN * 0.05) * (f-100.0))); } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_dbtorms-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_dbtorms"); } } static void tab_dbtorms_free(t_tab_dbtorms *x) { } static void *tab_dbtorms_new(t_symbol *s, int argc, t_atom *argv) { t_tab_dbtorms *x = (t_tab_dbtorms *)pd_new(tab_dbtorms_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_dbtorms-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_dbtorms_setup(void) { tab_dbtorms_class = class_new(gensym("tab_dbtorms"), (t_newmethod)tab_dbtorms_new, (t_method)tab_dbtorms_free, sizeof(t_tab_dbtorms), 0, A_GIMME, 0); class_addbang(tab_dbtorms_class, (t_method)tab_dbtorms_bang); class_addlist(tab_dbtorms_class, (t_method)tab_dbtorms_list); class_addmethod(tab_dbtorms_class, (t_method)tab_dbtorms_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtorms_class, (t_method)tab_dbtorms_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_dbtorms_class, (t_method)tab_dbtorms_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_div.c0000600000000000000000000001306314665566711015152 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_div ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i]/x_offset_src2[i] */ typedef struct _tab_div { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_div; static t_class *tab_div_class; static void tab_div_src1(t_tab_div *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_div_src2(t_tab_div *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_div_dst(t_tab_div *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_div_bang(t_tab_div *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_div_list(t_tab_div *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_div"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_div-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_div"); } } static void tab_div_free(t_tab_div *x) { } static void *tab_div_new(t_symbol *s, int argc, t_atom *argv) { t_tab_div *x = (t_tab_div *)pd_new(tab_div_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_div-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_div_setup(void) { tab_div_class = class_new(gensym("tab_div"), (t_newmethod)tab_div_new, (t_method)tab_div_free, sizeof(t_tab_div), 0, A_GIMME, 0); class_addbang(tab_div_class, (t_method)tab_div_bang); class_addlist(tab_div_class, (t_method)tab_div_list); class_addmethod(tab_div_class, (t_method)tab_div_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_div_class, (t_method)tab_div_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_div_class, (t_method)tab_div_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_div_class, gensym("iemhelp2/tab_div-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_eq.c0000600000000000000000000001307414665566711014777 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_eq ------------------------------ */ /* if(x_beg_mem_src1[i] == x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_eq { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_eq; static t_class *tab_eq_class; static void tab_eq_src1(t_tab_eq *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_eq_src2(t_tab_eq *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_eq_dst(t_tab_eq *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_eq_bang(t_tab_eq *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_eq_list(t_tab_eq *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_eq"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_eq-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_eq_free(t_tab_eq *x) { } static void *tab_eq_new(t_symbol *s, int argc, t_atom *argv) { t_tab_eq *x = (t_tab_eq *)pd_new(tab_eq_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_eq-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_eq_setup(void) { tab_eq_class = class_new(gensym("tab_eq"), (t_newmethod)tab_eq_new, (t_method)tab_eq_free, sizeof(t_tab_eq), 0, A_GIMME, 0); class_addbang(tab_eq_class, (t_method)tab_eq_bang); class_addlist(tab_eq_class, (t_method)tab_eq_list); class_addmethod(tab_eq_class, (t_method)tab_eq_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_class, (t_method)tab_eq_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_class, (t_method)tab_eq_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_eq_class, gensym("iemhelp2/tab_eq-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_eq_scalar.c0000600000000000000000000001173214665566711016323 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_eq_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] == compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_eq_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_eq_scalar; static t_class *tab_eq_scalar_class; static void tab_eq_scalar_src(t_tab_eq_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_eq_scalar_float(t_tab_eq_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_eq_scalar_dst(t_tab_eq_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_eq_scalar_list(t_tab_eq_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; t_float compare; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_eq_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_eq_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_eq_scalar_free(t_tab_eq_scalar *x) { } static void *tab_eq_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_eq_scalar *x = (t_tab_eq_scalar *)pd_new(tab_eq_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_eq_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_eq_scalar_setup(void) { tab_eq_scalar_class = class_new(gensym("tab_eq_scalar"), (t_newmethod)tab_eq_scalar_new, (t_method)tab_eq_scalar_free, sizeof(t_tab_eq_scalar), 0, A_GIMME, 0); class_addfloat(tab_eq_scalar_class, (t_method)tab_eq_scalar_float); class_addlist(tab_eq_scalar_class, (t_method)tab_eq_scalar_list); class_addmethod(tab_eq_scalar_class, (t_method)tab_eq_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_scalar_class, (t_method)tab_eq_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_eq_scalar_class, (t_method)tab_eq_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_eq_scalar_class, gensym("iemhelp2/tab_eq_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_fft.c0000600000000000000000000002774314665566711015161 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_fft ------------------------------ */ /* complex FFT */ typedef struct _tab_fft { t_object x_obj; int x_size_src_re; int x_size_src_im; int x_size_dst_re; int x_size_dst_im; int x_offset_src_re; int x_offset_src_im; int x_offset_dst_re; int x_offset_dst_im; int x_fftsize; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src_re; t_symbol *x_sym_src_im; t_symbol *x_sym_dst_re; t_symbol *x_sym_dst_im; } t_tab_fft; static t_class *tab_fft_class; static void tab_fft_init(t_tab_fft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_fftsize = i; } tab_fft_init(x); } static void tab_fft_src_re(t_tab_fft *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_fft_src_im(t_tab_fft *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_fft_dst_re(t_tab_fft *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_fft_dst_im(t_tab_fft *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_fft_bang(t_tab_fft *x) { int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; ok_src_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re; vec_src_im=x->x_beg_mem_src_im; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } static void tab_fft_list(t_tab_fft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src_re, beg_src_im, beg_dst_re, beg_dst_im; int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst_re = (int)atom_getintarg(2, argc, argv); beg_dst_im = (int)atom_getintarg(3, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_dst_im < 0) beg_dst_im = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, beg_src_re+fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, beg_src_im+fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_fft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re + beg_src_re; vec_src_im=x->x_beg_mem_src_im + beg_src_im; vec_dst_re=x->x_beg_mem_dst_re + beg_dst_re; vec_dst_im=x->x_beg_mem_dst_im + beg_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } else { post("tab_fft-ERROR: list need 4 float arguments:"); post(" source_real_offset + source_imag_offset + destination_real_offset + destination_imag_offset"); } } static void tab_fft_free(t_tab_fft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); } static void *tab_fft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_fft *x = (t_tab_fft *)pd_new(tab_fft_class); t_symbol *src_re, *src_im, *dst_re, *dst_im; int fftsize, i=1; if((argc >= 5) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_FLOAT(argv,4)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); fftsize = (int)atom_getintarg(4, argc, argv); } else { post("tab_fft-ERROR: need 4 symbols + 1 float arguments:"); post(" source_real_array_name + source_imag_array_name + destination_real_array_name + destination_imag_array_name + FFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); tab_fft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_fft_setup(void) { tab_fft_class = class_new(gensym("tab_fft"), (t_newmethod)tab_fft_new, (t_method)tab_fft_free, sizeof(t_tab_fft), 0, A_GIMME, 0); class_addbang(tab_fft_class, (t_method)tab_fft_bang); class_addlist(tab_fft_class, (t_method)tab_fft_list); class_addmethod(tab_fft_class, (t_method)tab_fft_fftsize, gensym("fftsize"), A_DEFFLOAT, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_re, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_src_im, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_re, gensym("dst1"), A_DEFSYMBOL, 0); class_addmethod(tab_fft_class, (t_method)tab_fft_dst_im, gensym("dst2"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_find_exact_peaks.c0000600000000000000000000002747014665566711017666 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_find_exact_peaks ------------------------------ */ #define IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_AMP 0 #define IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_FREQ 1 typedef struct _tab_find_exact_peaks { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; int x_work_alloc; int *x_beg_mem_work1; t_float *x_beg_mem_work2; int x_sort_mode; t_float x_hdiff; int x_min_width; int x_max_width; int x_n_peaks; t_symbol *x_sym_scr1; t_outlet *x_bang_out; t_outlet *x_sort_index_out; t_outlet *x_peak_value_out; t_outlet *x_peak_index_out; } t_tab_find_exact_peaks; static t_class *tab_find_exact_peaks_class; static void tab_find_exact_peaks_max_peaks(t_tab_find_exact_peaks *x, t_floatarg fmax_peaks) { int max_peaks = (int)fmax_peaks; if(max_peaks <= 0) max_peaks = 1; x->x_n_peaks = max_peaks; } static void tab_find_exact_peaks_width_range(t_tab_find_exact_peaks *x, t_symbol *s, int argc, t_atom *argv) { int minw, maxw, h; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { minw = (int)atom_getintarg(0, argc, argv); maxw = (int)atom_getintarg(1, argc, argv); if(minw <= 0) minw = 1; if(maxw <= 0) maxw = 1; if(minw > maxw) { h = minw; minw = maxw; maxw = h; } x->x_min_width = minw; x->x_max_width = maxw; } } static void tab_find_exact_peaks_abs_min_height_diff(t_tab_find_exact_peaks *x, t_floatarg height_diff) { if(height_diff < 0.0f) height_diff *= -1.0f; x->x_hdiff = height_diff; } static void tab_find_exact_peaks_amp_sort(t_tab_find_exact_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_AMP; } static void tab_find_exact_peaks_freq_sort(t_tab_find_exact_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_FREQ; } static void tab_find_exact_peaks_src(t_tab_find_exact_peaks *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_find_exact_peaks_bang(t_tab_find_exact_peaks *x) { int i, n, w, ww; int ok_src, peak_index=0; t_float *vec_work2; iemarray_t *vec_src; int *vec_work1; t_float max=-1.0e37; int max_peaks=x->x_n_peaks; int min_width=x->x_min_width; int max_width=x->x_max_width; t_float abs_min_height_diff=x->x_hdiff; ok_src = iem_tab_check_arrays(gensym("tab_find_exact_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; if(n) { if(!x->x_work_alloc) { x->x_beg_mem_work1 = (int *)getbytes(n * sizeof(int)); x->x_beg_mem_work2 = (t_float *)getbytes(n * sizeof(t_float)); x->x_work_alloc = n; } else if(n != x->x_work_alloc) { x->x_beg_mem_work1 = (int *)resizebytes(x->x_beg_mem_work1, x->x_work_alloc*sizeof(int), n*sizeof(int)); x->x_beg_mem_work2 = (t_float *)resizebytes(x->x_beg_mem_work2, x->x_work_alloc*sizeof(t_float), n*sizeof(t_float)); x->x_work_alloc = n; } vec_src = x->x_beg_mem_src1; vec_work1 = x->x_beg_mem_work1; vec_work2 = x->x_beg_mem_work2; if(x->x_sort_mode == IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_FREQ) // FREQ_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; ix_peak_value_out, iemarray_getfloat(vec_src, i)); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); sort_index++; } else i = n+1; } old = vec_work1[i]; } outlet_bang(x->x_bang_out); } // FREQ_SORT END else if(x->x_sort_mode == IEMLIB_TAB_FIND_EXACT_PEAKS_SORT_MODE_AMP) // AMP_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; i max) { max = vec_work2[i]; peak_index = i; } } } if(peak_index >= 0) { outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); vec_work1[peak_index] = 0; vec_work2[peak_index] = 0.0f; j=peak_index+1; while(vec_work1[j]) { vec_work1[j] = 0; j++; } j=peak_index-1; while(vec_work1[j]) { vec_work1[j] = 0; j--; } } else sort_index = max_peaks+1; } outlet_bang(x->x_bang_out); } } // AMP_SORT END } /* [n] zu [n-1] u. [n+1] (ww=0)(w=1)(beg=1)(end=n-1) [n-1] u. [n] zu [n-2] u. [n+1] (ww=0)(w=2)(beg=2)(end=n-1) [n] u. [n+1] zu [n-1] u. [n+2] (ww=1)(w=2)(beg=1)(end=n-2) [n-2] u. [n-1] u. [n] zu [n-3] u. [n+1] (ww=0)(w=3)(beg=3)(end=n-1) [n-1] u. [n] u. [n+1] zu [n-2] u. [n+2] (ww=1)(w=3)(beg=2)(end=n-2) [n] u. [n+1] u. [n+2] zu [n-1] u. [n+3] (ww=2)(w=3)(beg=1)(end=n-3) */ } /*static void tab_find_exact_peaks_list(t_tab_find_exact_peaks *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, max_index=0; t_float *vec_src; t_float max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_find_exact_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) { max = vec_src[i]; max_index = i + beg_src; } } outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } else { post("tab_find_exact_peaks-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_max_index"); } }*/ static void tab_find_exact_peaks_free(t_tab_find_exact_peaks *x) { if(x->x_work_alloc) { freebytes(x->x_beg_mem_work1, x->x_work_alloc * sizeof(int)); freebytes(x->x_beg_mem_work2, x->x_work_alloc * sizeof(t_float)); } } static void *tab_find_exact_peaks_new(t_symbol *s, int argc, t_atom *argv) { t_tab_find_exact_peaks *x = (t_tab_find_exact_peaks *)pd_new(tab_find_exact_peaks_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_find_exact_peaks-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_work_alloc = 0; x->x_beg_mem_work1 = (int *)0; x->x_beg_mem_work2 = (t_float *)0; x->x_sym_scr1 = src; x->x_bang_out = (t_outlet *)outlet_new(&x->x_obj, &s_bang); // ready x->x_sort_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // sort index x->x_peak_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // freq x->x_peak_value_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // value return(x); } void tab_find_exact_peaks_setup(void) { tab_find_exact_peaks_class = class_new(gensym("tab_find_exact_peaks"), (t_newmethod)tab_find_exact_peaks_new, (t_method)tab_find_exact_peaks_free, sizeof(t_tab_find_exact_peaks), 0, A_GIMME, 0); class_addbang(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_bang); /*class_addlist(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_list);*/ class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_max_peaks, gensym("max_peaks"), A_DEFFLOAT, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_width_range, gensym("width_range"), A_GIMME, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_abs_min_height_diff, gensym("abs_min_height_diff"), A_DEFFLOAT, 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_amp_sort, gensym("amp_sort"), 0); class_addmethod(tab_find_exact_peaks_class, (t_method)tab_find_exact_peaks_freq_sort, gensym("freq_sort"), 0); // class_sethelpsymbol(tab_find_exact_peaks_class, gensym("iemhelp2/help-tab_find_exact_peaks")); } iem_utils-0.0.20240903/iem_tab/src/tab_find_peaks.c0000600000000000000000000002670614665566711016503 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_find_peaks ------------------------------ */ #define IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP 0 #define IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ 1 typedef struct _tab_find_peaks { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; int x_work_alloc; int *x_beg_mem_work1; t_float *x_beg_mem_work2; int x_sort_mode; t_float x_hdiff; int x_min_width; int x_max_width; int x_n_peaks; t_symbol *x_sym_scr1; t_outlet *x_bang_out; t_outlet *x_sort_index_out; t_outlet *x_peak_value_out; t_outlet *x_peak_index_out; } t_tab_find_peaks; static t_class *tab_find_peaks_class; static void tab_find_peaks_max_peaks(t_tab_find_peaks *x, t_floatarg fmax_peaks) { int max_peaks = (int)fmax_peaks; if(max_peaks <= 0) max_peaks = 1; x->x_n_peaks = max_peaks; } static void tab_find_peaks_width_range(t_tab_find_peaks *x, t_symbol *s, int argc, t_atom *argv) { int minw, maxw, h; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { minw = (int)atom_getintarg(0, argc, argv); maxw = (int)atom_getintarg(1, argc, argv); if(minw <= 0) minw = 1; if(maxw <= 0) maxw = 1; if(minw > maxw) { h = minw; minw = maxw; maxw = h; } x->x_min_width = minw; x->x_max_width = maxw; } } static void tab_find_peaks_abs_min_height_diff(t_tab_find_peaks *x, t_floatarg height_diff) { if(height_diff < 0.0f) height_diff *= -1.0f; x->x_hdiff = height_diff; } static void tab_find_peaks_amp_sort(t_tab_find_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP; } static void tab_find_peaks_freq_sort(t_tab_find_peaks *x) { x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ; } static void tab_find_peaks_src(t_tab_find_peaks *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_find_peaks_bang(t_tab_find_peaks *x) { int i, n, w, ww; int ok_src, peak_index=0; iemarray_t *vec_src; t_float *vec_work2; int *vec_work1; t_float max=-1.0e37; int max_peaks=x->x_n_peaks; int min_width=x->x_min_width; int max_width=x->x_max_width; t_float abs_min_height_diff=x->x_hdiff; ok_src = iem_tab_check_arrays(gensym("tab_find_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; if(n) { if(!x->x_work_alloc) { x->x_beg_mem_work1 = (int *)getbytes(n * sizeof(int)); x->x_beg_mem_work2 = (t_float *)getbytes(n * sizeof(t_float)); x->x_work_alloc = n; } else if(n != x->x_work_alloc) { x->x_beg_mem_work1 = (int *)resizebytes(x->x_beg_mem_work1, x->x_work_alloc*sizeof(int), n*sizeof(int)); x->x_beg_mem_work2 = (t_float *)resizebytes(x->x_beg_mem_work2, x->x_work_alloc*sizeof(t_float), n*sizeof(t_float)); x->x_work_alloc = n; } vec_src = x->x_beg_mem_src1; vec_work1 = x->x_beg_mem_work1; vec_work2 = x->x_beg_mem_work2; if(x->x_sort_mode == IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ) // FREQ_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; ix_peak_value_out, iemarray_getfloat(vec_src, i)); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); sort_index++; } else i = n+1; } old = vec_work1[i]; } outlet_bang(x->x_bang_out); } // FREQ_SORT END else if(x->x_sort_mode == IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP) // AMP_SORT BEGIN { int sort_index=1,old=0,j; for(i=0; i max) { max = vec_work2[i]; peak_index = i; } } } if(peak_index >= 0) { outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)peak_index); outlet_float(x->x_sort_index_out, sort_index); vec_work1[peak_index] = 0; vec_work2[peak_index] = 0.0f; j=peak_index+1; while(vec_work1[j]) { vec_work1[j] = 0; j++; } j=peak_index-1; while(vec_work1[j]) { vec_work1[j] = 0; j--; } } else sort_index = max_peaks+1; } outlet_bang(x->x_bang_out); } } // AMP_SORT END } /* [n] zu [n-1] u. [n+1] (ww=0)(w=1)(beg=1)(end=n-1) [n-1] u. [n] zu [n-2] u. [n+1] (ww=0)(w=2)(beg=2)(end=n-1) [n] u. [n+1] zu [n-1] u. [n+2] (ww=1)(w=2)(beg=1)(end=n-2) [n-2] u. [n-1] u. [n] zu [n-3] u. [n+1] (ww=0)(w=3)(beg=3)(end=n-1) [n-1] u. [n] u. [n+1] zu [n-2] u. [n+2] (ww=1)(w=3)(beg=2)(end=n-2) [n] u. [n+1] u. [n+2] zu [n-1] u. [n+3] (ww=2)(w=3)(beg=1)(end=n-3) */ } /*static void tab_find_peaks_list(t_tab_find_peaks *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, max_index=0; t_float *vec_src; t_float max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_find_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) { max = vec_src[i]; max_index = i + beg_src; } } outlet_float(x->x_peak_value_out, max); outlet_float(x->x_peak_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } else { post("tab_find_peaks-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_max_index"); } }*/ static void tab_find_peaks_free(t_tab_find_peaks *x) { if(x->x_work_alloc) { freebytes(x->x_beg_mem_work1, x->x_work_alloc * sizeof(int)); freebytes(x->x_beg_mem_work2, x->x_work_alloc * sizeof(t_float)); } } static void *tab_find_peaks_new(t_symbol *s, int argc, t_atom *argv) { t_tab_find_peaks *x = (t_tab_find_peaks *)pd_new(tab_find_peaks_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_find_peaks-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_work_alloc = 0; x->x_beg_mem_work1 = (int *)0; x->x_beg_mem_work2 = (t_float *)0; x->x_sym_scr1 = src; x->x_bang_out = (t_outlet *)outlet_new(&x->x_obj, &s_bang); // ready x->x_sort_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // sort index x->x_peak_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // freq x->x_peak_value_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // value return(x); } void tab_find_peaks_setup(void) { tab_find_peaks_class = class_new(gensym("tab_find_peaks"), (t_newmethod)tab_find_peaks_new, (t_method)tab_find_peaks_free, sizeof(t_tab_find_peaks), 0, A_GIMME, 0); class_addbang(tab_find_peaks_class, (t_method)tab_find_peaks_bang); /*class_addlist(tab_find_peaks_class, (t_method)tab_find_peaks_list);*/ class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_max_peaks, gensym("max_peaks"), A_DEFFLOAT, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_width_range, gensym("width_range"), A_GIMME, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_abs_min_height_diff, gensym("abs_min_height_diff"), A_DEFFLOAT, 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_amp_sort, gensym("amp_sort"), 0); class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_freq_sort, gensym("freq_sort"), 0); // class_sethelpsymbol(tab_find_peaks_class, gensym("iemhelp2/tab_find_peaks-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_ge.c0000600000000000000000000001307414665566711014765 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ge ------------------------------ */ /* if(x_beg_mem_src1[i] >= x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_ge { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_ge; static t_class *tab_ge_class; static void tab_ge_src1(t_tab_ge *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ge_src2(t_tab_ge *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_ge_dst(t_tab_ge *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ge_bang(t_tab_ge *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i= iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ge_list(t_tab_ge *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_ge"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i= iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ge-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_ge_free(t_tab_ge *x) { } static void *tab_ge_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ge *x = (t_tab_ge *)pd_new(tab_ge_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_ge-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ge_setup(void) { tab_ge_class = class_new(gensym("tab_ge"), (t_newmethod)tab_ge_new, (t_method)tab_ge_free, sizeof(t_tab_ge), 0, A_GIMME, 0); class_addbang(tab_ge_class, (t_method)tab_ge_bang); class_addlist(tab_ge_class, (t_method)tab_ge_list); class_addmethod(tab_ge_class, (t_method)tab_ge_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_class, (t_method)tab_ge_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_class, (t_method)tab_ge_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ge_class, gensym("iemhelp2/tab_ge-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_ge_scalar.c0000600000000000000000000001173214665566711016311 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ge_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] >= compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_ge_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_ge_scalar; static t_class *tab_ge_scalar_class; static void tab_ge_scalar_src(t_tab_ge_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ge_scalar_float(t_tab_ge_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i= compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ge_scalar_dst(t_tab_ge_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ge_scalar_list(t_tab_ge_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_ge_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i= compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ge_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_ge_scalar_free(t_tab_ge_scalar *x) { } static void *tab_ge_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ge_scalar *x = (t_tab_ge_scalar *)pd_new(tab_ge_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_ge_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ge_scalar_setup(void) { tab_ge_scalar_class = class_new(gensym("tab_ge_scalar"), (t_newmethod)tab_ge_scalar_new, (t_method)tab_ge_scalar_free, sizeof(t_tab_ge_scalar), 0, A_GIMME, 0); class_addfloat(tab_ge_scalar_class, (t_method)tab_ge_scalar_float); class_addlist(tab_ge_scalar_class, (t_method)tab_ge_scalar_list); class_addmethod(tab_ge_scalar_class, (t_method)tab_ge_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_scalar_class, (t_method)tab_ge_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_ge_scalar_class, (t_method)tab_ge_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ge_scalar_class, gensym("iemhelp2/tab_ge_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_get_size.c0000600000000000000000000000360214665566711016177 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_get_size ------------------------------ */ typedef struct _tab_get_size { t_object x_obj; t_symbol *x_sym_src; } t_tab_get_size; static t_class *tab_get_size_class; static void tab_get_size_set(t_tab_get_size *x, t_symbol *s) { x->x_sym_src = s; } static void tab_get_size_bang(t_tab_get_size *x) { int ok_src, size_src; iemarray_t *beg_mem_src; ok_src = iem_tab_check_arrays(gensym("tab_get_size"), x->x_sym_src, &beg_mem_src, &size_src, 0); if(ok_src) { outlet_float(x->x_obj.ob_outlet, (t_float)size_src); } } static void tab_get_size_free(t_tab_get_size *x) { } static void *tab_get_size_new(t_symbol *s, int argc, t_atom *argv) { t_tab_get_size *x = (t_tab_get_size *)pd_new(tab_get_size_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_get_size-ERROR: need 1 symbol argument:"); post(" destination_array_name"); return(0); } x->x_sym_src = src; outlet_new(&x->x_obj, &s_float); return(x); } void tab_get_size_setup(void) { tab_get_size_class = class_new(gensym("tab_get_size"), (t_newmethod)tab_get_size_new, (t_method)tab_get_size_free, sizeof(t_tab_get_size), 0, A_GIMME, 0); class_addbang(tab_get_size_class, (t_method)tab_get_size_bang); class_addmethod(tab_get_size_class, (t_method)tab_get_size_set, gensym("set"), A_DEFSYMBOL, 0); class_addmethod(tab_get_size_class, (t_method)tab_get_size_set, gensym("get"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_get_size_class, gensym("iemhelp2/tab_get_size-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_gt.c0000600000000000000000000001307114665566711015001 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_gt ------------------------------ */ /* if(x_beg_mem_src1[i] > x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_gt { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_gt; static t_class *tab_gt_class; static void tab_gt_src1(t_tab_gt *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_gt_src2(t_tab_gt *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_gt_dst(t_tab_gt *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_gt_bang(t_tab_gt *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_gt_list(t_tab_gt *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_gt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i iemarray_getfloat(vec_src2, i)) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_gt-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_gt_free(t_tab_gt *x) { } static void *tab_gt_new(t_symbol *s, int argc, t_atom *argv) { t_tab_gt *x = (t_tab_gt *)pd_new(tab_gt_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_gt-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_gt_setup(void) { tab_gt_class = class_new(gensym("tab_gt"), (t_newmethod)tab_gt_new, (t_method)tab_gt_free, sizeof(t_tab_gt), 0, A_GIMME, 0); class_addbang(tab_gt_class, (t_method)tab_gt_bang); class_addlist(tab_gt_class, (t_method)tab_gt_list); class_addmethod(tab_gt_class, (t_method)tab_gt_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_class, (t_method)tab_gt_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_class, (t_method)tab_gt_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_gt_class, gensym("iemhelp2/tab_gt-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_gt_scalar.c0000600000000000000000000001172714665566711016334 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_gt_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] > compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_gt_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_gt_scalar; static t_class *tab_gt_scalar_class; static void tab_gt_scalar_src(t_tab_gt_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_gt_scalar_float(t_tab_gt_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_gt_scalar_dst(t_tab_gt_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_gt_scalar_list(t_tab_gt_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_gt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i compare) iemarray_setfloat(vec_dst, i, 1.0f); else iemarray_setfloat(vec_dst, i, 0.0f); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_gt_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_gt_scalar_free(t_tab_gt_scalar *x) { } static void *tab_gt_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_gt_scalar *x = (t_tab_gt_scalar *)pd_new(tab_gt_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_gt_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_gt_scalar_setup(void) { tab_gt_scalar_class = class_new(gensym("tab_gt_scalar"), (t_newmethod)tab_gt_scalar_new, (t_method)tab_gt_scalar_free, sizeof(t_tab_gt_scalar), 0, A_GIMME, 0); class_addfloat(tab_gt_scalar_class, (t_method)tab_gt_scalar_float); class_addlist(tab_gt_scalar_class, (t_method)tab_gt_scalar_list); class_addmethod(tab_gt_scalar_class, (t_method)tab_gt_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_scalar_class, (t_method)tab_gt_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_gt_scalar_class, (t_method)tab_gt_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_gt_scalar_class, gensym("iemhelp2/tab_gt_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_ifft.c0000600000000000000000000003074314665566711015324 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_ifft ------------------------------ */ /* complex inverse FFT */ typedef struct _tab_ifft { t_object x_obj; int x_size_src_re; int x_size_src_im; int x_size_dst_re; int x_size_dst_im; int x_offset_src_re; int x_offset_src_im; int x_offset_dst_re; int x_offset_dst_im; int x_fftsize; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src_re; t_symbol *x_sym_src_im; t_symbol *x_sym_dst_re; t_symbol *x_sym_dst_im; } t_tab_ifft; static t_class *tab_ifft_class; static void tab_ifft_init(t_tab_ifft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_fftsize = i; } tab_ifft_init(x); } static void tab_ifft_dst_re(t_tab_ifft *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_ifft_dst_im(t_tab_ifft *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_ifft_src_re(t_tab_ifft *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_ifft_src_im(t_tab_ifft *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_ifft_bang(t_tab_ifft *x) { int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; ok_src_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re; vec_src_im=x->x_beg_mem_src_im; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; for(j=0; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); iemarray_setfloat(vec_dst_im, i, iemarray_getfloat(vec_dst_im, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } static void tab_ifft_list(t_tab_ifft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src_re, beg_src_im, beg_dst_re, beg_dst_im; int i, j, k; int ok_src_re, ok_src_im, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst_re = (int)atom_getintarg(2, argc, argv); beg_dst_im = (int)atom_getintarg(3, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_dst_im < 0) beg_dst_im = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_ifft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src_re && ok_src_im && ok_dst_re && ok_dst_im) { t_garray *a; vec_src_re=x->x_beg_mem_src_re + beg_src_re; vec_src_im=x->x_beg_mem_src_im + beg_src_im; vec_dst_re=x->x_beg_mem_dst_re + beg_dst_re; vec_dst_im=x->x_beg_mem_dst_im + beg_dst_im; for(j=0; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); iemarray_setfloat(vec_dst_im, i, iemarray_getfloat(vec_dst_im, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } else { post("tab_ifft-ERROR: list need 4 float arguments:"); post(" source_real_offset + source_imag_offset + destination_real_offset + destination_imag_offset"); } } static void tab_ifft_free(t_tab_ifft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); } static void *tab_ifft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ifft *x = (t_tab_ifft *)pd_new(tab_ifft_class); t_symbol *src_re, *src_im, *dst_re, *dst_im; int fftsize, i=1; if((argc >= 5) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_SYMBOL(argv,3) && IS_A_FLOAT(argv,4)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(2, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(3, argc, argv); fftsize = (int)atom_getintarg(4, argc, argv); } else { post("tab_ifft-ERROR: need 4 symbols + 1 float arguments:"); post(" source_real_array_name + source_imag_array_name + destination_real_array_name + destination_imag_array_name + IFFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); tab_ifft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ifft_setup(void) { tab_ifft_class = class_new(gensym("tab_ifft"), (t_newmethod)tab_ifft_new, (t_method)tab_ifft_free, sizeof(t_tab_ifft), 0, A_GIMME, 0); class_addbang(tab_ifft_class, (t_method)tab_ifft_bang); class_addlist(tab_ifft_class, (t_method)tab_ifft_list); class_addmethod(tab_ifft_class, (t_method)tab_ifft_ifftsize, gensym("ifftsize"), A_DEFFLOAT, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_re, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_src_im, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_re, gensym("dst1"), A_DEFSYMBOL, 0); class_addmethod(tab_ifft_class, (t_method)tab_ifft_dst_im, gensym("dst2"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_le.c0000600000000000000000000001307414665566711014772 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_le ------------------------------ */ /* if(x_beg_mem_src1[i] <= x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_le { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_le; static t_class *tab_le_class; static void tab_le_src1(t_tab_le *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_le_src2(t_tab_le *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_le_dst(t_tab_le *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_le_bang(t_tab_le *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_le_list(t_tab_le *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_le"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_le-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_le_free(t_tab_le *x) { } static void *tab_le_new(t_symbol *s, int argc, t_atom *argv) { t_tab_le *x = (t_tab_le *)pd_new(tab_le_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_le-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_le_setup(void) { tab_le_class = class_new(gensym("tab_le"), (t_newmethod)tab_le_new, (t_method)tab_le_free, sizeof(t_tab_le), 0, A_GIMME, 0); class_addbang(tab_le_class, (t_method)tab_le_bang); class_addlist(tab_le_class, (t_method)tab_le_list); class_addmethod(tab_le_class, (t_method)tab_le_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_le_class, (t_method)tab_le_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_le_class, (t_method)tab_le_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_le_class, gensym("iemhelp2/tab_le-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_le_scalar.c0000600000000000000000000001173214665566711016316 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_le_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] <= compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_le_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_le_scalar; static t_class *tab_le_scalar_class; static void tab_le_scalar_src(t_tab_le_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_le_scalar_float(t_tab_le_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_le_scalar_dst(t_tab_le_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_le_scalar_list(t_tab_le_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_le_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_le_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_le_scalar_free(t_tab_le_scalar *x) { } static void *tab_le_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_le_scalar *x = (t_tab_le_scalar *)pd_new(tab_le_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_le_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_le_scalar_setup(void) { tab_le_scalar_class = class_new(gensym("tab_le_scalar"), (t_newmethod)tab_le_scalar_new, (t_method)tab_le_scalar_free, sizeof(t_tab_le_scalar), 0, A_GIMME, 0); class_addfloat(tab_le_scalar_class, (t_method)tab_le_scalar_float); class_addlist(tab_le_scalar_class, (t_method)tab_le_scalar_list); class_addmethod(tab_le_scalar_class, (t_method)tab_le_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_le_scalar_class, (t_method)tab_le_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_le_scalar_class, (t_method)tab_le_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_le_scalar_class, gensym("iemhelp2/tab_le_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_lt.c0000600000000000000000000001307214665566711015007 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_lt ------------------------------ */ /* if(x_beg_mem_src1[i] < x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_lt { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_lt; static t_class *tab_lt_class; static void tab_lt_src1(t_tab_lt *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_lt_src2(t_tab_lt *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_lt_dst(t_tab_lt *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_lt_bang(t_tab_lt *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_lt_list(t_tab_lt *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_lt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_lt-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_lt_free(t_tab_lt *x) { } static void *tab_lt_new(t_symbol *s, int argc, t_atom *argv) { t_tab_lt *x = (t_tab_lt *)pd_new(tab_lt_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_lt-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_lt_setup(void) { tab_lt_class = class_new(gensym("tab_lt"), (t_newmethod)tab_lt_new, (t_method)tab_lt_free, sizeof(t_tab_lt), 0, A_GIMME, 0); class_addbang(tab_lt_class, (t_method)tab_lt_bang); class_addlist(tab_lt_class, (t_method)tab_lt_list); class_addmethod(tab_lt_class, (t_method)tab_lt_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_class, (t_method)tab_lt_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_class, (t_method)tab_lt_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_lt_class, gensym("iemhelp2/tab_lt-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_lt_scalar.c0000600000000000000000000001172714665566711016341 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_lt_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] < compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_lt_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_lt_scalar; static t_class *tab_lt_scalar_class; static void tab_lt_scalar_src(t_tab_lt_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_lt_scalar_float(t_tab_lt_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_lt_scalar_dst(t_tab_lt_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_lt_scalar_list(t_tab_lt_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_lt_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_lt_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_lt_scalar_free(t_tab_lt_scalar *x) { } static void *tab_lt_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_lt_scalar *x = (t_tab_lt_scalar *)pd_new(tab_lt_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_lt_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_lt_scalar_setup(void) { tab_lt_scalar_class = class_new(gensym("tab_lt_scalar"), (t_newmethod)tab_lt_scalar_new, (t_method)tab_lt_scalar_free, sizeof(t_tab_lt_scalar), 0, A_GIMME, 0); class_addfloat(tab_lt_scalar_class, (t_method)tab_lt_scalar_float); class_addlist(tab_lt_scalar_class, (t_method)tab_lt_scalar_list); class_addmethod(tab_lt_scalar_class, (t_method)tab_lt_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_scalar_class, (t_method)tab_lt_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_lt_scalar_class, (t_method)tab_lt_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_lt_scalar_class, gensym("iemhelp2/tab_lt_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_max_index.c0000600000000000000000000000737214665566711016352 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_max_index ------------------------------ */ typedef struct _tab_max_index { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; t_symbol *x_sym_scr1; void *x_bang_out; void *x_max_out; void *x_max_index_out; } t_tab_max_index; static t_class *tab_max_index_class; static void tab_max_index_src(t_tab_max_index *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_max_index_bang(t_tab_max_index *x) { int i, n; int ok_src, max_index=0; iemarray_t *vec_src; t_float max=-1.0e37; ok_src = iem_tab_check_arrays(gensym("tab_max_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; i max) { max = iemarray_getfloat(vec_src, i); max_index = i; } } outlet_float(x->x_max_out, max); outlet_float(x->x_max_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } static void tab_max_index_list(t_tab_max_index *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, max_index=0; iemarray_t *vec_src; t_float max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_max_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) { max = iemarray_getfloat(vec_src, i); max_index = i + beg_src; } } outlet_float(x->x_max_out, max); outlet_float(x->x_max_index_out, (t_float)max_index); outlet_bang(x->x_bang_out); } } } else { post("tab_max_index-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_max_index"); } } static void tab_max_index_free(t_tab_max_index *x) { } static void *tab_max_index_new(t_symbol *s, int argc, t_atom *argv) { t_tab_max_index *x = (t_tab_max_index *)pd_new(tab_max_index_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_max_index-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_max_index_out = outlet_new(&x->x_obj, &s_float); x->x_max_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_max_index_setup(void) { tab_max_index_class = class_new(gensym("tab_max_index"), (t_newmethod)tab_max_index_new, (t_method)tab_max_index_free, sizeof(t_tab_max_index), 0, A_GIMME, 0); class_addbang(tab_max_index_class, (t_method)tab_max_index_bang); class_addlist(tab_max_index_class, (t_method)tab_max_index_list); class_addmethod(tab_max_index_class, (t_method)tab_max_index_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_max_index_class, (t_method)tab_max_index_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_max_index_class, gensym("iemhelp2/tab_max_index-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_min_index.c0000600000000000000000000000737114665566711016347 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_min_index ------------------------------ */ typedef struct _tab_min_index { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; t_symbol *x_sym_scr1; void *x_bang_out; void *x_min_out; void *x_min_index_out; } t_tab_min_index; static t_class *tab_min_index_class; static void tab_min_index_src(t_tab_min_index *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_min_index_bang(t_tab_min_index *x) { int i, n; int ok_src, min_index=0; iemarray_t *vec_src; t_float min=1.0e37; ok_src = iem_tab_check_arrays(gensym("tab_min_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; ix_min_out, min); outlet_float(x->x_min_index_out, (t_float)min_index); outlet_bang(x->x_bang_out); } } } static void tab_min_index_list(t_tab_min_index *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src, min_index=0; iemarray_t *vec_src; t_float min=1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_min_index"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; ix_min_out, min); outlet_float(x->x_min_index_out, (t_float)min_index); outlet_bang(x->x_bang_out); } } } else { post("tab_min_index-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_min_index"); } } static void tab_min_index_free(t_tab_min_index *x) { } static void *tab_min_index_new(t_symbol *s, int argc, t_atom *argv) { t_tab_min_index *x = (t_tab_min_index *)pd_new(tab_min_index_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_min_index-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_min_index_out = outlet_new(&x->x_obj, &s_float); x->x_min_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_min_index_setup(void) { tab_min_index_class = class_new(gensym("tab_min_index"), (t_newmethod)tab_min_index_new, (t_method)tab_min_index_free, sizeof(t_tab_min_index), 0, A_GIMME, 0); class_addbang(tab_min_index_class, (t_method)tab_min_index_bang); class_addlist(tab_min_index_class, (t_method)tab_min_index_list); class_addmethod(tab_min_index_class, (t_method)tab_min_index_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_min_index_class, (t_method)tab_min_index_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_min_index_class, gensym("iemhelp2/tab_min_index-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_min_max.c0000600000000000000000000000732214665566711016021 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_min_max ------------------------------ */ typedef struct _tab_min_max { t_object x_obj; int x_size_src1; int x_offset_src1; iemarray_t *x_beg_mem_src1; t_symbol *x_sym_scr1; void *x_bang_out; void *x_min_out; void *x_max_out; } t_tab_min_max; static t_class *tab_min_max_class; static void tab_min_max_src(t_tab_min_max *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_min_max_bang(t_tab_min_max *x) { int i, n; int ok_src; iemarray_t *vec_src; t_float min=1.0e37, max=-1.0e37; ok_src = iem_tab_check_arrays(gensym("tab_min_max"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; i max) max = iemarray_getfloat(vec_src, i); if(iemarray_getfloat(vec_src, i) < min) min = iemarray_getfloat(vec_src, i); } outlet_float(x->x_max_out, max); outlet_float(x->x_min_out, min); outlet_bang(x->x_bang_out); } } } static void tab_min_max_list(t_tab_min_max *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src; iemarray_t *vec_src; t_float min=1.0e37, max=-1.0e37; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_min_max"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; i max) max = iemarray_getfloat(vec_src, i); if(iemarray_getfloat(vec_src, i) < min) min = iemarray_getfloat(vec_src, i); } outlet_float(x->x_max_out, max); outlet_float(x->x_min_out, min); outlet_bang(x->x_bang_out); } } } else { post("tab_min_max-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_min_max"); } } static void tab_min_max_free(t_tab_min_max *x) { } static void *tab_min_max_new(t_symbol *s, int argc, t_atom *argv) { t_tab_min_max *x = (t_tab_min_max *)pd_new(tab_min_max_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_min_max-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_min_out = outlet_new(&x->x_obj, &s_float); x->x_max_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_min_max_setup(void) { tab_min_max_class = class_new(gensym("tab_min_max"), (t_newmethod)tab_min_max_new, (t_method)tab_min_max_free, sizeof(t_tab_min_max), 0, A_GIMME, 0); class_addbang(tab_min_max_class, (t_method)tab_min_max_bang); class_addlist(tab_min_max_class, (t_method)tab_min_max_list); class_addmethod(tab_min_max_class, (t_method)tab_min_max_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_min_max_class, (t_method)tab_min_max_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_min_max_class, gensym("iemhelp2/tab_min_max-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_mls.c0000600000000000000000000001151314665566711015161 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_mls ------------------------------ */ typedef struct _tab_mls { t_object x_obj; int x_size_dst; int x_offset_dst; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_dst; } t_tab_mls; static t_class *tab_mls_class; static int tab_mls_exp2(int mls_order) { int i, j=1; for(i=0; i> 1; exor = 0; for(j=0; j>= 1; } if(exor & 1) { iemarray_setfloat(vec, i, 1.0f); work1 = work2 | source; } else { iemarray_setfloat(vec, i, -1.0f); work1 = work2; } } return; } static void tab_mls_dst(t_tab_mls *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_mls_float(t_tab_mls *x, t_floatarg fmls_order) { int mls_order=(int)fmls_order; int ok_dst, mls_size; mls_size = tab_mls_exp2(mls_order) - 1; ok_dst = iem_tab_check_arrays(gensym("tab_mls"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, mls_size); if(ok_dst) { if((mls_order >= 3) && (mls_order <= 20)) { t_garray *a; tab_mls_calc(x->x_beg_mem_dst, mls_order); outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_mls_list(t_tab_mls *x, t_symbol *s, int argc, t_atom *argv) { int beg_dst; int i, n; int ok_dst; t_float c; iemarray_t *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_dst = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); c = (t_float)atom_getfloatarg(2, argc, argv); if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_dst = iem_tab_check_arrays(gensym("tab_mls"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_dst) { vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_mls-ERROR: list need 3 float arguments:"); post(" destination_offset + number_of_samples_to_copy + constant-value"); } } static void tab_mls_free(t_tab_mls *x) { } static void *tab_mls_new(t_symbol *s, int argc, t_atom *argv) { t_tab_mls *x = (t_tab_mls *)pd_new(tab_mls_class); t_symbol *dst; t_float time; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { dst = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_mls-ERROR: need 1 symbol argument:"); post(" destination_array_name"); return(0); } x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_mls_setup(void) { tab_mls_class = class_new(gensym("tab_mls"), (t_newmethod)tab_mls_new, (t_method)tab_mls_free, sizeof(t_tab_mls), 0, A_GIMME, 0); class_addfloat(tab_mls_class, (t_method)tab_mls_float); class_addlist(tab_mls_class, (t_method)tab_mls_list); class_addmethod(tab_mls_class, (t_method)tab_mls_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_mls_class, gensym("iemhelp2/tab_mls-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_mul.c0000600000000000000000000001244414665566711015167 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_mul ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i]*x_offset_src2[i] */ typedef struct _tab_mul { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_mul; static t_class *tab_mul_class; static void tab_mul_src1(t_tab_mul *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_mul_src2(t_tab_mul *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_mul_dst(t_tab_mul *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_mul_bang(t_tab_mul *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_mul_list(t_tab_mul *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_mul"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_mul-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_mul"); } } static void tab_mul_free(t_tab_mul *x) { } static void *tab_mul_new(t_symbol *s, int argc, t_atom *argv) { t_tab_mul *x = (t_tab_mul *)pd_new(tab_mul_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_mul-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_mul_setup(void) { tab_mul_class = class_new(gensym("tab_mul"), (t_newmethod)tab_mul_new, (t_method)tab_mul_free, sizeof(t_tab_mul), 0, A_GIMME, 0); class_addbang(tab_mul_class, (t_method)tab_mul_bang); class_addlist(tab_mul_class, (t_method)tab_mul_list); class_addmethod(tab_mul_class, (t_method)tab_mul_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_class, (t_method)tab_mul_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_class, (t_method)tab_mul_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_mul_class, gensym("iemhelp2/tab_mul-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_mul_scalar.c0000600000000000000000000001124314665566711016510 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_mul_scalar ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i]*m */ typedef struct _tab_mul_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_mul_scalar; static t_class *tab_mul_scalar_class; static void tab_mul_scalar_src(t_tab_mul_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_mul_scalar_float(t_tab_mul_scalar *x, t_floatarg m) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_mul_scalar_dst(t_tab_mul_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_mul_scalar_list(t_tab_mul_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float m; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); m = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_mul_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_mul_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_mul + mul_scalar"); } } static void tab_mul_scalar_free(t_tab_mul_scalar *x) { } static void *tab_mul_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_mul_scalar *x = (t_tab_mul_scalar *)pd_new(tab_mul_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_mul_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_mul_scalar_setup(void) { tab_mul_scalar_class = class_new(gensym("tab_mul_scalar"), (t_newmethod)tab_mul_scalar_new, (t_method)tab_mul_scalar_free, sizeof(t_tab_mul_scalar), 0, A_GIMME, 0); class_addfloat(tab_mul_scalar_class, (t_method)tab_mul_scalar_float); class_addlist(tab_mul_scalar_class, (t_method)tab_mul_scalar_list); class_addmethod(tab_mul_scalar_class, (t_method)tab_mul_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_scalar_class, (t_method)tab_mul_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_mul_scalar_class, (t_method)tab_mul_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_mul_scalar_class, gensym("iemhelp2/tab_mul_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_ne.c0000600000000000000000000001307514665566711014775 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ne ------------------------------ */ /* if(x_beg_mem_src1[i] != x_beg_mem_src2[i]) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] = 0.0f; */ typedef struct _tab_ne { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_ne; static t_class *tab_ne_class; static void tab_ne_src1(t_tab_ne *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ne_src2(t_tab_ne *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_ne_dst(t_tab_ne *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ne_bang(t_tab_ne *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ne_list(t_tab_ne *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_ne"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ne-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_compare"); } } static void tab_ne_free(t_tab_ne *x) { } static void *tab_ne_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ne *x = (t_tab_ne *)pd_new(tab_ne_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_ne-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ne_setup(void) { tab_ne_class = class_new(gensym("tab_ne"), (t_newmethod)tab_ne_new, (t_method)tab_ne_free, sizeof(t_tab_ne), 0, A_GIMME, 0); class_addbang(tab_ne_class, (t_method)tab_ne_bang); class_addlist(tab_ne_class, (t_method)tab_ne_list); class_addmethod(tab_ne_class, (t_method)tab_ne_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_class, (t_method)tab_ne_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_class, (t_method)tab_ne_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ne_class, gensym("iemhelp2/tab_ne-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_ne_scalar.c0000600000000000000000000001173214665566711016320 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_ne_scalar ------------------------------ */ /* if(x_beg_mem_src1[i] != compare) */ /* x_beg_mem_dst[i] = 1.0f; */ /* else */ /* x_beg_mem_dst[i] += 0.0f; */ typedef struct _tab_ne_scalar { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_ne_scalar; static t_class *tab_ne_scalar_class; static void tab_ne_scalar_src(t_tab_ne_scalar *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_ne_scalar_float(t_tab_ne_scalar *x, t_floatarg compare) { int i, n; int ok_src1, ok_dst; iemarray_t *vec_src1, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src1 = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_ne_scalar_dst(t_tab_ne_scalar *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_ne_scalar_list(t_tab_ne_scalar *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_dst; int i, n; int ok_src1, ok_dst; t_float compare; iemarray_t *vec_src1, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); compare = (t_float)atom_getfloatarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_dst = iem_tab_check_arrays(gensym("tab_ne_scalar"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_ne_scalar-ERROR: list need 4 float arguments:"); post(" source1_offset + destination_offset + number_of_samples_to_compare + compare_scalar"); } } static void tab_ne_scalar_free(t_tab_ne_scalar *x) { } static void *tab_ne_scalar_new(t_symbol *s, int argc, t_atom *argv) { t_tab_ne_scalar *x = (t_tab_ne_scalar *)pd_new(tab_ne_scalar_class); t_symbol *src1, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; } else { post("tab_ne_scalar-ERROR: need 2 symbol arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_ne_scalar_setup(void) { tab_ne_scalar_class = class_new(gensym("tab_ne_scalar"), (t_newmethod)tab_ne_scalar_new, (t_method)tab_ne_scalar_free, sizeof(t_tab_ne_scalar), 0, A_GIMME, 0); class_addfloat(tab_ne_scalar_class, (t_method)tab_ne_scalar_float); class_addlist(tab_ne_scalar_class, (t_method)tab_ne_scalar_list); class_addmethod(tab_ne_scalar_class, (t_method)tab_ne_scalar_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_scalar_class, (t_method)tab_ne_scalar_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_ne_scalar_class, (t_method)tab_ne_scalar_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_ne_scalar_class, gensym("iemhelp2/tab_ne_scalar-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_powtodb.c0000600000000000000000000001150214665566711016042 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_powtodb ------------------------------ */ /* x_beg_mem_dst[i] = sqrt(x_beg_mem_src1[i]) */ typedef struct _tab_powtodb { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_powtodb; static t_class *tab_powtodb_class; static void tab_powtodb_src(t_tab_powtodb *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_powtodb_dst(t_tab_powtodb *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_powtodb_bang(t_tab_powtodb *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_powtodb_list(t_tab_powtodb *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_powtodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_powtodb-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_sqrt"); } } static void tab_powtodb_free(t_tab_powtodb *x) { } static void *tab_powtodb_new(t_symbol *s, int argc, t_atom *argv) { t_tab_powtodb *x = (t_tab_powtodb *)pd_new(tab_powtodb_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_powtodb-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_powtodb_setup(void) { tab_powtodb_class = class_new(gensym("tab_powtodb"), (t_newmethod)tab_powtodb_new, (t_method)tab_powtodb_free, sizeof(t_tab_powtodb), 0, A_GIMME, 0); class_addbang(tab_powtodb_class, (t_method)tab_powtodb_bang); class_addlist(tab_powtodb_class, (t_method)tab_powtodb_list); class_addmethod(tab_powtodb_class, (t_method)tab_powtodb_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_powtodb_class, (t_method)tab_powtodb_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_powtodb_class, (t_method)tab_powtodb_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_reverse.c0000600000000000000000000001122514665566711016041 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_reverse ------------------------------ */ typedef struct _tab_reverse { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_reverse; static t_class *tab_reverse_class; static void tab_reverse_src(t_tab_reverse *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_reverse_dst(t_tab_reverse *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_reverse_bang(t_tab_reverse *x) { int i, j, n, n2; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; t_float f; ok_src = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; n2 = n/2; if(n) { t_garray *a; for(i=0, j=n-1; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_reverse_list(t_tab_reverse *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, j, n, n2; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; t_float f; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_reverse"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; n2 = n/2; if(n) { t_garray *a; for(i=0, j=n-1; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_reverse-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_copy"); } } static void tab_reverse_free(t_tab_reverse *x) { } static void *tab_reverse_new(t_symbol *s, int argc, t_atom *argv) { t_tab_reverse *x = (t_tab_reverse *)pd_new(tab_reverse_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_reverse-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_reverse_setup(void) { tab_reverse_class = class_new(gensym("tab_reverse"), (t_newmethod)tab_reverse_new, (t_method)tab_reverse_free, sizeof(t_tab_reverse), 0, A_GIMME, 0); class_addbang(tab_reverse_class, (t_method)tab_reverse_bang); class_addlist(tab_reverse_class, (t_method)tab_reverse_list); class_addmethod(tab_reverse_class, (t_method)tab_reverse_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_reverse_class, (t_method)tab_reverse_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_reverse_class, (t_method)tab_reverse_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_reverse_class, gensym("iemhelp2/tab_reverse-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_rfft.c0000600000000000000000000002643214665566711015335 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_rfft ------------------------------ */ /* real time domain FFT to complex spectral domain */ typedef struct _tab_rfft { t_object x_obj; int x_size_src1; int x_size_dst_re; int x_size_dst_im; int x_offset_src1; int x_offset_dst_re; int x_offset_dst_im; int x_fftsize; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src1; t_symbol *x_sym_dst_re; t_symbol *x_sym_dst_im; } t_tab_rfft; static t_class *tab_rfft_class; static void tab_rfft_init(t_tab_rfft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_fftsize = i; } tab_rfft_init(x); } static void tab_rfft_src(t_tab_rfft *x, t_symbol *s) { x->x_sym_src1 = s; } static void tab_rfft_dst_re(t_tab_rfft *x, t_symbol *s) { x->x_sym_dst_re = s; } static void tab_rfft_dst_im(t_tab_rfft *x, t_symbol *s) { x->x_sym_dst_im = s; } static void tab_rfft_bang(t_tab_rfft *x) { int i, j, k; int ok_src, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; ok_src = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_src1, &x->x_beg_mem_src1, &x->x_size_src1, fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, fftsize); if(ok_src && ok_dst_re && ok_dst_im) { t_garray *a; vec_src=x->x_beg_mem_src1; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ iemarray_setfloat(vec_dst_im, 0, 0.0); iemarray_setfloat(vec_dst_im, fs2, 0.0); for(i = fs2+1; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, 0.0); iemarray_setfloat(vec_dst_im, i, 0.0); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } static void tab_rfft_list(t_tab_rfft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst_re, beg_dst_im; int i, j, k; int ok_src, ok_dst_re, ok_dst_im; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst_re = (int)atom_getintarg(1, argc, argv); beg_dst_im = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst_re < 0) beg_dst_re = 0; if(beg_dst_im < 0) beg_dst_im = 0; ok_src = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_src1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+fftsize); ok_dst_re = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_re, &x->x_beg_mem_dst_re, &x->x_size_dst_re, beg_dst_re+fftsize); ok_dst_im = iem_tab_check_arrays(gensym("tab_rfft"), x->x_sym_dst_im, &x->x_beg_mem_dst_im, &x->x_size_dst_im, beg_dst_im+fftsize); if(ok_src && ok_dst_re && ok_dst_im) { t_garray *a; vec_src=x->x_beg_mem_src1 + beg_src; vec_dst_re=x->x_beg_mem_dst_re + beg_dst_re; vec_dst_im=x->x_beg_mem_dst_im + beg_dst_im; for(k=0; k>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ iemarray_setfloat(vec_dst_im, 0, 0.0); iemarray_setfloat(vec_dst_im, fs2, 0.0); for(i = fs2+1; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, 0.0); iemarray_setfloat(vec_dst_im, i, 0.0); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst_re, garray_class); garray_redraw(a); a = (t_garray *)pd_findbyclass(x->x_sym_dst_im, garray_class); garray_redraw(a); } } else { post("tab_rfft-ERROR: list need 3 float arguments:"); post(" source_offset + destination_real_offset + destination_imag_offset"); } } static void tab_rfft_free(t_tab_rfft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); } static void *tab_rfft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_rfft *x = (t_tab_rfft *)pd_new(tab_rfft_class); t_symbol *src, *dst_re, *dst_im; int fftsize, i=1; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_FLOAT(argv,3)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst_re = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst_im = (t_symbol *)atom_getsymbolarg(2, argc, argv); fftsize = (int)atom_getintarg(3, argc, argv); } else { post("tab_rfft-ERROR: need 3 symbols + 1 float arguments:"); post(" source_array_name + destination_real_array_name + destination_imag_array_name + FFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src1 = src; x->x_sym_dst_re = dst_re; x->x_sym_dst_im = dst_im; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); tab_rfft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_rfft_setup(void) { tab_rfft_class = class_new(gensym("tab_rfft"), (t_newmethod)tab_rfft_new, (t_method)tab_rfft_free, sizeof(t_tab_rfft), 0, A_GIMME, 0); class_addbang(tab_rfft_class, (t_method)tab_rfft_bang); class_addlist(tab_rfft_class, (t_method)tab_rfft_list); class_addmethod(tab_rfft_class, (t_method)tab_rfft_fftsize, gensym("fftsize"), A_DEFFLOAT, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_re, gensym("dst_re"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_im, gensym("dst_im"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_re, gensym("dst1"), A_DEFSYMBOL, 0); class_addmethod(tab_rfft_class, (t_method)tab_rfft_dst_im, gensym("dst2"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_rifft.c0000600000000000000000000003036614665566711015507 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_rifft ------------------------------ */ /* complex spectral domain inverse FFT to real time domain */ typedef struct _tab_rifft { t_object x_obj; int x_size_src_re; int x_size_src_im; int x_size_dst; int x_offset_src_re; int x_offset_src_im; int x_offset_dst; int x_fftsize; iemarray_t *x_beg_mem_src_re; iemarray_t *x_beg_mem_src_im; iemarray_t *x_beg_mem_dst_re; iemarray_t *x_beg_mem_dst_im; TAB_COMPLEX *x_sin_cos; t_symbol *x_sym_src_re; t_symbol *x_sym_src_im; t_symbol *x_sym_dst; } t_tab_rifft; static t_class *tab_rifft_class; static void tab_rifft_init(t_tab_rifft *x) { int i, fftsize = x->x_fftsize; t_float f, g; TAB_COMPLEX *sincos = x->x_sin_cos; g = 2.0 * 3.141592653589793 / (t_float)fftsize; for(i=0; ix_fftsize) { x->x_sin_cos = (TAB_COMPLEX *)resizebytes(x->x_sin_cos, x->x_fftsize*sizeof(TAB_COMPLEX), i*sizeof(TAB_COMPLEX)); x->x_beg_mem_dst_im = (iemarray_t *)resizebytes(x->x_beg_mem_dst_im, x->x_fftsize*sizeof(iemarray_t), i*sizeof(iemarray_t)); x->x_fftsize = i; } tab_rifft_init(x); } static void tab_rifft_dst(t_tab_rifft *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_rifft_src_re(t_tab_rifft *x, t_symbol *s) { x->x_sym_src_re = s; } static void tab_rifft_src_im(t_tab_rifft *x, t_symbol *s) { x->x_sym_src_im = s; } static void tab_rifft_bang(t_tab_rifft *x) { int i, j, k; int ok_src_re, ok_src_im, ok_dst; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; ok_src_re = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, fftsize); ok_dst = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_dst, &x->x_beg_mem_dst_re, &x->x_size_dst, fftsize); if(ok_src_re && ok_src_im && ok_dst) { t_garray *a; vec_src_re=x->x_beg_mem_src_re; vec_src_im=x->x_beg_mem_src_im; vec_dst_re=x->x_beg_mem_dst_re; vec_dst_im=x->x_beg_mem_dst_im; iemarray_setfloat(vec_dst_re, 0, iemarray_getfloat(vec_src_re, 0)); iemarray_setfloat(vec_dst_im, 0, 0.0); for(j=1; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_dst_re[i] *= g; vec_dst_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } static void tab_rifft_list(t_tab_rifft *x, t_symbol *s, int argc, t_atom *argv) { int beg_src_re, beg_src_im, beg_dst; int i, j, k; int ok_src_re, ok_src_im, ok_dst; int w_index, w_inc, i_inc, v_index; int fftsize = x->x_fftsize; int fs1 = fftsize - 1; int fs2 = fftsize / 2; TAB_COMPLEX w; TAB_COMPLEX *sincos = x->x_sin_cos; iemarray_t *vec_src_re, *vec_src_im, *vec_dst_re, *vec_dst_im; t_float old1_re, old1_im, old2_re, old2_im, g; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src_re = (int)atom_getintarg(0, argc, argv); beg_src_im = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); if(beg_src_re < 0) beg_src_re = 0; if(beg_src_im < 0) beg_src_im = 0; if(beg_dst < 0) beg_dst = 0; ok_src_re = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_re, &x->x_beg_mem_src_re, &x->x_size_src_re, beg_src_re+fftsize); ok_src_im = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_src_im, &x->x_beg_mem_src_im, &x->x_size_src_im, beg_src_im+fftsize); ok_dst = iem_tab_check_arrays(gensym("tab_rifft"), x->x_sym_dst, &x->x_beg_mem_dst_re, &x->x_size_dst, beg_dst+fftsize); if(ok_src_re && ok_src_im && ok_dst) { t_garray *a; vec_src_re=x->x_beg_mem_src_re + beg_src_re; vec_src_im=x->x_beg_mem_src_im + beg_src_im; vec_dst_re=x->x_beg_mem_dst_re + beg_dst; vec_dst_im=x->x_beg_mem_dst_im; for(j=0; j>= 1; } j = 0; for(i=1;i>= 1; } j = j + k; if(i < j) { old1_re = iemarray_getfloat(vec_dst_re, j); old1_im = iemarray_getfloat(vec_dst_im, j); iemarray_setfloat(vec_dst_re, j, iemarray_getfloat(vec_dst_re, i)); iemarray_setfloat(vec_dst_im, j, iemarray_getfloat(vec_dst_im, i)); iemarray_setfloat(vec_dst_re, i, old1_re); iemarray_setfloat(vec_dst_im, i, old1_im); } } // g = 2.0f / (t_float)fftsize; /* ein fehler tritt auf beim 0.sample, hier sollte nur mal 1.0 multipliziert werden wenn gelten soll : Energie im zeitfenster == Energie im Frequenz-dichte-fenster g = 1.0f; for(i = 0; i < fs2; i++) { vec_src_re[i] *= g; vec_src_im[i] *= g; } */ g = 1.0 / (t_float)fftsize; for(i = 0; i < fftsize; i++) { iemarray_setfloat(vec_dst_re, i, iemarray_getfloat(vec_dst_re, i)*g); } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } else { post("tab_rifft-ERROR: list need 3 float arguments:"); post(" source_real_offset + source_imag_offset + destination_offset"); } } static void tab_rifft_free(t_tab_rifft *x) { freebytes(x->x_sin_cos, x->x_fftsize * sizeof(TAB_COMPLEX)); freebytes(x->x_beg_mem_dst_im, x->x_fftsize * sizeof(t_float)); } static void *tab_rifft_new(t_symbol *s, int argc, t_atom *argv) { t_tab_rifft *x = (t_tab_rifft *)pd_new(tab_rifft_class); t_symbol *src_re, *src_im, *dst; int fftsize, i=1; if((argc >= 4) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2) && IS_A_FLOAT(argv,3)) { src_re = (t_symbol *)atom_getsymbolarg(0, argc, argv); src_im = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); fftsize = (int)atom_getintarg(3, argc, argv); } else { post("tab_rifft-ERROR: need 3 symbols + 1 float arguments:"); post(" source_real_array_name + source_imag_array_name + destination_array_name + IFFT-size"); return(0); } if(fftsize < 8) fftsize = 8; while(i <= fftsize) i *= 2; i /= 2; fftsize = i; x->x_fftsize = fftsize; x->x_sym_src_re = src_re; x->x_sym_src_im = src_im; x->x_sym_dst = dst; x->x_sin_cos = (TAB_COMPLEX *)getbytes(x->x_fftsize * sizeof(TAB_COMPLEX)); x->x_beg_mem_dst_im = (iemarray_t *)getbytes(x->x_fftsize * sizeof(iemarray_t)); tab_rifft_init(x); outlet_new(&x->x_obj, &s_bang); return(x); } void tab_rifft_setup(void) { tab_rifft_class = class_new(gensym("tab_rifft"), (t_newmethod)tab_rifft_new, (t_method)tab_rifft_free, sizeof(t_tab_rifft), 0, A_GIMME, 0); class_addbang(tab_rifft_class, (t_method)tab_rifft_bang); class_addlist(tab_rifft_class, (t_method)tab_rifft_list); class_addmethod(tab_rifft_class, (t_method)tab_rifft_ifftsize, gensym("ifftsize"), A_DEFFLOAT, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_re, gensym("src_re"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_im, gensym("src_im"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_re, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_src_im, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_dst, gensym("dst"), A_DEFSYMBOL, 0); class_addmethod(tab_rifft_class, (t_method)tab_rifft_dst, gensym("dst1"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_rmstodb.c0000600000000000000000000001142114665566711016036 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include #define IEMTABLOGTEN 2.302585092994046 /* -------------------------- tab_rmstodb ------------------------------ */ typedef struct _tab_rmstodb { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_rmstodb; static t_class *tab_rmstodb_class; static void tab_rmstodb_src(t_tab_rmstodb *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_rmstodb_dst(t_tab_rmstodb *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_rmstodb_bang(t_tab_rmstodb *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_rmstodb_list(t_tab_rmstodb *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_rmstodb"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_rmstodb-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_rmstodb"); } } static void tab_rmstodb_free(t_tab_rmstodb *x) { } static void *tab_rmstodb_new(t_symbol *s, int argc, t_atom *argv) { t_tab_rmstodb *x = (t_tab_rmstodb *)pd_new(tab_rmstodb_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_rmstodb-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_rmstodb_setup(void) { tab_rmstodb_class = class_new(gensym("tab_rmstodb"), (t_newmethod)tab_rmstodb_new, (t_method)tab_rmstodb_free, sizeof(t_tab_rmstodb), 0, A_GIMME, 0); class_addbang(tab_rmstodb_class, (t_method)tab_rmstodb_bang); class_addlist(tab_rmstodb_class, (t_method)tab_rmstodb_list); class_addmethod(tab_rmstodb_class, (t_method)tab_rmstodb_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_rmstodb_class, (t_method)tab_rmstodb_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_rmstodb_class, (t_method)tab_rmstodb_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_sqrt.c0000600000000000000000000001206314665566711015360 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" #include /* -------------------------- tab_sqrt ------------------------------ */ /* x_beg_mem_dst[i] = sqrt(x_beg_mem_src1[i]) */ typedef struct _tab_sqrt { t_object x_obj; int x_size_src1; int x_size_dst; int x_offset_src1; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_dst; } t_tab_sqrt; static t_class *tab_sqrt_class; static void tab_sqrt_src(t_tab_sqrt *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_sqrt_dst(t_tab_sqrt *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_sqrt_bang(t_tab_sqrt *x) { int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; ok_src = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_dst = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; vec_src = x->x_beg_mem_src1; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; i 0 || PD_MINOR_VERSION > 43)) t_float g = q8_rsqrt(f); iemarray_setfloat(vec_dst, i, f*g*(1.5f - 0.5f * g * g * f)); #else iemarray_setfloat(vec_dst, i, sqrt(f)); #endif } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_sqrt_list(t_tab_sqrt *x, t_symbol *s, int argc, t_atom *argv) { int beg_src, beg_dst; int i, n; int ok_src, ok_dst; iemarray_t *vec_src, *vec_dst; if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { beg_src = (int)atom_getintarg(0, argc, argv); beg_dst = (int)atom_getintarg(1, argc, argv); n = (int)atom_getintarg(2, argc, argv); if(beg_src < 0) beg_src = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); ok_dst = iem_tab_check_arrays(gensym("tab_sqrt"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src && ok_dst) { vec_src = x->x_beg_mem_src1 + beg_src; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; i 0 || PD_MINOR_VERSION > 43)) t_float g = q8_rsqrt(f); iemarray_setfloat(vec_dst, i, f*g*(1.5f - 0.5f * g * g * f)); #else iemarray_setfloat(vec_dst, i, sqrt(f)); #endif } } outlet_bang(x->x_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_sqrt-ERROR: list need 3 float arguments:"); post(" source_offset + destination_offset + number_of_samples_to_sqrt"); } } static void tab_sqrt_free(t_tab_sqrt *x) { } static void *tab_sqrt_new(t_symbol *s, int argc, t_atom *argv) { t_tab_sqrt *x = (t_tab_sqrt *)pd_new(tab_sqrt_class); t_symbol *src, *dst; if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src; } else { post("tab_sqrt-ERROR: need 2 symbols arguments:"); post(" source_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_sqrt_setup(void) { tab_sqrt_class = class_new(gensym("tab_sqrt"), (t_newmethod)tab_sqrt_new, (t_method)tab_sqrt_free, sizeof(t_tab_sqrt), 0, A_GIMME, 0); class_addbang(tab_sqrt_class, (t_method)tab_sqrt_bang); class_addlist(tab_sqrt_class, (t_method)tab_sqrt_list); class_addmethod(tab_sqrt_class, (t_method)tab_sqrt_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_sqrt_class, (t_method)tab_sqrt_src, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_sqrt_class, (t_method)tab_sqrt_dst, gensym("dst"), A_DEFSYMBOL, 0); } iem_utils-0.0.20240903/iem_tab/src/tab_sub.c0000600000000000000000000001245214665566711015162 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_sub ------------------------------ */ /* x_beg_mem_dst[i] = x_beg_mem_src1[i] - x_offset_src2[i] */ typedef struct _tab_sub { t_object x_obj; int x_size_src1; int x_size_src2; int x_size_dst; int x_offset_src1; int x_offset_src2; int x_offset_dst; iemarray_t *x_beg_mem_src1; iemarray_t *x_beg_mem_src2; iemarray_t *x_beg_mem_dst; t_symbol *x_sym_scr1; t_symbol *x_sym_scr2; t_symbol *x_sym_dst; } t_tab_sub; static t_class *tab_sub_class; static void tab_sub_src1(t_tab_sub *x, t_symbol *s) { x->x_sym_scr1 = s; } static void tab_sub_src2(t_tab_sub *x, t_symbol *s) { x->x_sym_scr2 = s; } static void tab_sub_dst(t_tab_sub *x, t_symbol *s) { x->x_sym_dst = s; } static void tab_sub_bang(t_tab_sub *x) { int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; ok_src1 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); ok_src2 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, 0); ok_dst = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, 0); if(ok_src1 && ok_src2 && ok_dst) { if(x->x_size_src1 < x->x_size_dst) n = x->x_size_src1; else n = x->x_size_dst; if(x->x_size_src2 < n) n = x->x_size_src2; vec_src1 = x->x_beg_mem_src1; vec_src2 = x->x_beg_mem_src2; vec_dst = x->x_beg_mem_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } static void tab_sub_list(t_tab_sub *x, t_symbol *s, int argc, t_atom *argv) { int beg_src1, beg_src2, beg_dst; int i, n; int ok_src1, ok_src2, ok_dst; iemarray_t *vec_src1, *vec_src2, *vec_dst; if((argc >= 4) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2) && IS_A_FLOAT(argv,3)) { beg_src1 = (int)atom_getintarg(0, argc, argv); beg_src2 = (int)atom_getintarg(1, argc, argv); beg_dst = (int)atom_getintarg(2, argc, argv); n = (int)atom_getintarg(3, argc, argv); if(beg_src1 < 0) beg_src1 = 0; if(beg_src2 < 0) beg_src2 = 0; if(beg_dst < 0) beg_dst = 0; if(n < 0) n = 0; ok_src1 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src1+n); ok_src2 = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_scr2, &x->x_beg_mem_src2, &x->x_size_src2, beg_src2+n); ok_dst = iem_tab_check_arrays(gensym("tab_sub"), x->x_sym_dst, &x->x_beg_mem_dst, &x->x_size_dst, beg_dst+n); if(ok_src1 && ok_src2 && ok_dst) { vec_src1 = x->x_beg_mem_src1 + beg_src1; vec_src2 = x->x_beg_mem_src2 + beg_src2; vec_dst = x->x_beg_mem_dst + beg_dst; if(n) { t_garray *a; for(i=0; ix_obj.ob_outlet); a = (t_garray *)pd_findbyclass(x->x_sym_dst, garray_class); garray_redraw(a); } } } else { post("tab_sub-ERROR: list need 4 float arguments:"); post(" source1_offset + source2_offset + destination_offset + number_of_samples_to_sub"); } } static void tab_sub_free(t_tab_sub *x) { } static void *tab_sub_new(t_symbol *s, int argc, t_atom *argv) { t_tab_sub *x = (t_tab_sub *)pd_new(tab_sub_class); t_symbol *src1, *src2, *dst; if((argc >= 3) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1) && IS_A_SYMBOL(argv,2)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); dst = (t_symbol *)atom_getsymbolarg(2, argc, argv); } else if((argc >= 2) && IS_A_SYMBOL(argv,0) && IS_A_SYMBOL(argv,1)) { src1 = (t_symbol *)atom_getsymbolarg(0, argc, argv); dst = src1; src2 = (t_symbol *)atom_getsymbolarg(1, argc, argv); } else { post("tab_sub-ERROR: need 3 symbols arguments:"); post(" source1_array_name + source2_array_name + destination_array_name"); return(0); } x->x_sym_scr1 = src1; x->x_sym_scr2 = src2; x->x_sym_dst = dst; outlet_new(&x->x_obj, &s_bang); return(x); } void tab_sub_setup(void) { tab_sub_class = class_new(gensym("tab_sub"), (t_newmethod)tab_sub_new, (t_method)tab_sub_free, sizeof(t_tab_sub), 0, A_GIMME, 0); class_addbang(tab_sub_class, (t_method)tab_sub_bang); class_addlist(tab_sub_class, (t_method)tab_sub_list); class_addmethod(tab_sub_class, (t_method)tab_sub_src1, gensym("src1"), A_DEFSYMBOL, 0); class_addmethod(tab_sub_class, (t_method)tab_sub_src2, gensym("src2"), A_DEFSYMBOL, 0); class_addmethod(tab_sub_class, (t_method)tab_sub_dst, gensym("dst"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_sub_class, gensym("iemhelp2/tab_sub-help")); } iem_utils-0.0.20240903/iem_tab/src/tab_sum.c0000600000000000000000000000626514665566711015202 0ustar00/* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2009 */ #include "m_pd.h" #include "iemlib.h" #include "iem_tab.h" /* -------------------------- tab_sum ------------------------------ */ /* sum = 0.0f; */ /* for(i=0; ix_sym_scr1 = s; } static void tab_sum_bang(t_tab_sum *x) { int i, n; int ok_src; iemarray_t *vec_src; t_float sum=0.0f; ok_src = iem_tab_check_arrays(gensym("tab_sum"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, 0); if(ok_src) { n = x->x_size_src1; vec_src = x->x_beg_mem_src1; if(n) { for(i=0; ix_sum_out, sum); outlet_bang(x->x_bang_out); } } } static void tab_sum_list(t_tab_sum *x, t_symbol *s, int argc, t_atom *argv) { int beg_src; int i, n; int ok_src; iemarray_t *vec_src; t_float sum=0.0f; if((argc >= 2) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1)) { beg_src = (int)atom_getintarg(0, argc, argv); n = (int)atom_getintarg(1, argc, argv); if(beg_src < 0) beg_src = 0; if(n < 0) n = 0; ok_src = iem_tab_check_arrays(gensym("tab_sum"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n); if(ok_src) { vec_src = x->x_beg_mem_src1 + beg_src; if(n) { for(i=0; ix_sum_out, sum); outlet_bang(x->x_bang_out); } } } else { post("tab_sum-ERROR: list need 2 float arguments:"); post(" source_offset + number_of_samples_to_calc_sum-value"); } } static void tab_sum_free(t_tab_sum *x) { } static void *tab_sum_new(t_symbol *s, int argc, t_atom *argv) { t_tab_sum *x = (t_tab_sum *)pd_new(tab_sum_class); t_symbol *src; if((argc >= 1) && IS_A_SYMBOL(argv,0)) { src = (t_symbol *)atom_getsymbolarg(0, argc, argv); } else { post("tab_sum-ERROR: need 1 symbol argument:"); post(" source_array_name"); return(0); } x->x_sym_scr1 = src; x->x_bang_out = outlet_new(&x->x_obj, &s_bang); x->x_sum_out = outlet_new(&x->x_obj, &s_float); return(x); } void tab_sum_setup(void) { tab_sum_class = class_new(gensym("tab_sum"), (t_newmethod)tab_sum_new, (t_method)tab_sum_free, sizeof(t_tab_sum), 0, A_GIMME, 0); class_addbang(tab_sum_class, (t_method)tab_sum_bang); class_addlist(tab_sum_class, (t_method)tab_sum_list); class_addmethod(tab_sum_class, (t_method)tab_sum_src, gensym("src"), A_DEFSYMBOL, 0); class_addmethod(tab_sum_class, (t_method)tab_sum_src, gensym("src1"), A_DEFSYMBOL, 0); // class_sethelpsymbol(tab_sum_class, gensym("iemhelp2/tab_sum-help")); } iem_utils-0.0.20240903/iem_tab/tab_abs-help.pd0000600000000000000000000000466514665566711015465 0ustar00#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 162 273 1.arg: source-name; #X text 162 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X obj 61 78 tab_abs src dst; #X obj 59 264 tab_abs src dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 12 3 tab_abs; #X text 90 29 copy absolute-value from src to dst; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 171 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 175 69 (the number of samples which are copied are:; #X text 188 83 the minimum of both array lengths); #X text 56 185 3.) n samples to copy; #X text 190 185 absolute value; #X text 13 342 (c) Thomas Musil 2000 - 2009; #X connect 2 0 11 0; #X connect 5 0 12 0; #X connect 9 0 12 0; #X connect 10 0 12 0; #X connect 11 0 3 0; #X connect 12 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_add-help.pd0000600000000000000000000000721514665566711015442 0ustar00#N canvas 116 92 859 564 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 22 450 300 (subpatch) 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-06 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 90 29 add the 2 src-arrays to dst-array; #X obj 61 78 tab_add src1 src2 dst; #X obj 59 301 tab_add src1 src2 dst; #X text 78 435 IEM KUG; #X text 58 423 musil; #X text 92 423 @; #X text 100 423 iem.at; #X text 61 445 Graz \, Austria; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 12 3 tab_add; #X text 225 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 56 187 4.) n samples to add; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 212 72 (the number of samples which were added are:; #X text 13 412 (c) Thomas Musil 2000 - 2009; #X connect 2 0 13 0; #X connect 5 0 14 0; #X connect 7 0 14 0; #X connect 8 0 14 0; #X connect 9 0 14 0; #X connect 13 0 3 0; #X connect 14 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_add_scalar-help.pd0000600000000000000000000000472414665566711016771 0ustar00#N canvas 115 92 864 568 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 527 46 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 211 336 1.arg: source-name; #X msg 197 270 dst dst; #X msg 47 36 0.5; #X msg 145 247 src src; #X msg 82 37 -0.5; #X obj 61 78 tab_add_scalar src dst; #X obj 59 301 tab_add_scalar src dst; #X msg 48 227 50 20 50 -0.8; #X text 211 349 2.arg: destination-name; #X text 129 29 add the src-array with this scalar to dst-array ; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 58 463 musil; #X text 92 463 @; #X text 100 463 iem.at; #X text 61 485 Graz \, Austria; #X text 234 322 initial arguments:; #X text 71 322 output; #X text 250 271 xxx : change destination name; #X text 12 3 tab_add_scalar; #X text 218 86 the minimum of both array lengths); #X text 197 246 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 200 3.) n samples to add; #X text 42 210 4.) added scalar value; #X text 205 72 (the number of samples which were added are:; #X text 13 452 (c) Thomas Musil 2000 - 2009; #X connect 5 0 10 0; #X connect 6 0 9 0; #X connect 7 0 10 0; #X connect 8 0 9 0; #X connect 9 0 2 0; #X connect 10 0 3 0; #X connect 11 0 10 0; iem_utils-0.0.20240903/iem_tab/tab_carth2polar-help.pd0000600000000000000000000000512714665566711017133 0ustar00#N canvas 132 30 866 532 10; #N canvas 0 22 450 300 (subpatch) 0; #X array real 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 29 graph; #X obj 61 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 40 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array imag 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array mag 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 29 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array arg 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 71 graph; #X msg 696 220 2; #X floatatom 647 276 5 0 0 0 - - -; #X floatatom 730 277 5 0 0 0 - - -; #X obj 710 131 loadbang; #X text 96 444 IEM KUG; #X text 75 432 musil; #X text 110 432 @; #X text 118 432 iem.at; #X text 79 454 Graz \, Austria; #X text 324 276 initial arguments:; #X text 81 39 invert the complex src-arrays to the complex dst-arrays ; #X text 98 113 the minimum of the 4 array lengths); #X text 85 99 (the number of samples which were inverted are:; #X text 302 288 1.arg: real_source-name; #X text 302 300 2.arg: imag_source-name; #X text 53 160 list of 5 floats:; #X msg 40 229 0 0 0 0 64; #X text 12 7 tab_carth2polar; #X obj 684 316 * 360; #X floatatom 684 341 5 0 0 0 - - -; #X text 74 179 2.) src_imag-onset; #X text 74 169 1.) src_real-onset; #X text 74 209 5.) number of samples to convert; #X msg 710 152 \; real const 0.75 \; imag const -0.75; #X msg 584 153 \; real const 0.75 \; imag const 0.75; #X text 302 312 3.arg: magnitude_destination-name; #X text 302 323 4.arg: phase_argument_destination-name; #X text 74 189 3.) dst_magnitude-onset; #X text 74 199 4.) dst_phase_argument-onset; #X obj 647 254 tabread mag; #X obj 730 253 tabread arg; #X obj 61 78 tab_carth2polar real imag mag arg; #X obj 40 360 tab_carth2polar real imag mag arg; #X msg 143 331 dst_arg arg; #X msg 110 306 dst_mag mag; #X msg 91 279 src_im imag; #X msg 74 253 src_re real; #X floatatom 743 352 5 0 0 0 - - -; #X obj 743 304 * 2; #X obj 743 327 * 3.14159; #X text 31 421 (c) Thomas Musil 2000 - 2009; #X connect 1 0 38 0; #X connect 7 0 36 0; #X connect 7 0 37 0; #X connect 9 0 25 0; #X connect 9 0 45 0; #X connect 10 0 30 0; #X connect 23 0 39 0; #X connect 25 0 26 0; #X connect 36 0 8 0; #X connect 37 0 9 0; #X connect 38 0 2 0; #X connect 39 0 3 0; #X connect 40 0 39 0; #X connect 41 0 39 0; #X connect 42 0 39 0; #X connect 43 0 39 0; #X connect 45 0 46 0; #X connect 46 0 44 0; iem_utils-0.0.20240903/iem_tab/tab_complex_inv-help.pd0000600000000000000000000000437514665566711017241 0ustar00#N canvas 132 30 858 524 10; #N canvas 0 22 450 300 (subpatch) 0; #X array re1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 29 graph; #X obj 61 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 40 381 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array im1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 451 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array re2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 29 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array im2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 596 71 graph; #X msg 700 247 2; #X floatatom 651 303 5 0 0 0 - - -; #X floatatom 734 304 5 0 0 0 - - -; #X obj 710 131 loadbang; #X text 96 444 IEM KUG; #X text 75 432 musil; #X text 110 432 @; #X text 118 432 iem.at; #X text 79 454 Graz \, Austria; #X text 324 276 initial arguments:; #X text 12 7 tab_complex_inv; #X text 81 39 invert the complex src-arrays to the complex dst-arrays ; #X obj 61 78 tab_complex_inv re1 im1 re2 im2; #X text 128 113 the minimum of the 4 array lengths); #X text 115 99 (the number of samples which were inverted are:; #X msg 74 253 src_re re1; #X msg 91 279 src_im im1; #X msg 110 306 dst_re re2; #X msg 143 331 dst_im im2; #X obj 40 360 tab_complex_inv re1 im1 re2 im2; #X text 302 312 3.arg: real_destination-name; #X text 302 323 4.arg: imag_destination-name; #X text 302 288 1.arg: real_source-name; #X text 302 300 2.arg: imag_source-name; #X obj 651 280 tabread re2; #X obj 734 280 tabread im2; #X msg 710 152 \; re1 const 0.8 \; im1 const -0.6; #X text 105 155 1.) src_re-onset; #X text 105 165 2.) src_im-onset; #X text 105 175 3.) dst_re-onset; #X text 105 185 4.) dst_im-onset; #X text 105 195 5.) number of samples to multiply; #X text 84 146 list of 5 floats:; #X msg 40 229 0 0 0 0 64; #X text 31 421 (c) Thomas Musil 2000 - 2009; #X connect 1 0 19 0; #X connect 7 0 31 0; #X connect 7 0 32 0; #X connect 10 0 33 0; #X connect 19 0 2 0; #X connect 22 0 26 0; #X connect 23 0 26 0; #X connect 24 0 26 0; #X connect 25 0 26 0; #X connect 26 0 3 0; #X connect 31 0 8 0; #X connect 32 0 9 0; #X connect 40 0 26 0; iem_utils-0.0.20240903/iem_tab/tab_complex_mul-help.pd0000600000000000000000000000702714665566711017237 0ustar00#N canvas 132 30 862 634 10; #N canvas 0 22 450 300 (subpatch) 0; #X array re1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 481 29 graph; #X obj 61 43 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 54 439 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array im1 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 481 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array re2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 606 29 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array im2 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 606 71 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array re3 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 735 28 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array im3 100 float 0; #X coords 0 1 99 -1 100 40 1; #X restore 735 70 graph; #X msg 710 152 \; re1 const 0.9 \; im1 const 0.6 \; re2 const 0.7 \; im2 const -0.8; #X obj 61 78 tab_complex_mul re1 im1 re2 im2 re3 im3; #X obj 662 472 tabread re3; #X obj 745 472 tabread im3; #X msg 711 439 2; #X floatatom 662 495 5 0 0 0 - - -; #X floatatom 745 496 5 0 0 0 - - -; #X obj 692 350 *; #X obj 715 350 *; #X obj 760 350 *; #X obj 783 350 *; #X obj 767 372 +; #X obj 698 372 -; #X msg 692 304 0.9 0.7; #X msg 715 328 0.6 -0.8; #X floatatom 699 395 5 0 0 0 - - -; #X msg 760 305 0.9 -0.8; #X msg 777 329 0.6 0.7; #X floatatom 767 394 5 0 0 0 - - -; #X obj 54 418 tab_complex_mul re1 im1 re2 im2 re3 im3; #X msg 74 258 src1_re re1; #X msg 191 368 dst_re re3; #X msg 232 391 dst_im im3; #X msg 91 284 src1_im im1; #X msg 143 309 src2_re re2; #X msg 161 335 src2_im im2; #X msg 40 234 0 0 0 0 0 0 64; #X text 84 146 list of 7 floats:; #X text 353 419 1.arg: real_source1-name; #X text 353 431 2.arg: imag_source1-name; #X text 353 443 3.arg: real_source2-name; #X text 354 454 4.arg: imag_source2-name; #X text 354 466 5.arg: real_destination-name; #X text 354 477 6.arg: imag_destination-name; #X obj 728 281 t b b b b; #X obj 728 257 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 710 131 loadbang; #X text 87 537 IEM KUG; #X text 66 525 musil; #X text 101 525 @; #X text 109 525 iem.at; #X text 70 547 Graz \, Austria; #X text 12 7 tab_complex_mul; #X text 375 407 initial arguments:; #X text 115 99 (the number of samples which were multiplied are:; #X text 105 155 1.) src1_re-onset; #X text 105 165 2.) src1_im-onset; #X text 105 175 3.) src2_re-onset; #X text 105 185 4.) src2_im-onset; #X text 105 195 5.) dst_re-onset; #X text 105 205 6.) dst_im-onset; #X text 105 215 7.) number of samples to multiply; #X text 81 39 multiply the complex src1-arrays with the complex src2-arrays to complex dst-array; #X text 128 113 the minimum of the 6 array lengths); #X text 22 514 (c) Thomas Musil 2000 - 2009; #X connect 1 0 10 0; #X connect 10 0 2 0; #X connect 11 0 14 0; #X connect 12 0 15 0; #X connect 13 0 11 0; #X connect 13 0 12 0; #X connect 16 0 21 0; #X connect 17 0 21 1; #X connect 18 0 20 0; #X connect 19 0 20 1; #X connect 20 0 27 0; #X connect 21 0 24 0; #X connect 22 0 16 0; #X connect 23 0 17 0; #X connect 25 0 18 0; #X connect 26 0 19 0; #X connect 28 0 3 0; #X connect 29 0 28 0; #X connect 30 0 28 0; #X connect 31 0 28 0; #X connect 32 0 28 0; #X connect 33 0 28 0; #X connect 34 0 28 0; #X connect 35 0 28 0; #X connect 43 0 22 0; #X connect 43 1 23 0; #X connect 43 2 25 0; #X connect 43 3 26 0; #X connect 44 0 43 0; #X connect 45 0 9 0; iem_utils-0.0.20240903/iem_tab/tab_const-help.pd0000600000000000000000000000411114665566711016030 0ustar00#N canvas 117 93 790 448 10; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 1; #A 0 0 0 0 0 0 0 0.0428571 0.1 0.128571 0.185714 0.257143 0.3 0.371429 0.428571 0.471429 0.557143 0.614286 0.671429 0.4 0.171429 0.0714286 -0.0857142 -0.285714 -0.557143 -0.542857 -0.485714 -0.457143 -0.428571 -0.357143 -0.314286 -0.271429 -0.221429 -0.171429 -0.128571 -0.0857143 -0.0428571 1.49012e-08 0.0428572 0.0857143 0.128571 0.171429 0.271429 0.357143 0.442857 0.471429 -0.514286 -0.514286 -0.485714 -0.428571 -0.342857 -0.292857 -0.242857 -0.2 -0.157143 -0.0285715 0.0357142 0.1 0.152381 0.204762 0.257143 0.321429 0.385714 0.435714 0.485714 0.528571 0.571429 0.621429 -0.242857 -0.414286 -0.414286 -0.4 -0.357143 -0.328571 -0.3 -0.257143 -0.214286 -0.185714 -0.157143 -0.128571 -0.0785714 -0.0285714 0.00476191 0.0380952 0.0714286 0.114286 0.157143 0.2 0.242857 0.278571 0.314286 -0.228571 -0.242857 -0.214286 -0.2 -0.142857 -0.114286 -0.0714285 -0.0285714 3.53903e-08 0.114286; #X coords 0 1 99 -1 200 140 1; #X restore 518 36 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 130 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 60 302 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 122 218 dst dst; #X obj 61 102 tab_const dst; #X msg 60 195 30 50 0.5; #X text 172 270 1.arg: destination-name; #X obj 60 261 tab_const dst; #X msg 82 59 -0.7; #X msg 114 78 0.8; #X text 11 6 tab_const; #X text 90 29 set all samples of array to zero; #X text 114 58 set all samples of array to this float value ; #X text 55 163 1.) dst onset; #X text 55 174 2.) n samples to set; #X text 190 257 initial arguments:; #X text 174 219 xxx : change destination name; #X text 75 374 IEM KUG; #X text 54 362 musil; #X text 89 362 @; #X text 97 362 iem.at; #X text 58 384 Graz \, Austria; #X text 65 280 output; #X text 43 153 list of 2 floats:; #X text 10 351 (c) Thomas Musil 2000 - 2009; #X connect 1 0 5 0; #X connect 4 0 8 0; #X connect 5 0 2 0; #X connect 6 0 8 0; #X connect 8 0 3 0; #X connect 9 0 5 0; #X connect 10 0 5 0; iem_utils-0.0.20240903/iem_tab/tab_conv-help.pd0000600000000000000000000000716414665566711015662 0ustar00#N canvas 18 36 1204 616 10; #X obj 55 56 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 97 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 711 532 init_tables 0; #X obj 45 113 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 133 200 noise~; #X obj 104 144 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 149 15 inlet; #X obj 149 37 t b; #X obj 188 99 del 100; #X msg 53 82 1; #X msg 188 122 0; #X obj 167 64 del 100; #X obj 134 234 tabwrite~ in; #X obj 228 235 tabwrite~ filt; #X obj 229 180 *~ 10; #N canvas 0 22 238 185 dsp 0; #X msg 28 63 \; pd dsp \$1; #X obj 28 34 inlet; #X connect 1 0 0 0; #X restore 45 132 pd dsp; #N canvas 448 145 458 308 dirac~ 0; #X obj 75 23 inlet; #X obj 75 96 sig~; #X obj 75 121 biquad~ 0 0 1 -1 0; #X obj 75 143 clip~ 0 1; #X obj 75 169 outlet~; #X obj 110 48 del 2; #X msg 75 49 1; #X msg 111 69 0; #X connect 0 0 5 0; #X connect 0 0 6 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 7 0; #X connect 6 0 1 0; #X connect 7 0 1 0; #X restore 229 155 pd dirac~; #X obj 229 209 bp~ 1000 10; #X connect 0 0 12 0; #X connect 1 0 9 0; #X connect 2 0 9 0; #X connect 2 0 10 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 4 0 8 0; #X connect 5 0 7 0; #X connect 6 0 0 0; #X connect 7 0 0 0; #X connect 8 0 5 0; #X connect 8 0 2 0; #X connect 8 0 13 0; #X connect 11 0 14 0; #X connect 13 0 11 0; #X connect 14 0 10 0; #X restore 678 278 pd init_tables; #X obj 678 233 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array in 800 float 0; #X coords 0 1 799 -1 399 100 1; #X restore 483 25 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array filt 200 float 0; #X coords 0 0.1 199 -0.1 99 100 1; #X restore 483 219 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array out 800 float 0; #X coords 0 1 799 -1 399 100 1; #X restore 483 382 graph; #X text 94 464 IEM KUG; #X text 73 452 musil; #X text 108 452 @; #X text 116 452 iem.at; #X text 77 474 Graz \, Austria; #X text 248 365 initial arguments:; #X text 78 97 (the number of samples which were correlated are: the positive minimum of the difference (src1-src2) and dst array lengths) ; #X text 226 377 1.arg: source1-name; #X text 226 389 2.arg: source2-name; #X text 226 401 3.arg: destination-name; #X msg 77 302 bang; #X obj 678 257 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 12 12 tab_conv; #X obj 55 75 tab_conv in filt out; #X text 29 441 (c) Thomas Musil 2000 - 2009; #X msg 109 324 src1 in; #X msg 124 345 src2 filt; #X msg 135 366 dst out; #X obj 63 394 tab_conv in filt out; #X msg 54 251 0 0 0 800 200; #N canvas 0 22 450 300 (subpatch) 0; #X array in2 16 float 2; #X coords 0 1 16 -1 160 100 1; #X restore 903 25 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array filt2 4 float 2; #X coords 0 1 4 -1 40 100 1; #X restore 903 151 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array out2 19 float 2; #X coords 0 1 19 -1 190 100 1; #X restore 903 282 graph; #X obj 972 227 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 972 246 tab_conv in2 filt2 out2; #X msg 971 139 \; filt2 0 0.9 0.7 0.5 0.3 \; in2 const 0 \; in2 1 0.9 \; in2 8 0.9 \; in2 14 -0.9; #X text 162 250 not working yet; #X text 25 158 !!! array length of src1 + array length of src2 - 1 ; #X text 391 158 >= array length of dst !!!; #X text 78 39 convolutes the 2nd array "src2" with the 1st array "src1" to the destination array "dst"; #X connect 0 0 20 0; #X connect 3 0 18 0; #X connect 17 0 25 0; #X connect 18 0 2 0; #X connect 20 0 1 0; #X connect 22 0 25 0; #X connect 23 0 25 0; #X connect 24 0 25 0; #X connect 26 0 25 0; #X connect 30 0 31 0; iem_utils-0.0.20240903/iem_tab/tab_copy-help.pd0000600000000000000000000000461514665566711015665 0ustar00#N canvas 116 92 784 483 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 533 14 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 533 180 graph; #X obj 60 35 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 60 110 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 58 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 58 215 50 20 50; #X text 194 318 1.arg: source-name; #X text 194 331 2.arg: destination-name; #X msg 115 235 src src; #X msg 165 253 dst dst; #X text 184 73 (the number of samples which are copied are:; #X text 197 87 the minimum of both array lengths); #X text 43 168 list of 3 floats:; #X text 77 419 IEM KUG; #X text 56 407 musil; #X text 91 407 @; #X text 99 407 iem.at; #X text 60 429 Graz \, Austria; #X text 55 179 1.) src onset; #X text 55 189 2.) dst onset; #X text 225 306 initial arguments:; #X text 73 323 output; #X text 172 233 xxx : change source name; #X text 218 252 xxx : change destination name; #X text 11 7 tab_copy; #X text 89 33 copy value from src to dst; #X obj 60 82 tab_copy src dst; #X text 55 198 3.) n samples to copy; #X obj 58 306 tab_copy src dst; #X text 12 396 (c) Thomas Musil 2000 - 2009; #X connect 2 0 26 0; #X connect 5 0 28 0; #X connect 8 0 28 0; #X connect 9 0 28 0; #X connect 26 0 3 0; #X connect 28 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_counter-help.pd0000600000000000000000000000523614665566711016372 0ustar00#N canvas 115 92 872 576 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X coords 0 1 99 0 200 140 1; #X restore 544 234 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 10 99 0 200 140 1; #X restore 544 413 graph; #X obj 53 146 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 398 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 219 367 1.arg: source-name; #X msg 146 317 dst dst; #X msg 101 296 src src; #X text 219 380 2.arg: destination-name; #X obj 55 359 tab_gt_scalar src dst; #X obj 53 121 tab_counter src dst; #X msg 82 93 reset; #X obj 53 33 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 55 273 0 0 100; #N canvas 0 22 462 312 (subpatch) 0; #X msg 175 59 \; src const 0; #X msg 88 57 \; src \$1 0.9; #X floatatom 89 30 5 0 0 0 - - -; #X msg 88 127 \; dst ylabel -5.15 0 1 2 3 4 5 6 7 8 9 10; #X msg 87 93 \; dst yticks 0 1 1; #X obj 22 64 loadbang; #X connect 2 0 1 0; #X connect 5 0 4 0; #X connect 5 0 3 0; #X restore 496 285 pd; #X text 37 222 list of 3 floats:; #X text 78 455 IEM KUG; #X text 57 443 musil; #X text 92 443 @; #X text 100 443 iem.at; #X text 61 465 Graz \, Austria; #X text 49 233 1.) src onset; #X text 49 243 2.) dst onset; #X text 252 354 initial arguments:; #X text 64 379 output; #X text 158 296 xxx : change source name; #X text 199 318 xxx : change destination name; #X text 135 162 the minimum of both array lengths); #X text 12 3 tab_counter; #X msg 549 36 \; src 9 0.9 \; src 19 0.9 \; src 29 0.9 \; src 39 0.9 ; #X text 77 27 each element of the source array controls an increment counter in the destination array \, a nonzero value lets increment the counter value by one \, a zero value resets the counter value to zero.; #X text 124 93 resets all counter values to zero; #X text 122 148 (the number of samples which control counters are: ; #X text 49 253 3.) n samples to control n counters; #X text 13 432 (c) Thomas Musil 2000 - 2009; #X msg 684 37 \; src 9 -0.1 \; src 19 0 \; src 29 0 \; src 39 0.9; #X msg 686 133 \; src 9 0 \; src 19 0 \; src 29 0 \; src 39 0; #X msg 545 132 \; src 9 0 \; src 19 0.9 \; src 29 -0.1 \; src 39 0 ; #X text 536 15 4 indices incr.; #X text 677 14 2 indices incr.; #X text 537 112 2 indices incr.; #X text 695 114 reset; #X connect 5 0 8 0; #X connect 6 0 8 0; #X connect 8 0 3 0; #X connect 9 0 2 0; #X connect 10 0 9 0; #X connect 11 0 9 0; #X connect 12 0 8 0; iem_utils-0.0.20240903/iem_tab/tab_cross_corr-help.pd0000600000000000000000000000635014665566711017067 0ustar00#N canvas 107 80 1053 581 10; #X obj 55 51 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 55 92 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 478 328 init_tables 0; #X obj 45 113 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 239 151 noise~; #X obj 114 193 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 134 234 tabwrite~ ref; #X obj 238 234 tabwrite~ meas; #X obj 149 15 inlet; #X obj 149 37 t b; #X obj 188 99 del 100; #X msg 53 82 1; #X msg 188 122 0; #X obj 167 64 del 100; #N canvas 0 22 238 185 dsp 0; #X msg 28 63 \; pd dsp \$1; #X obj 28 34 inlet; #X connect 1 0 0 0; #X restore 45 139 pd dsp; #N canvas 448 145 462 312 delay 0; #X obj 75 169 outlet~; #X obj 75 23 inlet~; #N canvas 0 22 458 308 del1 0; #X obj 75 169 outlet~; #X obj 75 23 inlet~; #X obj 105 101 delwrite~ \$0delz 5; #X connect 1 0 2 0; #X connect 1 0 0 0; #X restore 75 66 pd del1; #N canvas 0 22 458 308 del2 0; #X obj 75 169 outlet~; #X obj 75 23 inlet~; #X obj 75 122 delread~ \$0delz 1.31; #X connect 2 0 0 0; #X restore 75 116 pd del2; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 0 0; #X restore 136 190 pd delay; #X connect 0 0 11 0; #X connect 1 0 4 0; #X connect 1 0 12 0; #X connect 2 0 3 0; #X connect 2 0 4 0; #X connect 5 0 6 0; #X connect 6 0 8 0; #X connect 6 0 10 0; #X connect 7 0 9 0; #X connect 8 0 0 0; #X connect 9 0 0 0; #X connect 10 0 7 0; #X connect 10 0 2 0; #X connect 12 0 3 0; #X restore 636 311 pd init_tables; #X obj 636 266 loadbang; #N canvas 0 22 450 300 (subpatch) 0; #X array ref 200 float 0; #X coords 0 1 199 -1 199 100 1; #X restore 483 20 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array meas 100 float 0; #X coords 0 1 99 -1 99 100 1; #X restore 541 140 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array cross_corr 100 float 0; #X coords 0 1 99 -1 99 100 1; #X restore 483 260 graph; #X text 94 459 IEM KUG; #X text 73 447 musil; #X text 108 447 @; #X text 116 447 iem.at; #X text 77 469 Graz \, Austria; #X text 380 381 initial arguments:; #X text 12 7 tab_cross_corr; #X text 77 37 correlates the 2nd array "measured" with the 1st array "reference" to the destination array "cross_corr"; #X text 78 92 (the number of samples which were correlated are: the positive minimum of the difference (src1-src2) and dst array lengths) ; #X text 358 393 1.arg: source1-name; #X text 358 405 2.arg: source2-name; #X text 358 417 3.arg: destination-name; #X text 533 452 calculation in ms; #X text 358 441 5.arg: delay time per destination sample; #X msg 63 257 bang; #X msg 80 278 time 1; #X msg 135 361 dst cross_corr; #X msg 124 340 src2 meas; #X msg 109 319 src1 ref; #X obj 636 290 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 97 297 factor 0.02; #X obj 63 389 tab_cross_corr ref meas cross_corr 0.02 1; #X text 62 155 !! array length of src1 > array length of src2 !!; #X text 29 436 (c) Thomas Musil 2000 - 2009; #X obj 55 70 tab_cross_corr ref meas cross_corr 0.04 1; #X text 358 429 4.arg: scaling factor; #X connect 0 0 31 0; #X connect 3 0 26 0; #X connect 21 0 28 0; #X connect 22 0 28 0; #X connect 23 0 28 0; #X connect 24 0 28 0; #X connect 25 0 28 0; #X connect 26 0 2 0; #X connect 27 0 28 0; #X connect 31 0 1 0; iem_utils-0.0.20240903/iem_tab/tab_dbtopow-help.pd0000600000000000000000000000441614665566711016370 0ustar00#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 5.77858 10.0643 15.0643 17.2072 22.2072 31.4929 33.6358 37.2072 38.9929 40.7786 45.0644 49.3501 51.4929 53.6358 55.4215 57.2072 59.3501 61.493 62.6834 63.8739 65.0644 66.8501 68.6358 70.4215 70.7787 71.493 72.9215 73.2787 73.6358 75.0644 75.4216 75.7787 76.493 76.8501 77.2073 77.5644 77.9216 78.6358 79.3501 80.0644 80.7787 81.493 81.8501 82.2073 83.6358 84.3501 85.0644 85.4216 85.7787 87.2073 87.5644 87.9216 88.6359 89.3501 90.0644 90.7787 90.7787 91.493 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 94.3502 94.3502 94.3502 95.0644 95.0644 95.7787 96.493 96.493 96.493 97.9216 98.6359 98.6359 99.3502 99.3502 99.3502 100.064 100.064 100.064 100.064 100.779 100.779; #X coords 0 100 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 57 185 3.) n samples of dbtorms; #X text 12 4 tab_dbtopow; #X text 91 32 calculates the dbtopow-value from src to dst; #X obj 61 79 tab_dbtopow src dst; #X obj 59 264 tab_dbtopow src dst; #X connect 2 0 28 0; #X connect 5 0 29 0; #X connect 9 0 29 0; #X connect 10 0 29 0; #X connect 28 0 3 0; #X connect 29 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_dbtorms-help.pd0000600000000000000000000000441614665566711016364 0ustar00#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 5.77858 10.0643 15.0643 17.2072 22.2072 31.4929 33.6358 37.2072 38.9929 40.7786 45.0644 49.3501 51.4929 53.6358 55.4215 57.2072 59.3501 61.493 62.6834 63.8739 65.0644 66.8501 68.6358 70.4215 70.7787 71.493 72.9215 73.2787 73.6358 75.0644 75.4216 75.7787 76.493 76.8501 77.2073 77.5644 77.9216 78.6358 79.3501 80.0644 80.7787 81.493 81.8501 82.2073 83.6358 84.3501 85.0644 85.4216 85.7787 87.2073 87.5644 87.9216 88.6359 89.3501 90.0644 90.7787 90.7787 91.493 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 92.2073 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 93.6359 94.3502 94.3502 94.3502 95.0644 95.0644 95.7787 96.493 96.493 96.493 97.9216 98.6359 98.6359 99.3502 99.3502 99.3502 100.064 100.064 100.064 100.064 100.779 100.779; #X coords 0 100 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 12 4 tab_dbtorms; #X text 90 30 calculates the dbtorms-value from src to dst; #X obj 61 79 tab_dbtorms src dst; #X obj 59 264 tab_dbtorms src dst; #X text 57 185 3.) n samples of dbtorms; #X connect 2 0 27 0; #X connect 5 0 28 0; #X connect 9 0 28 0; #X connect 10 0 28 0; #X connect 27 0 3 0; #X connect 28 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_div-help.pd0000600000000000000000000000722614665566711015476 0ustar00#N canvas 116 92 851 556 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 574 20 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 575 368 graph; #X obj 61 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 116 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 286 dst dst; #N canvas 0 22 450 300 (subpatch) 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-06 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 575 171 graph; #X msg 136 243 src1 src1; #X msg 195 265 src2 src2; #X msg 59 221 50 50 20 50; #X text 45 149 list of 4 floats:; #X text 212 363 3.arg: destination-name; #X text 78 445 IEM KUG; #X text 56 433 musil; #X text 92 433 @; #X text 100 433 iem.at; #X text 61 455 Graz \, Austria; #X text 234 322 initial arguments:; #X text 72 329 output; #X text 314 285 xxx : change destination name; #X text 229 96 the minimum of the 3 array lengths); #X text 56 187 3.) dst onset; #X text 56 165 1.) src_1 onset; #X text 56 176 2.) src_2 onset; #X text 207 243 xxx : change source name 1; #X text 265 265 xxx : change source name 2; #X text 211 336 1.arg: source-name 1; #X text 211 349 2.arg: source-name 2; #X text 12 13 tab_div; #X text 90 39 divide the 2 src-arrays to dst-array; #X text 216 82 (the number of samples which were divided are:; #X text 56 197 4.) n samples to divide; #X obj 61 88 tab_div src1 src2 dst; #X obj 59 311 tab_div src1 src2 dst; #X text 13 422 (c) Thomas Musil 2000 - 2009; #X connect 2 0 32 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 32 0 3 0; #X connect 33 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_eq-help.pd0000600000000000000000000000651014665566711015314 0ustar00#N canvas 116 92 863 568 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 584 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 585 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 22 450 300 (subpatch) 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-06 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 585 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 57 423 musil; #X text 92 423 @; #X text 100 423 iem.at; #X text 61 445 Graz \, Austria; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 316 275 xxx : change destination name; #X text 219 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 209 233 xxx : change source name 1; #X text 267 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 12 3 tab_eq; #X text 90 29 compare "equal to" the 2 src-arrays to dst-array ; #X obj 61 78 tab_eq src1 src2 dst; #X text 206 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X obj 59 301 tab_eq src1 src2 dst; #X text 13 412 (c) Thomas Musil 2000 - 2009; #X connect 2 0 30 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 30 0 3 0; #X connect 33 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_eq_scalar-help.pd0000600000000000000000000000421614665566711016642 0ustar00#N canvas 22 55 884 588 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.542857 -0.614286 -0.657144 -0.67143 -0.700001 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.528572 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X obj 61 78 tab_eq_scalar src dst; #X obj 59 331 tab_eq_scalar src dst; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 221 332 1.arg: source-name; #X text 221 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 57 463 musil; #X text 92 463 @; #X text 100 463 iem.at; #X text 61 485 Graz \, Austria; #X text 244 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 12 3 tab_eq_scalar; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 129 29 compare "equal to" the src-array with this scalar to dst-array; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X text 13 452 (c) Thomas Musil 2000 - 2009; #X connect 4 0 7 0; #X connect 5 0 7 0; #X connect 6 0 2 0; #X connect 7 0 3 0; #X connect 8 0 6 0; #X connect 9 0 6 0; #X connect 30 0 7 0; iem_utils-0.0.20240903/iem_tab/tab_fft-help.pd0000600000000000000000000002446514665566711015477 0ustar00#N canvas 29 22 965 544 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 239 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 62 371 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 353 graph; #X msg 103 276 dst_re dst_re; #X msg 118 299 dst_im dst_im; #X msg 139 322 fftsize 64; #X floatatom 473 22 5 0 63 0 - - -; #X msg 546 341 \; dst_re const 0 \; dst_im const 0; #X text 10 0 tab_fft; #X text 93 -1 complex FTT with arrays; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #N canvas 0 22 474 324 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 60 103 \; src_re const 0 \; src_re \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 41 pd generate_a_dirac; #X floatatom 514 22 5 -32 32 0 - - -; #N canvas 0 22 531 484 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 219 331 tabwrite src_re; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 39 333 tabwrite src_re; #X obj 90 70 * -1; #X obj 39 310 / -32; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 9 0; #X connect 1 0 2 0; #X connect 1 1 8 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 8 0; #X connect 7 0 19 0; #X connect 7 1 5 1; #X connect 9 0 17 0; #X connect 9 1 21 0; #X connect 10 0 11 0; #X connect 10 1 16 1; #X connect 11 0 12 0; #X connect 12 0 14 0; #X connect 13 0 18 0; #X connect 14 0 13 0; #X connect 15 0 20 0; #X connect 15 1 14 1; #X connect 17 0 22 0; #X connect 18 0 16 0; #X connect 19 0 1 0; #X connect 20 0 10 0; #X connect 21 0 7 0; #X connect 22 0 15 0; #X restore 514 61 pd generate_a_cos; #X floatatom 555 22 5 -31 31 0 - - -; #N canvas 0 22 491 415 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 337 tabwrite src_re; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 335 tabwrite src_re; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X connect 0 0 19 0; #X connect 1 0 2 0; #X connect 1 1 8 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 9 0; #X connect 5 0 8 0; #X connect 6 0 7 0; #X connect 7 0 22 0; #X connect 7 1 4 1; #X connect 9 0 5 0; #X connect 10 0 11 0; #X connect 10 1 16 1; #X connect 11 0 12 0; #X connect 12 0 13 0; #X connect 13 0 17 0; #X connect 14 0 15 0; #X connect 15 0 21 0; #X connect 15 1 13 1; #X connect 17 0 18 0; #X connect 18 0 16 0; #X connect 19 0 20 0; #X connect 19 1 6 0; #X connect 20 0 14 0; #X connect 21 0 10 0; #X connect 22 0 1 0; #X restore 555 82 pd generate_a_sin; #X text 299 365 initial arguments:; #X text 45 56 calculates a complex fourier transformation of complex src-arrays to complex dst-arrays; #X text 37 147 list of 4 floats:; #X text 49 178 3.) dst_re-onset; #X text 49 188 4.) dst_im-onset; #X text 49 158 1.) src_re-onset; #X text 49 168 2.) src_im-onset; #X msg 62 207 20 20 30 30; #X text 259 412 4.arg: imag_destination-name; #X text 259 400 3.arg: real_destination-name; #X text 259 389 2.arg: imag_source-name; #X text 259 378 1.arg: real_source-name; #X text 259 424 5.arg: fftsize; #N canvas 0 22 450 300 (subpatch) 0; #X array src_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 124 graph; #X obj 24 94 tab_fft src_re src_im dst_re dst_im 64; #X msg 76 230 src_re src_re; #X msg 90 253 src_im src_im; #X obj 62 348 tab_fft src_re src_im dst_re dst_im 64; #X msg 546 283 \; src_re const 0 \; src_im const 0; #X floatatom 474 132 5 0 63 0 - - -; #N canvas 0 22 478 328 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 62 88 \; src_im const 0 \; src_im \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 151 pd generate_a_dirac; #X floatatom 514 132 5 -32 32 0 - - -; #N canvas 0 22 495 419 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 39 310 / -32; #X obj 40 334 tabwrite src_im; #X obj 220 331 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 39 153 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 153 pd counter; #X obj 218 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 18 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 18 0; #X connect 7 0 20 0; #X connect 7 1 5 1; #X connect 8 0 15 0; #X connect 8 1 21 0; #X connect 9 0 10 0; #X connect 9 1 17 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 16 0; #X connect 13 0 12 0; #X connect 14 0 19 0; #X connect 14 1 13 1; #X connect 15 0 22 0; #X connect 16 0 17 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X connect 21 0 7 0; #X connect 22 0 14 0; #X restore 514 171 pd generate_a_cos; #X floatatom 555 132 5 -31 31 0 - - -; #N canvas 0 22 491 415 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 131 t b f; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #X obj 246 337 tabwrite src_im; #X obj 54 336 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 19 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 19 0; #X connect 6 0 7 0; #X connect 7 0 22 0; #X connect 7 1 4 1; #X connect 8 0 5 0; #X connect 9 0 10 0; #X connect 9 1 20 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 21 0; #X connect 14 1 12 1; #X connect 15 0 16 0; #X connect 16 0 20 0; #X connect 17 0 18 0; #X connect 17 1 6 0; #X connect 18 0 13 0; #X connect 21 0 9 0; #X connect 22 0 1 0; #X restore 555 192 pd generate_a_sin; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X connect 2 0 37 0; #X connect 6 0 40 0; #X connect 7 0 40 0; #X connect 8 0 40 0; #X connect 9 0 18 0; #X connect 19 0 20 0; #X connect 21 0 22 0; #X connect 30 0 40 0; #X connect 37 0 3 0; #X connect 38 0 40 0; #X connect 39 0 40 0; #X connect 40 0 4 0; #X connect 42 0 43 0; #X connect 44 0 45 0; #X connect 46 0 47 0; iem_utils-0.0.20240903/iem_tab/tab_find_exact_peaks-help.pd0000600000000000000000000000572414665566711020204 0ustar00#N canvas 178 103 949 490 10; #X obj 60 52 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 31 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 249 306 1.arg: source-name; #X floatatom 94 372 5 0 0 0 - - -; #X floatatom 143 373 5 0 0 0 - - -; #X msg 88 78 src src; #X msg 118 102 amp_sort; #X msg 120 124 freq_sort; #X floatatom 198 371 5 0 0 0 - - -; #X obj 263 369 pack 0 0 0; #X obj 263 392 print; #X msg 233 173 abs_min_height_diff 10; #X text 69 385 sort_index; #X text 204 382 amp; #X text 147 387 index; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 9.99997 9.28569 9.28569 10.7143 7.14284 7.85712 8.5714 39 10 11 38 8.5714 7.85712 8.5714 9.28569 8.5714 9.99997 39 40 41 38 12.8571 12.8571 14.2857 12.8571 11.4285 12.1428 11.4285 9.99997 10.7143 11.4285 9.99997 9.28569 9.28569 9.99997 10.7143 10.7143 45 9.99997 9.99997 10.7143 11.4285 12.1428 10.7143 11.4285 12.1428 11.4285 46 11.4285 11.4285 11.4285 12.1428 12.8571 11.4285 11.4285 12.1428 12.8571 12.1428 12.1428 12.1428 12.1428 12.1428 11.4285 11.4285 11.4285 11.4285 10.7143 48 49 43 11.4285 12.1428 13.5714 15 13.5714 13.5714 14.2857 14.2857 15 15 14.2857 14.2857 14.2857 15 15 15.7142 15.7142 51 53 15 15 15 15 15 14.2857 14.2857 15 15.7142 16.4285 16.4285; #X coords 0 100 99 0 200 140 1; #X restore 658 93 graph; #X msg 171 149 max_peaks 9; #X text 20 347 ready; #X msg 289 194 width_range 1 4; #X msg 289 216 width_range 1 1; #N canvas 0 22 466 316 (subpatch) 0; #X msg 355 125 \; src const 0; #X msg 303 175 \; src 37 45; #X msg 310 223 \; src 47 46; #X msg 187 177 \; src 67 48 49 43; #X msg 180 218 \; src 87 51 53; #X msg 44 223 \; src 7 39 10 11 38; #X msg 50 181 \; src 17 39 40 41 38; #X obj 65 25 loadbang; #X msg 33 50 \; src xticks 0 1 5; #X msg 34 84 \; src xlabel -5.15 0 10 20 30 40 50 60 70 80 90; #X connect 7 0 8 0; #X connect 7 0 9 0; #X restore 716 289 pd; #X obj 314 73 loadbang; #X text 89 50 calculate all peaks (index bin amplitude); #X text 218 61 of an array; #X text 78 442 IEM KUG; #X text 57 430 musil; #X text 92 430 @; #X text 100 430 iem.at; #X text 61 452 Graz \, Austria; #X text 267 296 initial arguments:; #X text 192 111 kind of order; #X text 258 150 maximum number of peaks detected; #X text 395 168 vertical difference between peak; #X text 399 177 and noise; #X text 406 205 width range of peak in bins; #X text 21 6 tab_exact_find_peaks; #X obj 60 302 tab_find_exact_peaks src; #X text 184 7 same like tab_find_peaks; #X text 13 419 (c) Thomas Musil 2000 - 2009; #X msg 289 240 width_range 3 5; #X connect 0 0 36 0; #X connect 5 0 36 0; #X connect 6 0 36 0; #X connect 7 0 36 0; #X connect 9 0 10 0; #X connect 11 0 36 0; #X connect 16 0 36 0; #X connect 18 0 36 0; #X connect 19 0 36 0; #X connect 21 0 6 0; #X connect 21 0 16 0; #X connect 21 0 11 0; #X connect 21 0 18 0; #X connect 36 0 1 0; #X connect 36 1 3 0; #X connect 36 1 9 0; #X connect 36 2 4 0; #X connect 36 2 9 1; #X connect 36 3 8 0; #X connect 36 3 9 2; #X connect 39 0 36 0; iem_utils-0.0.20240903/iem_tab/tab_find_peaks-help.pd0000600000000000000000000000553714665566711017022 0ustar00#N canvas 191 230 938 537 10; #X obj 60 52 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 31 331 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 200 306 1.arg: source-name; #X floatatom 94 372 5 0 0 0 - - -; #X floatatom 143 373 5 0 0 0 - - -; #X msg 88 78 src src; #X msg 118 102 amp_sort; #X msg 120 124 freq_sort; #X obj 60 302 tab_find_peaks src; #X floatatom 198 371 5 0 0 0 - - -; #X obj 263 369 pack 0 0 0; #X obj 263 392 print; #X msg 233 173 abs_min_height_diff 10; #X text 69 385 sort_index; #X text 204 382 amp; #X text 147 387 index; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 9.99997 9.28569 9.28569 10.7143 7.14284 7.85712 8.5714 39 10 11 38 8.5714 7.85712 8.5714 9.28569 8.5714 9.99997 39 40 41 38 12.8571 12.8571 14.2857 12.8571 11.4285 12.1428 11.4285 9.99997 10.7143 11.4285 9.99997 9.28569 9.28569 9.99997 10.7143 10.7143 45 9.99997 9.99997 10.7143 11.4285 12.1428 10.7143 11.4285 12.1428 11.4285 46 11.4285 11.4285 11.4285 12.1428 12.8571 11.4285 11.4285 12.1428 12.8571 12.1428 12.1428 12.1428 12.1428 12.1428 11.4285 11.4285 11.4285 11.4285 10.7143 48 49 43 11.4285 12.1428 13.5714 15 13.5714 13.5714 14.2857 14.2857 15 15 14.2857 14.2857 14.2857 15 15 15.7142 15.7142 51 53 15 15 15 15 15 14.2857 14.2857 15 15.7142 16.4285 16.4285; #X coords 0 100 99 0 200 140 1; #X restore 638 93 graph; #X msg 171 149 max_peaks 9; #X text 20 347 ready; #X msg 289 194 width_range 1 4; #X text 21 6 tab_find_peaks; #X msg 289 216 width_range 1 1; #N canvas 0 22 470 320 (subpatch) 0; #X msg 355 125 \; src const 0; #X msg 303 175 \; src 37 45; #X msg 310 223 \; src 47 46; #X msg 187 177 \; src 67 48 49 43; #X msg 180 218 \; src 87 51 53; #X msg 44 223 \; src 7 39 10 11 38; #X msg 50 181 \; src 17 39 40 41 38; #X obj 65 25 loadbang; #X msg 33 50 \; src xticks 0 1 5; #X msg 34 84 \; src xlabel -5.15 0 10 20 30 40 50 60 70 80 90; #X connect 7 0 8 0; #X connect 7 0 9 0; #X restore 696 289 pd; #X obj 311 69 loadbang; #X text 89 50 calculate all peaks (index bin amplitude); #X text 218 61 of an array; #X text 78 442 IEM KUG; #X text 57 430 musil; #X text 92 430 @; #X text 100 430 iem.at; #X text 61 452 Graz \, Austria; #X text 218 296 initial arguments:; #X text 190 111 kind of order; #X text 257 148 maximum number of peaks detected; #X text 395 171 vertical difference between peak; #X text 397 180 and noise; #X text 413 205 width range of peak in bins; #X text 13 419 (c) Thomas Musil 2000 - 2009; #X connect 0 0 8 0; #X connect 5 0 8 0; #X connect 6 0 8 0; #X connect 7 0 8 0; #X connect 8 0 1 0; #X connect 8 1 3 0; #X connect 8 1 10 0; #X connect 8 2 4 0; #X connect 8 2 10 1; #X connect 8 3 9 0; #X connect 8 3 10 2; #X connect 10 0 11 0; #X connect 12 0 8 0; #X connect 17 0 8 0; #X connect 19 0 8 0; #X connect 21 0 8 0; #X connect 23 0 6 0; #X connect 23 0 17 0; #X connect 23 0 12 0; #X connect 23 0 19 0; iem_utils-0.0.20240903/iem_tab/tab_ge-help.pd0000600000000000000000000000651014665566711015302 0ustar00#N canvas 116 92 859 564 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_ge; #X obj 61 78 tab_ge src1 src2 dst; #X obj 59 301 tab_ge src1 src2 dst; #X text 90 29 compare "greater than or equal to" the 2 src-arrays to dst-array; #X connect 2 0 32 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 32 0 3 0; #X connect 33 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_ge_scalar-help.pd0000600000000000000000000000462414665566711016633 0ustar00#N canvas 22 55 888 592 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 162 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 178 1.) src onset; #X text 42 189 2.) dst onset; #X text 42 200 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X text 12 3 tab_ge_scalar; #X obj 61 78 tab_ge_scalar src dst; #X obj 59 331 tab_ge_scalar src dst; #X text 129 29 compare "greater than or equal to" the src-array with this scalar to dst-array; #X connect 4 0 30 0; #X connect 5 0 30 0; #X connect 6 0 29 0; #X connect 7 0 29 0; #X connect 27 0 30 0; #X connect 29 0 2 0; #X connect 30 0 3 0; iem_utils-0.0.20240903/iem_tab/tab_get_size-help.pd0000600000000000000000000000312514665566711016517 0ustar00#N canvas 116 92 706 333 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 433 42 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X floatatom 60 102 5 0 0 0 - - -; #X text 93 224 IEM KUG; #X text 72 212 musil; #X text 107 212 @; #X text 115 212 iem.at; #X text 76 234 Graz \, Austria; #X text 201 68 initial arguments:; #X text 11 6 tab_sum; #X text 183 81 1.arg: source-name; #X text 28 201 (c) Thomas Musil 2000 - 2009; #X obj 61 78 tab_get_size src; #X text 56 116 array size; #X text 90 29 calc size of array; #X connect 1 0 12 0; #X connect 12 0 2 0; iem_utils-0.0.20240903/iem_tab/tab_gt-help.pd0000600000000000000000000000647514665566711015333 0ustar00#N canvas 116 92 859 564 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_gt; #X text 90 29 compare "greater than" the 2 src-arrays to dst-array ; #X obj 61 78 tab_gt src1 src2 dst; #X obj 59 301 tab_gt src1 src2 dst; #X connect 2 0 33 0; #X connect 5 0 34 0; #X connect 7 0 34 0; #X connect 8 0 34 0; #X connect 9 0 34 0; #X connect 33 0 3 0; #X connect 34 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_gt_scalar-help.pd0000600000000000000000000000460714665566711016653 0ustar00#N canvas 22 55 880 584 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 48 228 0 0 100 0.3; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X text 12 3 tab_gt_scalar; #X obj 61 78 tab_gt_scalar src dst; #X obj 59 331 tab_gt_scalar src dst; #X text 129 29 compare "greater than" the src-array with this scalar to dst-array; #X connect 4 0 30 0; #X connect 5 0 30 0; #X connect 6 0 30 0; #X connect 7 0 29 0; #X connect 8 0 29 0; #X connect 29 0 2 0; #X connect 30 0 3 0; iem_utils-0.0.20240903/iem_tab/tab_ifft-help.pd0000600000000000000000000002423114665566711015637 0ustar00#N canvas 265 105 961 540 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 239 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 62 371 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 353 graph; #X msg 103 276 dst_re dst_re; #X msg 118 299 dst_im dst_im; #X msg 139 322 fftsize 64; #X floatatom 474 22 5 0 63 0 - - -; #X msg 546 341 \; dst_re const 0 \; dst_im const 0; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #N canvas 0 22 478 328 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 60 103 \; src_re const 0 \; src_re \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 41 pd generate_a_dirac; #X floatatom 514 22 5 -32 32 0 - - -; #N canvas 0 22 543 496 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 127 t b f; #X obj 219 331 tabwrite src_re; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 39 333 tabwrite src_re; #X obj 90 70 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 39 310 * -1; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 7 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 7 0; #X connect 5 0 4 0; #X connect 6 0 17 0; #X connect 6 1 5 1; #X connect 8 0 16 0; #X connect 8 1 20 0; #X connect 9 0 10 0; #X connect 9 1 15 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 19 0; #X connect 13 0 12 0; #X connect 14 0 18 0; #X connect 14 1 13 1; #X connect 16 0 21 0; #X connect 17 0 1 0; #X connect 18 0 9 0; #X connect 19 0 15 0; #X connect 20 0 6 0; #X connect 21 0 14 0; #X restore 514 61 pd generate_a_cos; #X floatatom 555 22 5 -31 31 0 - - -; #N canvas 0 22 499 423 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 337 tabwrite src_re; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 335 tabwrite src_re; #X obj 54 287 sin; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 54 312 * -1; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 7 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 6 0; #X connect 6 0 20 0; #X connect 6 1 4 1; #X connect 8 0 7 0; #X connect 9 0 10 0; #X connect 9 1 15 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 16 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 14 1 12 1; #X connect 16 0 21 0; #X connect 17 0 18 0; #X connect 17 1 5 0; #X connect 18 0 13 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X connect 21 0 15 0; #X restore 555 82 pd generate_a_sin; #X text 299 365 initial arguments:; #X text 37 147 list of 4 floats:; #X text 49 178 3.) dst_re-onset; #X text 49 188 4.) dst_im-onset; #X text 49 158 1.) src_re-onset; #X text 49 168 2.) src_im-onset; #X msg 62 207 20 20 30 30; #X text 259 412 4.arg: imag_destination-name; #X text 259 400 3.arg: real_destination-name; #X text 259 389 2.arg: imag_source-name; #X text 259 378 1.arg: real_source-name; #N canvas 0 22 450 300 (subpatch) 0; #X array src_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 124 graph; #X msg 76 230 src_re src_re; #X msg 90 253 src_im src_im; #X msg 546 283 \; src_re const 0 \; src_im const 0; #X floatatom 474 132 5 0 63 0 - - -; #N canvas 0 22 478 328 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 61 99 \; src_im const 0 \; src_im \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 151 pd generate_a_dirac; #X floatatom 514 132 5 -32 32 0 - - -; #N canvas 0 22 499 423 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 40 334 tabwrite src_im; #X obj 220 331 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 39 153 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 153 pd counter; #X obj 39 311 * -1; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X connect 0 0 7 0; #X connect 1 0 2 0; #X connect 1 1 16 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 16 0; #X connect 5 0 4 0; #X connect 6 0 18 0; #X connect 6 1 5 1; #X connect 7 0 14 0; #X connect 7 1 20 0; #X connect 8 0 9 0; #X connect 8 1 15 1; #X connect 9 0 10 0; #X connect 10 0 12 0; #X connect 11 0 19 0; #X connect 12 0 11 0; #X connect 13 0 17 0; #X connect 13 1 12 1; #X connect 14 0 21 0; #X connect 17 0 8 0; #X connect 18 0 1 0; #X connect 19 0 15 0; #X connect 20 0 6 0; #X connect 21 0 13 0; #X restore 514 171 pd generate_a_cos; #X floatatom 555 132 5 -31 31 0 - - -; #N canvas 0 22 495 419 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 131 t b f; #X obj 54 287 sin; #X obj 102 60 moses 0; #X obj 54 88 * -1; #X obj 246 337 tabwrite src_im; #X obj 54 336 tabwrite src_im; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 53 312 * -1; #X connect 0 0 15 0; #X connect 1 0 2 0; #X connect 1 1 17 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 6 0; #X connect 6 0 20 0; #X connect 6 1 4 1; #X connect 7 0 17 0; #X connect 8 0 9 0; #X connect 8 1 18 1; #X connect 9 0 10 0; #X connect 10 0 11 0; #X connect 11 0 14 0; #X connect 12 0 13 0; #X connect 13 0 19 0; #X connect 13 1 11 1; #X connect 14 0 21 0; #X connect 15 0 16 0; #X connect 15 1 5 0; #X connect 16 0 12 0; #X connect 19 0 8 0; #X connect 20 0 1 0; #X connect 21 0 18 0; #X restore 555 192 pd generate_a_sin; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X text 10 0 tab_ifft; #X text 93 -1 complex inverse FTT with arrays; #X text 45 56 calculates a complex inverse fourier transformation of complex src-arrays to complex dst-arrays; #X obj 24 94 tab_ifft src_re src_im dst_re dst_im 64; #X obj 62 348 tab_ifft src_re src_im dst_re dst_im 64; #X text 259 424 5.arg: ifftsize; #X connect 2 0 46 0; #X connect 6 0 47 0; #X connect 7 0 47 0; #X connect 8 0 47 0; #X connect 9 0 16 0; #X connect 17 0 18 0; #X connect 19 0 20 0; #X connect 27 0 47 0; #X connect 33 0 47 0; #X connect 34 0 47 0; #X connect 36 0 37 0; #X connect 38 0 39 0; #X connect 40 0 41 0; #X connect 46 0 3 0; #X connect 47 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_le-help.pd0000600000000000000000000000650514665566711015313 0ustar00#N canvas 116 92 863 568 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_le; #X obj 61 78 tab_le src1 src2 dst; #X obj 59 301 tab_le src1 src2 dst; #X text 90 29 compare "less than or equal to" the 2 src-arrays to dst-array; #X connect 2 0 32 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 32 0 3 0; #X connect 33 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_le_scalar-help.pd0000600000000000000000000000462114665566711016635 0ustar00#N canvas 22 55 884 588 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X text 12 3 tab_le_scalar; #X text 129 29 compare "less than or equal to" the src-array with this scalar to dst-array; #X obj 61 78 tab_le_scalar src dst; #X obj 59 331 tab_le_scalar src dst; #X connect 4 0 31 0; #X connect 5 0 31 0; #X connect 6 0 30 0; #X connect 7 0 30 0; #X connect 27 0 31 0; #X connect 30 0 2 0; #X connect 31 0 3 0; iem_utils-0.0.20240903/iem_tab/tab_lt-help.pd0000600000000000000000000000647114665566711015334 0ustar00#N canvas 116 92 859 564 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_lt; #X text 90 29 compare less than" the 2 src-arrays to dst-array ; #X obj 61 78 tab_lt src1 src2 dst; #X obj 59 301 tab_lt src1 src2 dst; #X connect 2 0 33 0; #X connect 5 0 34 0; #X connect 7 0 34 0; #X connect 8 0 34 0; #X connect 9 0 34 0; #X connect 33 0 3 0; #X connect 34 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_lt_scalar-help.pd0000600000000000000000000000460514665566711016656 0ustar00#N canvas 22 55 884 588 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 201 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 205 72 (the number of samples which were compared are:; #X text 12 3 tab_lt_scalar; #X text 129 29 compare "less than" the src-array with this scalar to dst-array; #X obj 59 331 tab_lt_scalar src dst; #X msg 48 228 0 0 100 0.5; #X obj 61 78 tab_lt_scalar src dst; #X connect 4 0 29 0; #X connect 5 0 29 0; #X connect 6 0 31 0; #X connect 7 0 31 0; #X connect 29 0 3 0; #X connect 30 0 29 0; #X connect 31 0 2 0; iem_utils-0.0.20240903/iem_tab/tab_max_index-help.pd0000600000000000000000000000460314665566711016664 0ustar00#N canvas 118 94 788 440 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.185715 0.185715 0.200001 0.214286 0.214286 0.214286 0.228572 0.228572 0.214286 0.200001 0.185715 0.171429 0.142857 0.1 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 529 24 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 294 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 205 270 1.arg: source-name; #X msg 101 213 src src; #X floatatom 109 103 5 0 0 0 - - -; #X floatatom 158 104 5 0 0 0 - - -; #X text 166 118 max; #X floatatom 107 320 5 0 0 0 - - -; #X floatatom 156 336 5 0 0 0 - - -; #X msg 59 193 35 50; #X obj 61 78 tab_max_index src; #X text 97 117 max_index; #X obj 59 262 tab_max_index src; #X text 75 384 IEM KUG; #X text 59 372 musil; #X text 89 372 @; #X text 95 372 iem.at; #X text 58 394 Graz \, Austria; #X text 10 361 (c) Thomas Musil 2000 - 2006; #X text 229 258 initial arguments:; #X text 65 280 output; #X text 152 213 xxx : change source name; #X text 11 6 tab_max_index; #X text 43 150 list of 2 floats:; #X text 55 160 1.) src onset; #X text 55 171 2.) n samples to calculate maximum; #X text 163 319 maximum value output; #X text 115 301 maximum index output; #X text 85 29 calculate maximum element and its index of array ; #X connect 1 0 12 0; #X connect 5 0 14 0; #X connect 11 0 14 0; #X connect 12 0 2 0; #X connect 12 1 6 0; #X connect 12 2 7 0; #X connect 14 0 3 0; #X connect 14 1 9 0; #X connect 14 2 10 0; iem_utils-0.0.20240903/iem_tab/tab_min_index-help.pd0000600000000000000000000000460214665566711016661 0ustar00#N canvas 116 92 784 436 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.185715 0.185715 0.200001 0.214286 0.214286 0.214286 0.228572 0.228572 0.214286 0.200001 0.185715 0.171429 0.142857 0.1 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 529 24 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 294 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 205 270 1.arg: source-name; #X msg 101 213 src src; #X floatatom 109 103 5 0 0 0 - - -; #X floatatom 158 104 5 0 0 0 - - -; #X floatatom 107 320 5 0 0 0 - - -; #X floatatom 156 336 5 0 0 0 - - -; #X msg 59 193 35 50; #X text 75 384 IEM KUG; #X text 59 372 musil; #X text 89 372 @; #X text 95 372 iem.at; #X text 58 394 Graz \, Austria; #X text 10 361 (c) Thomas Musil 2000 - 2006; #X text 229 258 initial arguments:; #X text 65 280 output; #X text 152 213 xxx : change source name; #X text 43 150 list of 2 floats:; #X text 55 160 1.) src onset; #X text 11 6 tab_min_index; #X obj 61 78 tab_min_index src; #X obj 59 262 tab_min_index src; #X text 55 171 2.) n samples to calculate minimum; #X text 115 301 minimum index output; #X text 163 319 minimum value output; #X text 166 118 min; #X text 97 117 min_index; #X text 85 29 calculate minimum element and its index of array ; #X connect 1 0 23 0; #X connect 5 0 24 0; #X connect 10 0 24 0; #X connect 23 0 2 0; #X connect 23 1 6 0; #X connect 23 2 7 0; #X connect 24 0 3 0; #X connect 24 1 8 0; #X connect 24 2 9 0; iem_utils-0.0.20240903/iem_tab/tab_min_max-help.pd0000600000000000000000000000460614665566711016343 0ustar00#N canvas 82 83 782 436 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.185715 0.185715 0.200001 0.214286 0.214286 0.214286 0.228572 0.228572 0.214286 0.200001 0.185715 0.171429 0.142857 0.1 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 20 graph; #X obj 61 34 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 109 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 297 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 205 273 1.arg: source-name; #X msg 101 216 src src; #X floatatom 103 106 5 0 0 0 - - -; #X floatatom 146 107 5 0 0 0 - - -; #X text 154 121 max; #X floatatom 101 323 5 0 0 0 - - -; #X floatatom 144 339 5 0 0 0 - - -; #X msg 59 196 35 50; #X text 75 387 IEM KUG; #X text 59 375 musil; #X text 89 375 @; #X text 95 375 iem.at; #X text 58 397 Graz \, Austria; #X text 10 364 (c) Thomas Musil 2000 - 2006; #X text 229 261 initial arguments:; #X text 65 283 output; #X text 152 216 xxx : change source name; #X text 43 153 list of 2 floats:; #X text 55 163 1.) src onset; #X text 151 322 maximum value output; #X text 11 9 tab_min_max; #X text 85 32 calculate minimum and maximum element value of array; #X text 55 174 2.) n samples to calculate minimum and maximum; #X text 110 120 min; #X obj 61 81 tab_min_max src; #X text 108 304 minimum value output; #X obj 59 265 tab_min_max src; #X connect 1 0 28 0; #X connect 5 0 30 0; #X connect 11 0 30 0; #X connect 28 0 2 0; #X connect 28 1 6 0; #X connect 28 2 7 0; #X connect 30 0 3 0; #X connect 30 1 9 0; #X connect 30 2 10 0; iem_utils-0.0.20240903/iem_tab/tab_mul-help.pd0000600000000000000000000000721614665566711015510 0ustar00#N canvas 116 92 853 558 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 20 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 368 graph; #X obj 61 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 116 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 286 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 171 graph; #X msg 136 243 src1 src1; #X msg 195 265 src2 src2; #X msg 59 221 50 50 20 50; #X text 45 149 list of 4 floats:; #X text 212 363 3.arg: destination-name; #X text 78 445 IEM KUG; #X text 62 433 musil; #X text 92 433 @; #X text 98 433 iem.at; #X text 61 455 Graz \, Austria; #X text 13 422 (c) Thomas Musil 2000 - 2006; #X text 234 322 initial arguments:; #X text 72 329 output; #X text 306 285 xxx : change destination name; #X text 208 96 the minimum of the 3 array lengths); #X text 56 187 3.) dst onset; #X text 56 165 1.) src_1 onset; #X text 56 176 2.) src_2 onset; #X text 199 243 xxx : change source name 1; #X text 257 265 xxx : change source name 2; #X text 211 336 1.arg: source-name 1; #X text 211 349 2.arg: source-name 2; #X text 12 13 tab_mul; #X text 90 39 multiply the 2 src-arrays to dst-array; #X text 195 82 (the number of samples which were multiplied are:; #X text 56 197 4.) n samples to multiply; #X obj 59 311 tab_mul src1 src2 dst; #X obj 61 88 tab_mul src1 src2 dst; #X connect 2 0 34 0; #X connect 5 0 33 0; #X connect 7 0 33 0; #X connect 8 0 33 0; #X connect 9 0 33 0; #X connect 33 0 4 0; #X connect 34 0 3 0; iem_utils-0.0.20240903/iem_tab/tab_mul_scalar-help.pd0000600000000000000000000000473214665566711017035 0ustar00#N canvas 115 92 856 560 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 527 46 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X text 211 336 1.arg: source-name; #X msg 197 270 dst dst; #X msg 47 36 0.5; #X msg 145 247 src src; #X msg 82 37 -0.5; #X msg 48 227 50 20 50 -0.8; #X text 211 349 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 234 322 initial arguments:; #X text 71 322 output; #X text 250 271 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 197 246 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 205 72 (the number of samples which were added are:; #X text 12 3 tab_mul_scalar; #X text 129 29 multiply the src-array with this scalar to dst-array ; #X obj 61 78 tab_mul_scalar src dst; #X obj 59 301 tab_mul_scalar src dst; #X text 42 200 3.) n samples to multiply; #X text 42 210 4.) multiplied scalar value; #X connect 5 0 29 0; #X connect 6 0 28 0; #X connect 7 0 29 0; #X connect 8 0 28 0; #X connect 9 0 29 0; #X connect 28 0 2 0; #X connect 29 0 3 0; iem_utils-0.0.20240903/iem_tab/tab_ne-help.pd0000600000000000000000000000647514665566711015323 0ustar00#N canvas 116 92 863 568 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485715 0.471429 0.457144 0.442858 0.442858 0.428572 0.414286 0.385715 0.357143 0.342858 0.314286 0.285715 0.242857 0.185714 0.142857 0.114286 0.085714; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 358 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 340 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 276 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.442849 0.457135 0.471421 0.471421 0.485706 0.485706 0.485706 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.485714 0.471429 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 161 graph; #X msg 136 233 src1 src1; #X msg 195 255 src2 src2; #X msg 59 211 50 50 20 50; #X text 45 139 list of 4 floats:; #X text 212 353 3.arg: destination-name; #X text 78 435 IEM KUG; #X text 62 423 musil; #X text 92 423 @; #X text 98 423 iem.at; #X text 61 445 Graz \, Austria; #X text 13 412 (c) Thomas Musil 2000 - 2006; #X text 234 312 initial arguments:; #X text 72 319 output; #X text 306 275 xxx : change destination name; #X text 208 86 the minimum of the 3 array lengths); #X text 56 177 3.) dst onset; #X text 56 155 1.) src_1 onset; #X text 56 166 2.) src_2 onset; #X text 199 233 xxx : change source name 1; #X text 257 255 xxx : change source name 2; #X text 211 326 1.arg: source-name 1; #X text 211 339 2.arg: source-name 2; #X text 195 72 (the number of samples which were compared are:; #X text 56 187 4.) n samples to compare; #X text 12 3 tab_ne; #X text 90 29 compare "not equal to" the 2 src-arrays to dst-array ; #X obj 61 78 tab_ne src1 src2 dst; #X obj 59 301 tab_ne src1 src2 dst; #X connect 2 0 33 0; #X connect 5 0 34 0; #X connect 7 0 34 0; #X connect 8 0 34 0; #X connect 9 0 34 0; #X connect 33 0 3 0; #X connect 34 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_ne_scalar-help.pd0000600000000000000000000000461014665566711016635 0ustar00#N canvas 22 55 880 584 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.485714 -0.457143 -0.4 -0.285713 -0.0571409 0.157146 0.328575 0.442861 0.557148 0.628577 0.714292 0.800006 0.85715 0.885721 0.885721 0.871435 0.842864 0.757149 0.557148 0.41429 0.257146 -0.0142835 -0.314285 -0.528572 -0.714287 -0.757145 -0.757145 -0.757145 -0.742859 -0.742859 -0.728573 -0.714287 -0.685715 -0.657144 -0.585715 -0.528572 -0.4 -0.242856 -0.0428551 0.157146 0.342861 0.51429 0.728577 0.800006 0.828578 0.828578 0.828578 0.828578 0.800006 0.771435 0.714292 0.571433 0.41429 0.242861 0.0857169 -0.0571409 -0.242856 -0.385714 -0.542858 -0.685716 -0.757145 -0.800002 -0.828574 -0.828574 -0.814288 -0.800002 -0.785716 -0.757145 -0.728573 -0.67143 -0.585715 -0.471429 -0.271428 -0.0857125 0.114288 0.228575 0.314289 0.385718 0.414285 0.428571 0.457143 0.471428 0.485714 0.485714 0.5 0.5 0.5 0.5 0.5 0.5 0.5; #X coords 0 1 99 -1 200 140 1; #X restore 527 116 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 527 325 graph; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 370 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 178 272 dst dst; #X msg 129 249 src src; #X msg 47 36 0.5; #X msg 82 37 -0.5; #X text 201 332 1.arg: source-name; #X text 201 345 2.arg: destination-name; #X text 31 163 list of 4 floats:; #X text 78 475 IEM KUG; #X text 62 463 musil; #X text 92 463 @; #X text 98 463 iem.at; #X text 61 485 Graz \, Austria; #X text 13 452 (c) Thomas Musil 2000 - 2006; #X text 224 318 initial arguments:; #X text 75 351 output; #X text 229 272 xxx : change destination name; #X text 218 86 the minimum of both array lengths); #X text 182 248 xxx : change source name; #X text 42 179 1.) src onset; #X text 42 190 2.) dst onset; #X text 42 200 3.) n samples to compare; #X text 42 210 4.) compared scalar value; #X text 12 3 tab_ne_scalar; #X text 129 29 compare "not equal to" the src-array with this scalar to dst-array; #X obj 61 78 tab_ne_scalar src dst; #X text 205 72 (the number of samples which were compared are:; #X msg 48 228 0 0 100 0.5; #X obj 59 331 tab_ne_scalar src dst; #X connect 4 0 31 0; #X connect 5 0 31 0; #X connect 6 0 28 0; #X connect 7 0 28 0; #X connect 28 0 2 0; #X connect 30 0 31 0; #X connect 31 0 3 0; iem_utils-0.0.20240903/iem_tab/tab_powtodb-help.pd0000600000000000000000000000457714665566711016400 0ustar00#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0357179 0.0357179 0.0428607 0.0428607 0.0428607 0.0500035 0.0642891 0.0714318 0.0785746 0.0857174 0.0857174 0.100003 0.100003 0.107146 0.107146 0.114289 0.114289 0.121431 0.121431 0.128574 0.128574 0.135717 0.14286 0.14286 0.14286 0.150002 0.157145 0.157145 0.171431 0.178574 0.185716 0.192859 0.200002 0.214287 0.214287 0.22143 0.228573 0.242859 0.242859 0.257144 0.257144 0.264287 0.278573 0.292858 0.300001 0.314286 0.335715 0.35 0.357143 0.364286 0.378571 0.392857 0.407143 0.414285 0.435714 0.442857 0.449999 0.457142 0.471428 0.485713 0.492856 0.499999 0.521427 0.52857 0.542856 0.542856 0.564284 0.578569 0.599998 0.621426 0.635712 0.642854 0.649997 0.671426 0.685711 0.699997 0.707139 0.714282 0.735711 0.757139 0.764282 0.771425 0.778567 0.799996 0.807138 0.821424 0.83571 0.864281 0.885709 0.885709 0.899995 0.935709 0.949994 0.957137; #X coords 0 1 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 100 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 90 29 calculates the powtodb-value from src to dst; #X obj 61 78 tab_powtodb src dst; #X obj 59 264 tab_powtodb src dst; #X text 57 185 3.) n samples of powtodb; #X text 12 4 tab_powtodb; #X connect 2 0 26 0; #X connect 5 0 27 0; #X connect 9 0 27 0; #X connect 10 0 27 0; #X connect 26 0 3 0; #X connect 27 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_reverse-help.pd0000600000000000000000000000466014665566711016366 0ustar00#N canvas 96 21 782 474 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 -0.871431 -0.84286 -0.814288 -0.814288 -0.800002 -0.771431 -0.757145 -0.742859 -0.728574 -0.714288 -0.685716 -0.671431 -0.657145 -0.642859 -0.628573 -0.614288 -0.600002 -0.585716 -0.57143 -0.542859 -0.542859 -0.528573 -0.514287 -0.500002 -0.485716 -0.47143 -0.457144 -0.442859 -0.428573 -0.414287 -0.400002 -0.385716 -0.385716 -0.357144 -0.342859 -0.342859 -0.328573 -0.314287 -0.300001 -0.285716 -0.27143 -0.257144 -0.228573 -0.228573 -0.200001 -0.185715 -0.185715 -0.17143 -0.142858 -0.142858 -0.128572 -0.114287 -0.085715 -0.085715 -0.0571435 -0.028572 -0.0142863 -5.01052e-007 0.0142853 0.028571 0.0571425 0.0714283 0.0714283 0.0999998 0.114286 0.142857 0.142857 0.171429 0.185714 0.214286 0.228572 0.242857 0.257143 0.285715 0.3 0.328572 0.342858 0.357143 0.371429 0.400001 0.414286 0.428572 0.457143 0.471429 0.485715 0.500001 0.514286 0.542858 0.571429 0.585715 0.600001 0.628572 0.642858 0.657144 0.685715 0.700001 0.714287 0.742858 0.757144 0.77143; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 534 176 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 78 tab_reverse src dst; #X obj 59 341 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 195 314 1.arg: source-name; #X text 195 327 2.arg: destination-name; #X msg 116 231 src src; #X msg 166 249 dst dst; #X obj 59 302 tab_reverse src dst; #X text 185 69 (the number of samples which are copied are:; #X text 198 83 the minimum of both array lengths); #X text 12 3 tab_reverse; #X text 90 29 copy value from src to dst in reverse arrangement ; #X text 44 164 list of 3 floats:; #X text 78 415 IEM KUG; #X text 62 403 musil; #X text 92 403 @; #X text 98 403 iem.at; #X text 61 425 Graz \, Austria; #X text 13 392 (c) Thomas Musil 2000 - 2006; #X text 56 175 1.) src onset; #X text 56 185 2.) dst onset; #X text 226 302 initial arguments:; #X text 74 319 output; #X text 173 229 xxx : change source name; #X text 219 248 xxx : change destination name; #X text 56 195 3.) n samples to copy reversal; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 6 0 11 0; #X connect 9 0 11 0; #X connect 10 0 11 0; #X connect 11 0 5 0; iem_utils-0.0.20240903/iem_tab/tab_rfft-help.pd0000600000000000000000000001353014665566711015650 0ustar00#N canvas 0 22 965 544 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 239 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 353 graph; #X msg 89 252 dst_re dst_re; #X msg 104 275 dst_im dst_im; #X msg 125 298 fftsize 64; #X floatatom 474 22 5 0 63 0 - - -; #X msg 546 341 \; dst_re const 0 \; dst_im const 0; #N canvas 0 22 482 332 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 61 89 \; src const 0 \; src \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 474 41 pd generate_a_dirac; #X floatatom 514 22 5 -32 32 0 - - -; #N canvas 0 22 507 431 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 39 310 / -32; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 458 308 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X obj 39 333 tabwrite src; #X obj 219 331 tabwrite src; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 22 0; #X connect 7 0 17 0; #X connect 7 1 5 1; #X connect 8 0 15 0; #X connect 8 1 19 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 16 0; #X connect 13 0 12 0; #X connect 14 0 18 0; #X connect 14 1 13 1; #X connect 15 0 20 0; #X connect 16 0 21 0; #X connect 17 0 1 0; #X connect 18 0 9 0; #X connect 19 0 7 0; #X connect 20 0 14 0; #X restore 514 61 pd generate_a_cos; #X floatatom 555 22 5 -31 31 0 - - -; #N canvas 0 22 503 427 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 54 334 tabwrite src; #X obj 246 337 tabwrite src; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 22 0; #X connect 6 0 7 0; #X connect 7 0 20 0; #X connect 7 1 4 1; #X connect 8 0 5 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 14 1 12 1; #X connect 15 0 16 0; #X connect 16 0 21 0; #X connect 17 0 18 0; #X connect 17 1 6 0; #X connect 18 0 13 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X restore 555 82 pd generate_a_sin; #X text 309 355 initial arguments:; #X msg 546 283 \; src const 0; #X msg 76 230 src src; #X msg 62 207 20 30 30; #X text 49 158 1.) src-onset; #X text 49 168 2.) dst_re-onset; #X text 49 178 3.) dst_im-onset; #X text 37 147 list of 3 floats:; #X text 269 368 1.arg: source-name; #X text 269 380 2.arg: real_destination-name; #X text 269 392 3.arg: imag_destination-name; #X text 269 404 4.arg: fftsize; #X text 10 0 tab_rfft; #X text 93 -1 real FTT with arrays; #X text 45 56 calculates a real fourier transformation of a real src-array to complex dst-arrays; #X obj 24 94 tab_rfft src dst_re dst_im 64; #X obj 62 322 tab_rfft src dst_re dst_im 64; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X connect 2 0 31 0; #X connect 6 0 32 0; #X connect 7 0 32 0; #X connect 8 0 32 0; #X connect 9 0 11 0; #X connect 12 0 13 0; #X connect 14 0 15 0; #X connect 18 0 32 0; #X connect 19 0 32 0; #X connect 31 0 3 0; #X connect 32 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_rifft-help.pd0000600000000000000000000001436714665566711016032 0ustar00#N canvas 24 39 991 674 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src_re 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 210 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array src_im 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 327 graph; #X obj 24 47 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 24 122 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 513 graph; #X msg 125 298 fftsize 64; #X text 309 425 initial arguments:; #X text 10 0 tab_rifft; #X text 93 -1 real inverse FTT with arrays; #X text 37 147 list of 3 floats:; #X msg 587 540 \; dst const 0; #X obj 62 322 tab_rifft src_re src_im dst 64; #X obj 24 94 tab_rifft src_re src_im dst 64; #X text 49 158 1.) src_re-onset; #X text 49 168 2.) src_im-onset; #X text 49 178 3.) dst-onset; #X msg 62 207 20 20 30; #X msg 76 230 src_re src_re; #X msg 89 252 src_im src_im; #X msg 104 275 dst dst; #X text 269 438 1.arg: real source-name; #X text 269 450 2.arg: imag_source-name; #X text 269 462 3.arg: destination-name; #X text 45 56 calculates a real inverse fourier transformation of complex src-arrays to a real dst-array; #X text 269 474 4.arg: ifftsize; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 0; #X coords 0 1 99 -1 199 100 1; #X restore 694 31 graph; #X floatatom 479 40 5 0 63 0 - - -; #N canvas 0 22 486 336 generate_a_dirac 0; #X obj 61 62 clip 0 63; #X obj 61 32 inlet; #X msg 61 89 \; src const 0 \; src \$1 1; #X connect 0 0 2 0; #X connect 1 0 0 0; #X restore 479 59 pd generate_a_dirac; #X floatatom 519 40 5 -32 32 0 - - -; #N canvas 0 22 515 439 generate_a_cos 0; #X obj 120 18 inlet; #X obj 219 176 t f f; #X obj 219 211 / 32; #X obj 219 232 * 3.14159; #X obj 219 283 cos; #X obj 219 257 * 8; #X obj 219 308 / 32; #X obj 219 127 t b f; #X obj 120 43 moses 0; #X obj 39 178 t f f; #X obj 39 213 / 32; #X obj 39 234 * 3.14159; #X obj 39 285 cos; #X obj 39 259 * 8; #X obj 39 129 t b f; #X obj 90 70 * -1; #X obj 39 310 / -32; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 219 151 pd counter; #N canvas 193 158 458 308 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 38 154 pd counter; #X obj 219 106 clip 0 32; #X obj 39 108 clip 0 32; #X obj 39 333 tabwrite src; #X obj 219 331 tabwrite src; #X connect 0 0 8 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 6 0 22 0; #X connect 7 0 17 0; #X connect 7 1 5 1; #X connect 8 0 15 0; #X connect 8 1 19 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 13 0; #X connect 12 0 16 0; #X connect 13 0 12 0; #X connect 14 0 18 0; #X connect 14 1 13 1; #X connect 15 0 20 0; #X connect 16 0 21 0; #X connect 17 0 1 0; #X connect 18 0 9 0; #X connect 19 0 7 0; #X connect 20 0 14 0; #X restore 519 79 pd generate_a_cos; #X floatatom 560 40 5 -31 31 0 - - -; #N canvas 0 22 507 431 generate_a_sin 0; #X obj 102 37 inlet; #X obj 246 182 t f f; #X obj 246 217 / 32; #X obj 246 238 * 3.14159; #X obj 246 263 * 8; #X obj 246 314 / 32; #X obj 246 112 clip 0 31; #X obj 246 133 t b f; #X obj 246 289 sin; #X obj 54 180 t f f; #X obj 54 215 / 32; #X obj 54 236 * 3.14159; #X obj 54 261 * 8; #X obj 54 110 clip 0 31; #X obj 54 132 t b f; #X obj 54 287 sin; #X obj 54 312 / -32; #X obj 102 60 moses 0; #X obj 54 88 * -1; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 54 156 pd counter; #N canvas 193 158 454 304 counter 0; #X obj 108 25 inlet; #X obj 109 163 outlet; #X obj 109 133 f; #X obj 142 133 + 1; #X obj 108 50 t b b; #X msg 154 76 0; #X msg 109 75 64; #X obj 110 98 until; #X connect 0 0 4 0; #X connect 2 0 3 0; #X connect 2 0 1 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 4 1 5 0; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 2 0; #X restore 246 156 pd counter; #X obj 54 334 tabwrite src; #X obj 246 337 tabwrite src; #X connect 0 0 17 0; #X connect 1 0 2 0; #X connect 1 1 22 1; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 22 0; #X connect 6 0 7 0; #X connect 7 0 20 0; #X connect 7 1 4 1; #X connect 8 0 5 0; #X connect 9 0 10 0; #X connect 9 1 21 1; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 14 1 12 1; #X connect 15 0 16 0; #X connect 16 0 21 0; #X connect 17 0 18 0; #X connect 17 1 6 0; #X connect 18 0 13 0; #X connect 19 0 9 0; #X connect 20 0 1 0; #X restore 560 100 pd generate_a_sin; #X obj 471 258 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 471 333 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 471 305 tab_rfft src src_re src_im 64; #X msg 590 127 \; src const 0; #X text 102 464 IEM KUG; #X text 81 452 musil; #X text 116 452 @; #X text 124 452 iem.at; #X text 85 474 Graz \, Austria; #X text 37 441 (c) Thomas Musil 2000 - 2009; #X text 521 17 1.); #X text 469 236 2.); #X text 44 25 3.); #X connect 2 0 13 0; #X connect 6 0 12 0; #X connect 12 0 4 0; #X connect 13 0 3 0; #X connect 17 0 12 0; #X connect 18 0 12 0; #X connect 19 0 12 0; #X connect 20 0 12 0; #X connect 27 0 28 0; #X connect 29 0 30 0; #X connect 31 0 32 0; #X connect 33 0 35 0; #X connect 35 0 34 0; iem_utils-0.0.20240903/iem_tab/tab_rmstodb-help.pd0000600000000000000000000000457714665566711016374 0ustar00#N canvas 369 22 790 417 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0214324 0.0357179 0.0357179 0.0428607 0.0428607 0.0428607 0.0500035 0.0642891 0.0714318 0.0785746 0.0857174 0.0857174 0.100003 0.100003 0.107146 0.107146 0.114289 0.114289 0.121431 0.121431 0.128574 0.128574 0.135717 0.14286 0.14286 0.14286 0.150002 0.157145 0.157145 0.171431 0.178574 0.185716 0.192859 0.200002 0.214287 0.214287 0.22143 0.228573 0.242859 0.242859 0.257144 0.257144 0.264287 0.278573 0.292858 0.300001 0.314286 0.335715 0.35 0.357143 0.364286 0.378571 0.392857 0.407143 0.414285 0.435714 0.442857 0.449999 0.457142 0.471428 0.485713 0.492856 0.499999 0.521427 0.52857 0.542856 0.542856 0.564284 0.578569 0.599998 0.621426 0.635712 0.642854 0.649997 0.671426 0.685711 0.699997 0.707139 0.714282 0.735711 0.757139 0.764282 0.771425 0.778567 0.799996 0.807138 0.821424 0.83571 0.864281 0.885709 0.885709 0.899995 0.935709 0.949994 0.957137; #X coords 0 1 99 0 200 140 1; #X restore 534 10 graph; #N canvas 0 22 450 300 (subpatch) 0; #X array dst 100 float 0; #X coords 0 100 99 0 200 140 1; #X restore 534 166 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 59 211 50 20 50; #X text 44 154 list of 3 floats:; #X text 222 273 1.arg: source-name; #X text 222 286 2.arg: destination-name; #X msg 154 213 src src; #X msg 185 234 dst dst; #X text 78 365 IEM KUG; #X text 57 353 musil; #X text 92 353 @; #X text 100 353 iem.at; #X text 61 375 Graz \, Austria; #X text 56 165 1.) src onset; #X text 56 175 2.) dst onset; #X text 231 261 initial arguments:; #X text 68 283 output; #X text 208 213 xxx : change source name; #X text 240 233 xxx : change destination name; #X text 205 69 (the number of samples which are copied are:; #X text 218 83 the minimum of both array lengths); #X text 12 4 tab_rmstodb; #X obj 61 78 tab_rmstodb src dst; #X text 57 185 3.) n samples of rmstodb; #X obj 59 264 tab_rmstodb src dst; #X text 13 342 (c) Thomas Musil 2000 - 2010; #X text 90 29 calculates the rmstodb-value from src to dst; #X connect 2 0 25 0; #X connect 5 0 27 0; #X connect 9 0 27 0; #X connect 10 0 27 0; #X connect 25 0 3 0; #X connect 27 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_sqrt-help.pd0000600000000000000000000000461214665566711015701 0ustar00#N canvas 116 92 786 482 10; #N canvas 0 0 450 300 graph1 0; #X array src 100 float 1; #A 0 0.916135 0.888992 0.83593 0.810011 0.784501 0.759399 0.734704 0.710418 0.663071 0.640009 0.595111 0.573274 0.551845 0.510212 0.490007 0.450823 0.413271 0.395108 0.377353 0.326536 0.310413 0.279392 0.264494 0.250004 0.222248 0.196126 0.171635 0.160003 0.148778 0.127553 0.0987772 0.0900016 0.0736748 0.0661237 0.0522459 0.0459193 0.0344905 0.0246944 0.0204086 0.0130616 0.0100003 0.00326543 0.00183682 0.000816378 5.03628e-013 0.000204064 0.0018367 0.00510201 0.00510201 0.00999999 0.0165306 0.0204082 0.0293879 0.0400002 0.0459187 0.05898 0.0661229 0.0816333 0.0816333 0.0987763 0.10796 0.127552 0.13796 0.148777 0.160001 0.183675 0.196124 0.208982 0.235921 0.250002 0.279391 0.294697 0.310411 0.343065 0.360004 0.377351 0.395106 0.431841 0.470209 0.490005 0.510209 0.530822 0.551843 0.573271 0.595108 0.617354 0.640007 0.663068 0.686538 0.710416 0.734702 0.734702 0.759396 0.784498 0.810009 0.835928 0.862254 0.862254 0.88899 0.916133; #X coords 0 1 99 -1 200 140 1; #X restore 534 10 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 534 176 graph; #X obj 60 35 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 60 110 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 58 345 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 58 215 50 20 50; #X text 194 318 1.arg: source-name; #X text 194 331 2.arg: destination-name; #X msg 115 235 src src; #X msg 165 253 dst dst; #X text 184 73 (the number of samples which are copied are:; #X text 197 87 the minimum of both array lengths); #X text 43 168 list of 3 floats:; #X text 77 419 IEM KUG; #X text 61 407 musil; #X text 91 407 @; #X text 97 407 iem.at; #X text 60 429 Graz \, Austria; #X text 12 396 (c) Thomas Musil 2000 - 2006; #X text 55 179 1.) src onset; #X text 55 189 2.) dst onset; #X text 225 306 initial arguments:; #X text 73 323 output; #X text 172 233 xxx : change source name; #X text 218 252 xxx : change destination name; #X text 11 7 tab_sqrt; #X text 89 33 copy square root value from src to dst; #X obj 60 82 tab_sqrt src dst; #X text 55 198 3.) n samples to copy square root; #X obj 58 306 tab_sqrt src dst; #X connect 2 0 27 0; #X connect 5 0 29 0; #X connect 8 0 29 0; #X connect 9 0 29 0; #X connect 27 0 3 0; #X connect 29 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_sub-help.pd0000600000000000000000000000721614665566711015504 0ustar00#N canvas 116 92 855 560 10; #N canvas 0 0 450 300 graph1 0; #X array src1 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 534 20 graph; #N canvas 0 0 450 300 graph1 0; #X array dst 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 535 368 graph; #X obj 61 41 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 116 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 255 286 dst dst; #N canvas 0 0 450 300 graph1 0; #X array src2 100 float 1; #A 0 0.557135 0.57142 0.557135 0.528564 0.499992 0.428564 0.357136 0.299994 0.0999951 -0.0571467 -0.157146 -0.228574 -0.300002 -0.328573 -0.357145 -0.385716 -0.400001 -0.400001 -0.385716 -0.385716 -0.37143 -0.364287 -0.357145 -0.328573 -0.300002 -0.271431 -0.24286 -0.214288 -0.14286 -0.085718 -0.0428611 -4.28595e-006 0.0428526 0.099995 0.171423 0.21428 0.257137 0.328565 0.371422 0.428564 0.457135 0.485707 0.499992 0.514278 0.499992 0.471421 0.44285 0.414279 0.357136 0.285708 0.171423 0.0999952 0.0142815 -0.100003 -0.214288 -0.314288 -0.385716 -0.457144 -0.471429 -0.514286 -0.500001 -0.47143 -0.442858 -0.414287 -0.37143 -0.300002 -0.228574 -0.157146 -0.0714324 0.0571381 0.128566 0.199994 0.271422 0.34285 0.414278 0.457135 0.485707 0.499992 0.528563 0.542849 0.499992 0.457135 0.428564 0.371422 0.314279 0.242851 0.0857095 -0.0857178 -0.271431 -0.400001 -0.514286 -0.542858 -0.557143 -0.585714 -0.585714 -0.6 -0.6 -0.614286 -0.614286 -0.614286; #X coords 0 1 99 -1 200 140 1; #X restore 535 171 graph; #X msg 136 243 src1 src1; #X msg 195 265 src2 src2; #X msg 59 221 50 50 20 50; #X text 45 149 list of 4 floats:; #X text 212 363 3.arg: destination-name; #X text 78 445 IEM KUG; #X text 62 433 musil; #X text 92 433 @; #X text 98 433 iem.at; #X text 61 455 Graz \, Austria; #X text 13 422 (c) Thomas Musil 2000 - 2006; #X text 234 322 initial arguments:; #X text 72 329 output; #X text 306 285 xxx : change destination name; #X text 208 96 the minimum of the 3 array lengths); #X text 56 187 3.) dst onset; #X text 56 165 1.) src_1 onset; #X text 56 176 2.) src_2 onset; #X text 199 243 xxx : change source name 1; #X text 257 265 xxx : change source name 2; #X text 211 336 1.arg: source-name 1; #X text 211 349 2.arg: source-name 2; #X text 12 13 tab_sub; #X obj 61 88 tab_sub src1 src2 dst; #X obj 59 311 tab_sub src1 src2 dst; #X text 90 39 subtract the 2 src-arrays to dst-array; #X text 56 197 4.) n samples to subtract; #X text 195 82 (the number of samples which were subtracted are:; #X connect 2 0 30 0; #X connect 5 0 31 0; #X connect 7 0 31 0; #X connect 8 0 31 0; #X connect 9 0 31 0; #X connect 30 0 3 0; #X connect 31 0 4 0; iem_utils-0.0.20240903/iem_tab/tab_sum-help.pd0000600000000000000000000000426614665566711015521 0ustar00#N canvas 116 92 798 425 10; #N canvas 0 22 450 300 (subpatch) 0; #X array src 100 float 1; #A 0 -0.442858 -0.414287 -0.385715 -0.342858 -0.314287 -0.257144 -0.128572 -0.0428573 0.128572 0.228572 0.285715 0.328572 0.400001 0.414287 0.457144 0.457144 0.442858 0.385715 0.314287 0.257144 0.214286 0.1 0.0428572 -0.0142858 -0.0428573 -0.114286 -0.142858 -0.200001 -0.242858 -0.285715 -0.328572 -0.342858 -0.37143 -0.385715 -0.414287 -0.414287 -0.414287 -0.414287 -0.400001 -0.357144 -0.314287 -0.257144 -0.185715 -0.0714288 0.0142857 0.0571429 0.171429 0.328572 0.400001 0.442858 0.47143 0.485715 0.485715 0.485715 0.485715 0.485715 0.442858 0.357144 0.242858 0.185715 0.114286 0.0714285 -0.071429 -0.242858 -0.300001 -0.328573 -0.357144 -0.37143 -0.385715 -0.400001 -0.442858 -0.457144 -0.47143 -0.457144 -0.428573 -0.400001 -0.378573 -0.328572 -0.271429 -0.242858 -0.200001 -0.128572 -0.0428574 -0.0285717 0.0142858 0.114286 0.128572 0.185715 0.214286 0.257144 0.285715 0.314287 0.342858 0.357144 0.357144 0.357144 0.357144 0.357144 0.342858 0.328572; #X coords 0 1 99 -1 200 140 1; #X restore 524 40 graph; #X obj 61 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 61 106 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 59 301 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X msg 93 213 src src; #X obj 61 78 tab_sum src; #X floatatom 122 104 5 0 0 0 - - -; #X obj 59 244 tab_sum src; #X msg 59 188 50 20; #X floatatom 120 305 5 0 0 0 - - -; #X text 75 364 IEM KUG; #X text 54 352 musil; #X text 89 352 @; #X text 97 352 iem.at; #X text 58 374 Graz \, Austria; #X text 90 29 calc sum of all array elements; #X text 182 234 initial arguments:; #X text 65 260 output; #X text 11 6 tab_sum; #X text 55 171 2.) n samples to calc sum; #X text 142 213 xxx : change source name; #X text 164 247 1.arg: source-name; #X text 125 280 sum output; #X text 118 118 sum value; #X text 43 150 list of 2 floats:; #X text 55 160 1.) src onset; #X msg 391 84 \; src const 0.5; #X text 10 341 (c) Thomas Musil 2000 - 2009; #X connect 1 0 5 0; #X connect 4 0 7 0; #X connect 5 0 2 0; #X connect 5 1 6 0; #X connect 7 0 3 0; #X connect 7 1 9 0; #X connect 8 0 7 0; iem_utils-0.0.20240903/kiosk-plugin/0000700000000000000000000000000014665566711013616 5ustar00iem_utils-0.0.20240903/kiosk-plugin/LICENSE.txt0000600000000000000000000000304114665566711015441 0ustar00This software is copyrighted by Miller Puckette and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-0.0.20240903/kiosk-plugin/README.deken.pd0000600000000000000000000000107114665566711016166 0ustar00#N canvas 815 540 497 372 12; #X text 56 58 kiosk-plugin: KIOSK-mode for Pd; #X text 44 245 you must restart Pd in order to make use of this plugin. ; #X text 45 130 the kiosk-plugin allows you to get rid of some of Pd's IDE-characteristics \, to make it more usable in audience-facing applications. ; #X text 44 186 by default \, the kiosk-plugin DOES NOT DO ANYTHING. ; #X text 46 208 you MUST configure it first \, by editing the 'kiosk.cfg' file., f 61; #X text 160 346 happy patching. IOhannes m zmölnig/IEM. 2021; #X text 55 71 ================================; iem_utils-0.0.20240903/kiosk-plugin/README.md0000600000000000000000000001055714665566711015107 0ustar00KIOSK mode for Pure Data ======================== KIOSK mode allows you to enable one or more of the following features - hiding the main Pd-window - disabling the menu bar in the patch window - making a patch window to be shown at fullscreen - setting a window name for the patch window (independent of the patch name) - prevent closing of patch windows (using Alt-F4, clicking on the "Close Window" icon, et al.) - quit Pd when a patch window is closed - disable the (right click) context menu - disable key-bindings (like Ctrl-N) - prevent scroll bars from appearing, even if the patch content does not fit on a single window You can enable/disable the parts you want to by editing a kiosk.cfg file. This config file is searched for in the working directory of Pd, and (if not found) in the plugin directory of the kiosk-plugin (usually `~/.local/lib/pd/extra/kiosk-plugin/`) # INSTALLATION Typically, you can install `kiosk-plugin` via Pd's built-in package manager. Just navigate to "Help" -> "Find Externals...", enter *kiosk-plugin* (followed by ⎠Enter), and click on the latest and greatest sarch result to install it. To *manually* install the plugin, copy this directory to `~/.local/lib/pd/extra/kiosk-plugin/` or similar, depending on your OS). The plugin will be automatically loaded, the next time you start Pd. # CONFIGURATION There are many options to fine tune the `kiosk-plugin`, so by default it doesn't do *anything*. In order to enable one ore more options, edit the `kiosk.cfg` file, that comes with examples of all available settings. Lines beginning with `#` are ignored. The configuration file is read once at startup and applies to all windows. It is first searched for at the start-up path (e.g. if you start Pd by double-clicking on a `.pd` file, this is typically the path where this patch file resides), and - lacking such a file - besides the `kiosk-plugin.tcl` file (that is: in the installation path of the plugin). | setting | default | description | |----------------------|---------|--------------------------------------------------------------------------------------------------| | `HideMain` | `False` | hide the main window (Pd-console) | | `ShowMenuMain` | `True` | show the menu of the main window (if visible) | | `GeometryMain` | (unset) | force a size/position on the main window | | `WindowTitleMain` | (unset) | the title of the main window (if visible) | | `KioskNewWindow` | `False` | should new windows by kioskified (by default only windows that are open on startup are effected) | | `FullScreen` | `False` | put window(s) in full-screen mode? | | `ShowMenu` | `True` | show the menu | | `WindowTitle` | (unset) | set a fixed window title for patch-windows | | `WindowDynamicTitle` | (unset) | set a dynamic window title (see `kiosk.cfg` for an example) | | `PreventClose` | `False` | prevent patch windows from being closed via the window-manager | | `QuitOnClose` | `False` | quit Pd, if a kioskified window is being closed | | `HidePopup` | `False` | disable the right-click context menu | | `QuitBinding` | `True` | (Do not) quit Pd with the Ctrl+q shortcut | | `Bindings` | `True` | Enable/Disable all shortcuts | | `ScrollBars` | `True` | Enable/Disable scrollbars if the patch content exceeds the window size | # PREREQUISITES gui-plugins only work with Pd>=0.43 # AUTHOR [IOhannes m zmölnig](https://git.iem.at/zmoelnig/) (though the fullscreen part was copied from András Murányi's "fullscreen" plugin) iem_utils-0.0.20240903/kiosk-plugin/kiosk-plugin.tcl0000600000000000000000000001360414665566711016744 0ustar00# META NAME Kiosk # META DESCRIPTION all windows in fullscreen mode # META DESCRIPTION main window invisible # META DESCRIPTION no keybindings # META AUTHOR IOhannes m zmölnig package require Tcl 8.5 package require Tk package require pdwindow 0.1 namespace eval ::kiosk:: { variable ::kiosk::config variable ::kiosk::processed } set ::kiosk::mangledtitles() "Pd" ## default values set ::kiosk::config(KioskNewWindow) False set ::kiosk::config(ShowMenu) True set ::kiosk::config(ShowMenuMain) True set ::kiosk::config(FullScreen) False set ::kiosk::config(HideMain) False set ::kiosk::config(WindowTitle) "" set ::kiosk::config(WindowDynamicTitle) "" set ::kiosk::config(WindowTitleMain) "" set ::kiosk::config(HidePopup) False set ::kiosk::config(ScrollBars) True set ::kiosk::config(QuitOnClose) False set ::kiosk::config(PreventClose) False set ::kiosk::config(Bindings) True set ::kiosk::config(QuitBinding) True set ::kiosk::config(GeometryMain) "" set ::kiosk::processed(.pdwindow) True proc ::kiosk::readconfig {{fname kiosk.cfg}} { set orgname $fname if {[file exists $fname]} { set fp [open $fname r] } else { set fname [file join $::current_plugin_loadpath $fname] if {[file exists $fname]} { set fp [open $fname r] } else { puts "kiosk-configuration not found: $orgname" return False } } while {![eof $fp]} { set data [gets $fp] if { [string is list $data ] } { if { [llength $data ] > 1 } { set ::kiosk::config([lindex $data 0]) [lindex $data 1] } } } return True } ## KIOSkify a window proc ::kiosk::unmakekiosk {mywin} { if { [info exists ::kiosk::processed($mywin)] } { set ::kiosk::processed($mywin) False } } proc ::kiosk::makekiosk {mywin} { ## refuse to kioskify the main Pd window if { ! [info exists ::kiosk::processed($mywin)] } { set ::kiosk::processed($mywin) False } if { $::kiosk::processed($mywin) } { return; } set ::kiosk::processed($mywin) True #remove menu if { $::kiosk::config(ShowMenu) } { } { $mywin configure -menu .kioskmenu; } # make fullscreen if { $::kiosk::config(FullScreen) } { wm attributes $mywin -fullscreen 1 } # set the title of the window # (makes mostly sense in non-fullscren...) if [info exists ::kiosk::mangledtitles($mywin)] { } { set ::kiosk::mangledtitles($mywin) [::kiosk::titlemangler [wm title $mywin]] } wm title $mywin $::kiosk::mangledtitles($mywin) # close pd if the window is closed (or no close at all) if { $::kiosk::config(PreventClose) } { # prevent WindowClose using Alt-F4 or clicking on the "x" wm protocol $mywin WM_DELETE_WINDOW ";" } { # if we do allow closing of windows, we might want to Quit as well if { $::kiosk::config(QuitOnClose) } { bind $mywin "pdsend \"pd quit\"" } } set mycnv [tkcanvas_name $mywin ] # remove all special key/mouse bindings from the window if { $::kiosk::config(QuitBinding) } { } { # bind $mycnv {} # bind $mycnv {} # bind all {} # bind all {} bind $mycnv {} bind $mycnv {} bind all {} bind all {} } # remove all special key/mouse bindings from the window if { $::kiosk::config(Bindings) } { } { bindtags $mywin "" bindtags $mycnv "$mycnv" # rebind ordinary keypress events bind $mycnv {::pd_bindings::sendkey %W 1 %K %A 0} bind $mycnv {::pd_bindings::sendkey %W 0 %K %A 0} bind $mycnv {::pd_bindings::sendkey %W 1 %K %A 1} bind $mycnv {::pd_bindings::sendkey %W 0 %K %A 1} } } ###################################### proc ::kiosk::init {version} { # this is just an empty menu catch {menu .kioskmenu} ## read the default configuration file "kiosk.cfg" if { [info exists ::env(PD_KIOSK_CONFIG) ] } { ::kiosk::readconfig $::env(PD_KIOSK_CONFIG) } { ::kiosk::readconfig } ###### do some global KIOSK-settings ## set the geometry of the Pd window if { $::kiosk::config(GeometryMain) != "" } { wm geometry .pdwindow =$::kiosk::config(GeometryMain) } ## hide the Pd window if { $::kiosk::config(HideMain) } { set ::stderr 1 wm state .pdwindow withdraw } ## hide the menu on the Pd window if { $::kiosk::config(ShowMenuMain) } { } { .pdwindow configure -menu .kioskmenu } ## override the window title of the Pd window if { $::kiosk::config(WindowTitleMain) != "" } { wm title .pdwindow $::kiosk::config(WindowTitleMain) } proc ::kiosk::titlemangler {s} {return $s} if { $::kiosk::config(WindowDynamicTitle) != "" } { proc ::kiosk::titlemangler [lindex $::kiosk::config(WindowDynamicTitle) 0] [lindex $::kiosk::config(WindowDynamicTitle) 1] } { if { $::kiosk::config(WindowTitle) != "" } { proc ::kiosk::titlemangler {s} "return $::kiosk::config(WindowTitle)" } } ## don't show popup menu on right-click if { $::kiosk::config(HidePopup) } { proc ::pdtk_canvas::pdtk_canvas_popup {mytoplevel xcanvas ycanvas hasproperties hasopen} { } } if { $::kiosk::config(ScrollBars) } { } { proc ::pdtk_canvas::pdtk_canvas_getscroll {tkcanvas} { } } # do the KIOSK-setting per existing window (those windows loaded at startup) foreach kioskwin [array names ::loaded] { ::kiosk::makekiosk $kioskwin } # do the KIOSKification for newly created windows as well if { $::kiosk::config(KioskNewWindow) } { ## not the most elegant way: KIOSKifying each window as some of its properties change... bind PatchWindow "+::kiosk::makekiosk %W" bind PatchWindow "+::kiosk::unmakekiosk %W" } pdtk_post "loaded: kiosk-plugin ${version}\n" } ::kiosk::init {} iem_utils-0.0.20240903/kiosk-plugin/kiosk.cfg0000600000000000000000000000407714665566711015431 0ustar00# whether we want to hide the main PdWindow HideMain False #HideMain True # if main Window is not hidden, we can force a geometry to it #GeometryMain "500x400+20+50" # by default, only initially opened PatchWindows are KIOSKed # you can apply KIOSK settings to new windows, if you set the following to "True" KioskNewWindow False #KioskNewWindow True # whether you want to show the Menu-bar in the PatchWindows ShowMenu True #ShowMenu False # whether you want to show the Menu-bar in the Pd-Console (if visible) ShowMenuMain True #ShowMenuMain False # whether PatchWindows should be fullscreen FullScreen False #FullScreen True # override the name of the PatchWindowS (display this string rather than the # patch-name) # if set to "", the original window name is displayed WindowTitle "" #WindowTitle "Pd KIOSK" # dynamically override the name of the PatchWindowS (display the calculated string) # the argument consists of a two-element list: # the name of the variable to hold the title, and the procedure to mangle that variable WindowDynamicTitle "" #WindowDynamicTitle {s {string toupper $s}} # override the name of the Main Window # if set to "", the original window name ('Pd') is displayed WindowTitleMain {Pd Console} #WindowTitleMain "Pd KIOSK console" # prevent the PatchWindow to be closed using Alt-F4, clicking on the # "close-window" icon and the like PreventClose False #PreventClose True # if window closing is allowed and the main window is hidden, it is probably a # good idea to quit Pd, if one of the PatchWindowS is closed QuitOnClose False #QuitOnClose True # prevent the context menu to show up on Right-Click HidePopup False #HidePopup True # prevent special key-bindings (e.g. Control-Q for close) # ordinary key-bindings are still allowed to allow users to type QuitBinding True #QuitBinding False # prevent all special key-bindings (e.g. Control-W for close) # ordinary key-bindings are still allowed to allow users to type Bindings True #Bindings False # disable scroll-bars to appear, even if the content does not fit on the window ScrollBars True #ScrollBars False iem_utils-0.0.20240903/patch2svg-plugin/0000700000000000000000000000000014665566711014377 5ustar00iem_utils-0.0.20240903/patch2svg-plugin/LICENSE.txt0000600000000000000000000000304514665566711016226 0ustar00This software is copyrighted by IOhannes m zmölnig and others. The following terms (the "Standard Improved BSD License") apply to all files associated with the software unless explicitly disclaimed in individual files: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-0.0.20240903/patch2svg-plugin/README.md0000600000000000000000000000212414665566711015657 0ustar00Save Pd patches as SVG ====================== This adds a new menu-item to the "File" menu: "Save patch as SVG..." It allows you to save the current Pd patch as an SVG graphics. ## Installing Simply copy the [patch2svg-plugin.tcl](https://git.iem.at/pd-gui/patch2svg-plugin/raw/master/patch2svg-plugin.tcl) into your Pd searchpath. ## Repository The official repository is https://git.iem.at/pd-gui/patch2svg-plugin/ There is also a mirror on github: https://github.com/iem-projects/patch2svg-plugin ## Reporting Issues If you have discovered a bug or are missing some functionality, please do not hestitate to let me know. We are currently accepting bug-reports (and pull-requests) on our github mirror: https://github.com/iem-projects/patch2svg-plugin/issues ### Translating If you want the "Save patch as SVG..." menu-entry to be displayed in another language, please send me a translation (you can use the patch-tracker for this). ## AUTHORS - IOhannes m zmölnig - the canvas2svg converter was original written by Mats Bengtsson (and virtually no changes have been made to it). iem_utils-0.0.20240903/patch2svg-plugin/autoexport.pd0000600000000000000000000000054514665566711017144 0ustar00#N canvas 446 419 596 293 10; #X obj 103 83 loadbang; #X obj 103 105 t b; #X obj 103 127 delay 1000; #X obj 103 149 t b b; #X obj 103 171 delay 100; #X msg 103 193 \; pd quit; #X msg 182 180 \; pd plugin-dispatch ::patch2svg::exportall; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 3 1 6 0; #X connect 4 0 5 0; iem_utils-0.0.20240903/patch2svg-plugin/patch2svg-plugin.tcl0000600000000000000000000013010214665566711020277 0ustar00# META convert a patch to a picture (SVG) # META DESCRIPTION exports your patch as an SVG-image # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 if [catch { package require msgcat ::msgcat::mcload po }] { puts "patch2svg: i18n failed" } #package require uriencode #package require tinyfileutils namespace eval ::patch2svg:: { variable label proc export {mytoplevel filename} { can2svg::canvas2file [tkcanvas_name $mytoplevel] $filename } set counter 0 # ::patch2svg::exportall proc exportall {{template "%s%x.svg"}} { ## exports all open windows to SVG ## template vars: ## - '%s' window name ## - '%x' window id ## - '%c' counter (self-incrementing) if {[string length $template] == 0 } {set template "%s%x.svg" } ::pdwindow::debug "patch2svg: template $template\n" foreach w [get_patchwindows] { incr ::patch2svg::counter set wname [lookup_windowname $w] set wname_ [string map [list "/" "_" " " "_"] $wname] set name [string map [list %s "${wname_}" %x "${w}" %c "${::patch2svg::counter}"] $template] pdtk_post "exporting to SVG: $name\n" ::pdwindow::debug " patch2svg: w $w\n" ::pdwindow::debug " patch2svg: wname $wname\n" ::pdwindow::debug " patch2svg: fname $name\n" ::pdwindow::debug " patch2svg: \n" export $w $name } } proc is_patchwindow {w} { #expr {[winfo toplevel $w] eq $w && ![catch {$w cget -menu}]} expr {[winfo class $w] eq "PatchWindow"} } proc get_patchwindows {{w .}} { set list {} if {[is_patchwindow $w]} { lappend list $w } foreach w [winfo children $w] { lappend list {*}[get_patchwindows $w] } return $list } # can2svg.tcl --- # # This file provides translation from canvas commands to XML/SVG format. # # Copyright (c) 2002-2007 Mats Bengtsson # # This file is distributed under BSD style license. # # $Id: can2svg.tcl,v 1.26 2008-01-27 08:19:36 matben Exp $ # # ########################### USAGE ############################################ # # NAME # can2svg - translate canvas command to SVG. # # SYNOPSIS # can2svg canvasCmd ?options? # canvasCmd is everything except the widget path name. # # can2svg::canvas2file widgetPath fileName ?options? # options: -height # -width # # can2svg::can2svg canvasCmd ?options? # options: -httpbasedir path # -imagehandler tclProc # -ovalasellipse 0|1 # -reusedefs 0|1 # -uritype file|http # -usestyleattribute 0|1 # -usetags 0|all|first|last # -windowitemhandler tclProc # # can2svg::config ?options? # options: -allownewlines 0 # -filtertags "" # -httpaddr localhost # -ovalasellipse 0 # -reusedefs 1 # -uritype file # -usetags all # -usestyleattribute 1 # -windowitemhandler tclProc # # ########################### CHANGES ########################################## # # 0.1 first release # 0.2 URI encoded image file path # 0.3 uses xmllists more, added svgasxmllist # # ########################### TODO ############################################# # # handle units (m->mm etc.) # better support for stipple patterns # how to handle tk editing? DOM? # # ... # We need URN encoding for the file path in images. From my whiteboard code. namespace eval can2svg { # namespace export can2svg canvas2file variable confopts array set confopts { -allownewlines 0 -filtertags "" -httpaddr localhost -ovalasellipse 0 -reusedefs 1 -uritype file -usetags all -usestyleattribute 1 -windowitemhandler "" } set confopts(-httpbasedir) [info script] variable formatArrowMarker variable formatArrowMarkerLast # The key into this array is 'arrowMarkerDef_$col_$a_$b_$c', where # col is color, and a, b, c are the arrow's shape. variable defsArrowMarkerArr # Similarly for stipple patterns. variable defsStipplePatternArr # This shouldn't be hardcoded! variable defaultFont {Helvetica 12} variable pi 3.14159265359 variable anglesToRadians [expr {$pi/180.0}] variable grayStipples {gray75 gray50 gray25 gray12} # Make 4x4 squares. Perhaps could be improved. variable stippleDataArr set stippleDataArr(gray75) \ {M 0 0 h3 M 0 1 h1 M 2 1 h2 M 0 2 h3 M 0 3 h1 M 2 3 h1} set stippleDataArr(gray50) \ {M 0 0 h1 M 2 0 h1 M 1 1 h1 M 3 1 h1 M 0 2 h1 M 2 2 h1 M 1 3 h1 M 3 3 h1} set stippleDataArr(gray25) \ {M 3 0 h1 M 1 1 h1 M 3 2 h1 M 1 3 h1} set stippleDataArr(gray12) \ {M 1 1 h1 M 3 3 h1} } proc can2svg::config {args} { variable confopts set options [lsort [array names confopts -*]] set usage [join $options ", "] if {[llength $args] == 0} { set result {} foreach name $options { lappend result $name $confopts($name) } return $result } regsub -all -- - $options {} options set pat ^-([join $options |])$ if {[llength $args] == 1} { set flag [lindex $args 0] if {[regexp -- $pat $flag]} { return $confopts($flag) } else { return -code error "Unknown option $flag, must be: $usage" } } else { foreach {flag value} $args { if {[regexp -- $pat $flag]} { set confopts($flag) $value } else { return -code error "Unknown option $flag, must be: $usage" } } } } # can2svg::can2svg -- # # Make xml out of a canvas command, widgetPath removed. # # Arguments: # cmd canvas create commands without prepending widget path. # args -httpbasedir path # -imagehandler tclProc # -ovalasellipse 0|1 # -reusedefs 0|1 # -uritype file|http # -usestyleattribute 0|1 # -usetags 0|all|first|last # # Results: # xml data proc can2svg::can2svg {cmd args} { set xml "" foreach xmllist [eval {svgasxmllist $cmd} $args] { append xml [MakeXML $xmllist] } return $xml } # can2svg::svgasxmllist -- # # Make a list of xmllists out of a canvas command, widgetPath removed. # # Arguments: # cmd canvas create command without prepending widget path. # args -httpbasedir path # -imagehandler tclProc # -ovalasellipse 0|1 # -reusedefs 0|1 # -uritype file|http # -usestyleattribute 0|1 # -usetags 0|all|first|last # # Results: # a list of xmllist = {tag attrlist isempty cdata {child1 child2 ...}} proc can2svg::svgasxmllist {cmd args} { variable confopts variable defsArrowMarkerArr variable defsStipplePatternArr variable defaultFont variable grayStipples set nonum_ {[^0-9]} set wsp_ {[ ]+} set xmlLL [list] array set argsA [array get confopts] array set argsA $args set args [array get argsA] if {![string equal [lindex $cmd 0] "create"]} { return } set type [lindex $cmd 1] set rest [lrange $cmd 2 end] # Separate coords from options. set indopt [lsearch -regexp $rest "-${nonum_}"] if {$indopt < 0} { set ind end set opts [list] } else { set ind [expr {$indopt - 1}] set opts [lrange $rest $indopt end] } # Flatten coordinate list! set coo [lrange $rest 0 $ind] if {[llength $coo] == 1} { set coo [lindex $coo 0] } array set optA $opts # Is the item in normal state? If not, return. if {[info exists optA(-state)] && $optA(-state) != "normal"} { return } # Figure out if we've got a spline. set haveSpline 0 if {[info exists optA(-smooth)] && ($optA(-smooth) != "0") && \ [info exists optA(-splinesteps)] && ($optA(-splinesteps) > 2)} { set haveSpline 1 } if {[info exists optA(-fill)]} { set fillValue $optA(-fill) if {![regexp {#[0-9]+} $fillValue]} { set fillValue [FormatColorName $fillValue] } } else { set fillValue black } set id "" if {[string length $argsA(-filtertags)] && [info exists optA(-tags)]} { set tag [uplevel #0 $argsA(-filtertags) [list $optA(-tags)]] set id $tag } elseif {($argsA(-usetags) != "0") && [info exists optA(-tags)]} { # Remove any 'current' tag. set optA(-tags) \ [lsearch -all -not -inline $optA(-tags) current] set id "" switch -- $argsA(-usetags) { all { set id $optA(-tags) } first { set id [lindex $optA(-tags) 0] } last { set id [lindex $optA(-tags) end] } } } set id [string trim $id] if { $id != {} } { if { ! [string is alpha [string index $id 0] ] } { set id "PD$id" } set id [string map {" " "__"} $id] set idAttr [list id $id] } else { set idAttr "" } # If we need a marker (arrow head) need to make that first. if {[info exists optA(-arrow)] && ![string equal $optA(-arrow) "none"]} { if {[info exists optA(-arrowshape)]} { # Make a key of the arrowshape list into the array. regsub -all -- $wsp_ $optA(-arrowshape) _ shapeKey set arrowKey ${fillValue}_${shapeKey} set arrowShape $optA(-arrowshape) } else { set arrowKey ${fillValue} set arrowShape {8 10 3} } if {!$argsA(-reusedefs) || \ ![info exists defsArrowMarkerArr($arrowKey)]} { set defsArrowMarkerArr($arrowKey) \ [eval {MakeArrowMarker} $arrowShape {$fillValue}] set xmlLL \ [concat $xmlLL $defsArrowMarkerArr($arrowKey)] } } # If we need a stipple bitmap, need to make that first. Limited!!! # Only: gray12, gray25, gray50, gray75 foreach key {-stipple -outlinestipple} { if {[info exists optA($key)] && \ ([lsearch $grayStipples $optA($key)] >= 0)} { set stipple $optA($key) if {![info exists defsStipplePatternArr($stipple)]} { set defsStipplePatternArr($stipple) \ [MakeGrayStippleDef $stipple] } lappend xmlLL $defsStipplePatternArr($stipple) } } #puts "can2svg::svgasxmllist cmd=$cmd, args=$args" switch -- $type { arc { # Had to do it the hard way! (?) # "Wrong" coordinate system :-( set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } bitmap - image { if {[info exists optA(-image)]} { set elem "image" set attr [eval {MakeImageAttr $coo $opts} $args] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set subEs [list] if {[info exists argsA(-imagehandler)]} { set subE [uplevel #0 $argsA(-imagehandler) [list $cmd] $args] if {[llength $subE]} { set subEs [list $subE] } } lappend xmlLL [MakeXMLList $elem -attrlist $attr -subtags $subEs] } } line { set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } oval { set attr [CoordsToAttr $type $coo $opts elem] foreach {x y w h} [NormalizeRectCoords $coo] break if {[expr {$w == $h}] && !$argsA(-ovalasellipse)} { # set elem "circle";# circle needs an r: not an rx & ry set elem "ellipse" } else { set elem "ellipse" } if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } polygon { set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } rectangle { set attr [CoordsToAttr $type $coo $opts elem] if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] lappend xmlLL [MakeXMLList $elem -attrlist $attr] } text { set elem "text" set chdata "" set nlines 1 if {[info exists optA(-font)]} { set theFont $optA(-font) } else { set theFont $defaultFont } set ascent [font metrics $theFont -ascent] set lineSpace [font metrics $theFont -linespace] if {[info exists optA(-text)]} { set placeholder "\uFFFD" set chdata [regsub -all "\[^${placeholder}\n\[:print:\]\]" $optA(-text) ${placeholder}] if {[info exists optA(-width)]} { # MICK O'DONNELL: if the text is wrapped in the wgt, we need # to simulate linebreaks # # If the item has got -width != 0 then we must wrap it ourselves # using newlines since the -text does not have extra newlines # at these linebreaks. set lines [split $chdata \n] set newlines {} foreach line $lines { set lines2 [SplitWrappedLines $line $theFont $optA(-width)] set newlines [concat $newlines $lines2] } set chdata [join $newlines \n] if {!$argsA(-allownewlines) || \ ([llength $newlines] > [llength $lines])} { set nlines [expr {[regexp -all "\n" $chdata] + 1}] } } else { if {!$argsA(-allownewlines)} { set nlines [expr {[regexp -all "\n" $chdata] + 1}] } } } # Figure out the coords of the first baseline. set anchor center if {[info exists optA(-anchor)]} { set anchor $optA(-anchor) } foreach {xbase ybase} \ [GetTextSVGCoords $coo $anchor $chdata $theFont $nlines] {} set attr {} if {[string length $idAttr] > 0} { set attr [concat $attr $idAttr] } set attr [concat $attr [MakeAttrList \ $type $opts $argsA(-usestyleattribute)]] set dy 0 if {$nlines > 1} { # We cannot use the 'tspan' trick here, # as 'textLength' in is ignored by most renderers (as of 2023), # even though SVG-1.1 defines it... set subList {} foreach line [split $chdata "\n"] { set ybase [expr $ybase + $dy] set subAttr [list "x" $xbase "y" $ybase] lappend subAttr "textLength" [font measure $theFont $line] lappend subList [MakeXMLList $elem \ -attrlist $subAttr -chdata $line] set dy $lineSpace } lappend xmlLL [MakeXMLList "g" -attrlist $attr \ -subtags $subList] } else { lappend attr "textLength" [font measure $theFont $chdata] set attr [concat [list "x" $xbase "y" $ybase] $attr] lappend xmlLL [MakeXMLList $elem -attrlist $attr \ -chdata $chdata] } } window { # There is no svg for this; must be handled by application layer. #puts "window: $cmd" if {[string length $argsA(-windowitemhandler)]} { set xmllist \ [uplevel #0 $argsA(-windowitemhandler) [list $cmd] $args] if {[llength $xmllist]} { lappend xmlLL $xmllist } } } } return $xmlLL } # can2svg::CoordsToAttr -- # # Makes a list of attributes corresponding to type and coords. # # Arguments: # # # Results: # a list of attributes. proc can2svg::CoordsToAttr {type coo opts svgElementVar} { upvar $svgElementVar elem array set optA $opts # Figure out if we've got a spline. set haveSpline 0 if {[info exists optA(-smooth)] && ($optA(-smooth) != "0") && \ [info exists optA(-splinesteps)] && ($optA(-splinesteps) > 2)} { set haveSpline 1 } set attr {} switch -- $type { arc { set elem "path" set data [MakeArcPath $coo $opts] set attr [list "d" $data] } bitmap - image { array set __optA $opts if {[info exists __optA(-image)]} { set elem "image" set attr [ImageCoordsToAttr $coo $opts] } } line { if {$haveSpline} { set elem "path" set data [ParseSplineToPath $type $coo] set attr [list "d" $data] } else { set elem "polyline" set attr [list "points" $coo] } } oval { # Assume SVG ellipse. set elem "ellipse" foreach {x y w h} [NormalizeRectCoords $coo] break set attr [list \ "cx" [expr {$x + $w/2.0}] "cy" [expr {$y + $h/2.0}] \ "rx" [expr {$w/2.0}] "ry" [expr {$h/2.0}]] } polygon { if {$haveSpline} { set elem "path" set data [ParseSplineToPath $type $coo] set attr [list "d" $data] } else { set elem "polygon" set attr [list "points" $coo] } } rectangle { set elem "rect" foreach {x y w h} [NormalizeRectCoords $coo] break set attr [list "x" $x "y" $y "width" $w "height" $h] } text { set elem "text" # ? } } return $attr } # can2svg::MakeArcPath -- # # Makes a path using A commands from an arc. # Conversion from center to endpoint parameterization. # From: http://www.w3.org/TR/2003/REC-SVG11-20030114 proc can2svg::MakeArcPath {coo opts} { variable anglesToRadians variable pi # Canvas defaults. array set optA { -extent 90 -start 0 -style pieslice } array set optA $opts # Extract center and radius from bounding box. foreach {x1 y1 x2 y2} $coo break set cx [expr {($x1 + $x2)/2.0}] set cy [expr {($y1 + $y2)/2.0}] set rx [expr {abs($x1 - $x2)/2.0}] set ry [expr {abs($y1 - $y2)/2.0}] set start [expr {$anglesToRadians * $optA(-start)}] set extent [expr {$anglesToRadians * $optA(-extent)}] # NOTE: direction of angles are opposite for Tk and SVG! set theta1 [expr {-1*$start}] set delta [expr {-1*$extent}] set theta2 [expr {$theta1 + $delta}] set phi 0.0 # F.6.4 Conversion from center to endpoint parameterization. set x1 [expr {$cx + $rx * cos($theta1) * cos($phi) - \ $ry * sin($theta1) * sin($phi)}] set y1 [expr {$cy + $rx * cos($theta1) * sin($phi) + \ $ry * sin($theta1) * cos($phi)}] set x2 [expr {$cx + $rx * cos($theta2) * cos($phi) - \ $ry * sin($theta2) * sin($phi)}] set y2 [expr {$cy + $rx * cos($theta2) * sin($phi) + \ $ry * sin($theta2) * cos($phi)}] set fa [expr {abs($delta) > $pi ? 1 : 0}] set fs [expr {$delta > 0.0 ? 1 : 0}] set data [format "M %.1f %.1f A" $x1 $y1] append data [format " %.1f %.1f %.1f %1d %1d %.1f %.1f" \ $rx $ry $phi $fa $fs $x2 $y2] switch -- $optA(-style) { arc { # empty. } chord { append data " Z" } pieslice { append data [format " L %.1f %.1f Z" $cx $cy] } } return $data } # can2svg::MakeArcPathNonA -- # # Makes a path without any A commands from an arc. proc can2svg::MakeArcPathNonA {coo opts} { variable anglesToRadians array set optA $opts foreach {x1 y1 x2 y2} $coo break set cx [expr {($x1 + $x2)/2.0}] set cy [expr {($y1 + $y2)/2.0}] set rx [expr {abs($x1 - $x2)/2.0}] set ry [expr {abs($y1 - $y2)/2.0}] set rmin [expr {$rx > $ry ? $ry : $rx}] # This approximation gives a maximum half pixel error. set deltaPhi [expr {2.0/sqrt($rmin)}] set extent [expr {$anglesToRadians * $optA(-extent)}] set start [expr {$anglesToRadians * $optA(-start)}] set nsteps [expr {int(abs($extent)/$deltaPhi) + 2}] set delta [expr {$extent/$nsteps}] set data [format "M %.1f %.1f L" \ [expr {$cx + $rx*cos($start)}] [expr {$cy - $ry*sin($start)}]] for {set i 0} {$i <= $nsteps} {incr i} { set phi [expr {$start + $i * $delta}] append data [format " %.1f %.1f" \ [expr {$cx + $rx*cos($phi)}] [expr {$cy - $ry*sin($phi)}]] } if {[info exists optA(-style)]} { switch -- $optA(-style) { chord { append data " Z" } pieslice { append data [format " %.1f %.1f Z" $cx $cy] } } } else { # Pieslice is the default. append data [format " %.1f %.1f Z" $cx $cy] } return $data } # can2svg::MakeAttrList -- # # Handles the use of style attributes or presenetation attributes. proc can2svg::MakeAttrList {type opts usestyleattribute} { if {$usestyleattribute} { set attrList [list style [MakeStyleAttr $type $opts]] } else { set attrList [MakeStyleList $type $opts] } return $attrList } # can2svg::MakeStyleAttr -- # # Produce the SVG style attribute from the canvas item options. # # Arguments: # type tk canvas widget item type # opts # # Results: # The SVG style attribute as a a string. proc can2svg::MakeStyleAttr {type opts} { set style "" foreach {key value} [MakeStyleList $type $opts] { append style "${key}: ${value}; " } return [string trim $style] } proc can2svg::MakeStyleList {type opts args} { array set argsA { -setdefaults 1 } array set argsA $args # Defaults for everything except text. if {$argsA(-setdefaults) && ![string equal $type "text"]} { array set styleArr {fill none stroke black} } set fillCol black foreach {key value} $opts { switch -- $key { -arrow { set arrowValue $value } -arrowshape { set arrowShape $value } -capstyle { if {[string equal $value "projecting"]} { set value "square" } if {![string equal $value "butt"]} { set styleArr(stroke-linecap) $value } } -dash { set dashValue $value } -dashoffset { if {$value != 0} { set styleArr(stroke-dashoffset) $value } } -extent { # empty } -fill { # Need to translate names to hex spec. if {![regexp {#[0-9]+} $value]} { set value [FormatColorName $value] } set fillCol $value if {[string equal $type "line"]} { set styleArr(stroke) [MapEmptyToNone $value] } else { set styleArr(fill) [MapEmptyToNone $value] } } -font { array set styleArr [MakeFontStyleList $value] } -joinstyle { set styleArr(stroke-linejoin) $value } -outline { set styleArr(stroke) [MapEmptyToNone $value] } -outlinestipple { set outlineStippleValue $value } -start { # empty } -stipple { set stippleValue $value } -width { set styleArr(stroke-width) $value } } } # If any arrow specify its marker def url key. if {[info exists arrowValue]} { if {[info exists arrowShape]} { foreach {a b c} $arrowShape break set arrowIdKey "arrowMarkerDef_${fillCol}_${a}_${b}_${c}" set arrowIdKeyLast "arrowMarkerLastDef_${fillCol}_${a}_${b}_${c}" } else { set arrowIdKey "arrowMarkerDef_${fillCol}" set arrowIdKeyLast $arrowIdKey } switch -- $arrowValue { first { set styleArr(marker-start) "url(#$arrowIdKey)" } last { set styleArr(marker-end) "url(#$arrowIdKeyLast)" } both { set styleArr(marker-start) "url(#$arrowIdKey)" set styleArr(marker-end) "url(#$arrowIdKeyLast)" } } } if {[info exists stippleValue]} { # Overwrite any existing. set styleArr(fill) "url(#tile[string trimleft $stippleValue @])" } if {[info exists outlineStippleValue]} { # Overwrite any existing. set styleArr(stroke) "url(#tile[string trimleft $stippleValue @])" } # Transform dash value. if {[info exists dashValue]} { # Two different syntax here. if {[regexp {[\.,\-_]} $dashValue]} { # .=2 ,=4 -=6 space=4 times stroke width. # A space enlarges the... space. # Not foolproof! regsub -all -- {[^ ]} $dashValue "& " dash regsub -all -- " " $dash "12 " dash regsub -all -- " " $dash "8 " dash regsub -all -- " " $dash "4 " dash regsub -all -- {\.} $dash "2 " dash regsub -all -- {,} $dash "4 " dash regsub -all -- {-} $dash "6 " dash # Multiply with stroke width if > 1. if {[info exists styleArr(stroke-width)] && \ ($styleArr(stroke-width) > 1)} { set width $styleArr(stroke-width) set dashOrig $dash set dash {} foreach num $dashOrig { lappend dash [expr {int($width * $num)}] } } set styleArr(stroke-dasharray) [string trim $dash] } else { set dashValue [string trim $dashValue] if {$dashValue ne ""} { set styleArr(stroke-dasharray) $dashValue } } } if {[string equal $type "polygon"]} { set styleArr(fill-rule) "evenodd" } return [array get styleArr] } proc can2svg::FormatColorName {value} { if {[string length $value] == 0} { return $value } switch -- $value { black - white - red - green - blue { set col $value } default { # winfo rgb . white -> 65535 65535 65535 foreach rgb [winfo rgb . $value] { lappend rgbx [expr {$rgb >> 8}] } set col [eval {format "#%02x%02x%02x"} $rgbx] } } return $col } # can2svg::MakeFontStyleList -- # # Takes a tk font description and returns a flat style array. # # Arguments: # fontDesc a tk font description # # Results: # flat style array proc can2svg::MakeFontStyleList {fontDesc} { # MICK Modify - break a named font into its component fields set font [lindex $fontDesc 0] if {[lsearch -exact [font names] $font] > -1} { # This is a font name set styleArr(font-family) [font config $font -family] set fsize [font config $font -size] if {$fsize > 0} { # points set funit pt } else { # pixels (actually user units) set funit px } set styleArr(font-size) "[expr {abs($fsize)}]$funit" if {[font config $font -slant] == "italic"} { set styleArr(font-style) italic } if {[font config $font -weight] == "bold"} { set styleArr(font-weight) bold } if {[font config $font -underline]} { set styleArr(text-decoration) underline } if {[font config $font -overstrike]} { set styleArr(text-decoration) overline } } else { set styleArr(font-family) [lindex $fontDesc 0] if {[llength $fontDesc] > 1} { # Mick: added pt at end set fsize [lindex $fontDesc 1] if {$fsize > 0} { # points set funit pt } else { # pixels (actually user units) set funit px } set styleArr(font-size) "[expr {abs($fsize)}]$funit" } if {[llength $fontDesc] > 2} { set tkstyle [lindex $fontDesc 2] switch -- $tkstyle { bold { set styleArr(font-weight) $tkstyle } italic { set styleArr(font-style) $tkstyle } underline { set styleArr(text-decoration) underline } overstrike { set styleArr(text-decoration) overline } } } } return [array get styleArr] } # can2svg::SplitWrappedLines -- # # MICK O'DONNELL: added code to split wrapped lines # This is actally only needed for text items with -width != 0. # If -width = 0 then just return it. proc can2svg::SplitWrappedLines {line font wgtWidth} { # If the text is shorter than the widget width, no need to wrap # If the wgtWidth comes out as 0, don't wrap if {$wgtWidth == 0 || [font measure $font $line] <= $wgtWidth} { return [list $line] } # Wrap the line set width 0 set endchar 0 while {$width < $wgtWidth} { set substr [string range $line 0 [incr endchar]] set width [font measure $font $substr] } # Go back till we find a nonwhite char set char [string index $line $endchar] set default [expr {$endchar -1}] while {[BreakChar $char] == 0} { if {$endchar == 0} { # we got to the front without breaking, so break midword set endchar $default break } set char [string index $line [incr endchar -1]] } set first [string range $line 0 $endchar] set rest [string range $line [expr {$endchar+1}] end] return [concat [list $first] [SplitWrappedLines $rest $font $wgtWidth]] } proc can2svg::BreakChar {char} { if [string is space $char] {return 1} if {$char == "-"} {return 1} if {$char == ","} {return 1} return 0 } # can2svg::MakeImageAttr -- # # Special code is needed to make the attributes for an image item. # # Arguments: # elem # # Results: # proc can2svg::MakeImageAttr {coo opts args} { variable confopts array set optA {-anchor nw} array set optA $opts array set argsA $args set attrList [ImageCoordsToAttr $coo $opts] # We should make this an URI. set image $optA(-image) set fileName [$image cget -file] if {$fileName ne ""} { if {[string equal $argsA(-uritype) "file"]} { set uri [FileUriFromLocalFile $fileName] } elseif {[string equal $argsA(-uritype) "http"]} { set uri [HttpFromLocalFile $fileName] } lappend attrList "xlink:href" $uri } else { # Unclear if we can use base64 data in svg. } return $attrList } # Function Ê Ê: can2svg::ImageCoordsToAttr # ------------------------------ ------------------------------ --------- # Returns Ê Ê : list of x y width and height including description # Parameters Ê: coo Ê- coordinates of the image # Ê Ê Ê Ê Ê Ê Ê opts - argument list -anchor nw ... # # Description : # fixme (Roger) 01/25/2008 :Why not using the bounding box? # # Written Ê Ê : 2002-2007, Mats # Rewritten Ê : 01/25/2008, Roger # ------------------------------ ------------------------------ --------- proc can2svg::ImageCoordsToAttr {coo opts} { array set optArr {-anchor nw} array set optArr $opts if {![info exists optArr(-image)]} { return -code error "Missing -image option; can't parse that" } set theImage $optArr(-image) lassign $coo x0 y0 set w [image width $theImage] set h [image height $theImage] set x [expr {$x0 - $w/2.0}] set y [expr {$y0 - $h/2.0}] if { "center" ne $optArr(-anchor) } { foreach orientation [split $optArr(-anchor) {}] { switch $orientation { n { set y $y0 } s { set y [expr {$y0 - $w}] } e { set x [expr {$x0 - $h}] } w { set x $x0 } default {} } } } return [list "x" $x "y" $y "width" $w "height" $h] } proc can2svg::ImageCoordsToAttrBU {coo opts} { array set optA {-anchor nw} array set optA $opts if {[info exists optA(-image)]} { set theImage $optA(-image) set w [image width $theImage] set h [image height $theImage] } else { return -code error "Missing -image option; can't parse that" } foreach {x0 y0} $coo break switch -- $optA(-anchor) { nw { set x $x0 set y $y0 } n { set x [expr {$x0 - $w/2.0}] set y $y0 } ne { set x [expr {$x0 - $w}] set y $y0 } e { set x $x0 set y [expr {$y0 - $h/2.0}] } se { set x [expr {$x0 - $w}] set y [expr {$y0 - $h}] } s { set x [expr {$x0 - $w/2.0}] set y [expr {$y0 - $h}] } sw { set x $x0 set y [expr {$y0 - $h}] } w { set x $x0 set y [expr {$y0 - $h/2.0}] } center { set x [expr {$x0 - $w/2.0}] set y [expr {$y0 - $h/2.0}] } } set attrList [list "x" $x "y" $y "width" $w "height" $h] return $attrList } # can2svg::GetTextSVGCoords -- # # Figure out the baseline coords of the svg text element from # the canvas text item. # # Arguments: # coo {x y} # anchor # chdata character data, newlines included. # # Results: # raw xml data of the marker def element. proc can2svg::GetTextSVGCoords {coo anchor chdata theFont nlines} { foreach {x y} $coo break set ascent [font metrics $theFont -ascent] set lineSpace [font metrics $theFont -linespace] # If not anchored to the west it gets more complicated. if {![string match $anchor "*w*"]} { # Need to figure out the extent of the text. if {$nlines <= 1} { set textWidth [font measure $theFont $chdata] } else { set textWidth 0 foreach line [split $chdata "\n"] { set lineWidth [font measure $theFont $line] if {$lineWidth > $textWidth} { set textWidth $lineWidth } } } } switch -- $anchor { nw { set xbase $x set ybase [expr {$y + $ascent}] } w { set xbase $x set ybase [expr {$y - $nlines*$lineSpace/2.0 + $ascent}] } sw { set xbase $x set ybase [expr {$y - $nlines*$lineSpace + $ascent}] } s { set xbase [expr {$x - $textWidth/2.0}] set ybase [expr {$y - $nlines*$lineSpace + $ascent}] } se { set xbase [expr {$x - $textWidth}] set ybase [expr {$y - $nlines*$lineSpace + $ascent}] } e { set xbase [expr {$x - $textWidth}] set ybase [expr {$y - $nlines*$lineSpace/2.0 + $ascent}] } ne { set xbase [expr {$x - $textWidth}] set ybase [expr {$y + $ascent}] } n { set xbase [expr {$x - $textWidth/2.0}] set ybase [expr {$y + $ascent}] } center { set xbase [expr {$x - $textWidth/2.0}] set ybase [expr {$y - $nlines*$lineSpace/2.0 + $ascent}] } } return [list $xbase $ybase] } # can2svg::ParseSplineToPath -- # # Make the path data string for a bezier. # # Arguments: # type canvas type: line or polygon # coo its coordinate list # # Results: # path data string proc can2svg::ParseSplineToPath {type coo} { set npts [expr {[llength $coo]/2}] # line is open ended while the polygon must be closed. # Need to construct a closed smooth polygon with path instructions. switch -- $npts { 1 { set data "M [lrange $coo 0 1]" } 2 { set data "M [lrange $coo 0 1] L [lrange $coo 2 3]" } 3 { set data "M [lrange $coo 0 1] Q [lrange $coo 2 5]" } default { if {[string equal $type "polygon"]} { set x0s [expr {([lindex $coo 0] + [lindex $coo end-1])/2.}] set y0s [expr {([lindex $coo 1] + [lindex $coo end])/2.}] set data "M $x0s $y0s" # Add Q1 and Q2 points. append data " Q [lrange $coo 0 1]" set x0 [expr {([lindex $coo 0] + [lindex $coo 2])/2.}] set y0 [expr {([lindex $coo 1] + [lindex $coo 3])/2.}] append data " $x0 $y0" set xctrlp [lindex $coo 2] set yctrlp [lindex $coo 3] set tind 4 } else { set data "M [lrange $coo 0 1]" # Add Q1 and Q2 points. append data " Q [lrange $coo 2 3]" set x0 [expr {([lindex $coo 2] + [lindex $coo 4])/2.}] set y0 [expr {([lindex $coo 3] + [lindex $coo 5])/2.}] append data " $x0 $y0" set xctrlp [lindex $coo 4] set yctrlp [lindex $coo 5] set tind 6 } append data " T" foreach {x y} [lrange $coo $tind end-2] { #puts "x=$x, y=$y, xctrlp=$xctrlp, yctrlp=$yctrlp" # The T point is the midpoint between the # two control points. set x0 [expr {($x + $xctrlp)/2.0}] set y0 [expr {($y + $yctrlp)/2.0}] set xctrlp $x set yctrlp $y append data " $x0 $y0" #puts "data=$data" } if {[string equal $type "polygon"]} { set x0 [expr {([lindex $coo end-1] + $xctrlp)/2.0}] set y0 [expr {([lindex $coo end] + $yctrlp)/2.0}] append data " $x0 $y0" append data " $x0s $y0s" } else { append data " [lrange $coo end-1 end]" } #puts "data=$data" } } return $data } # can2svg::MakeArrowMarker -- # # Make the xml for an arrow marker def element. # # Arguments: # a arrows length along its symmetry line # b arrows total length # c arrows half width # col its color # # Results: # a list of xmllists of the marker def elements, both start and last. proc can2svg::MakeArrowMarker {a b c col} { variable formatArrowMarker variable formatArrowMarkerLast unset -nocomplain formatArrowMarker if {![info exists formatArrowMarker]} { # "M 0 c, b 0, a c, b 2*c Z" for the start marker. # "M 0 0, b c, 0 2*c, b-a c Z" for the last marker. set data "M 0 %s, %s 0, %s %s, %s %s Z" set style "fill: %s; stroke: %s;" set attr [list "d" $data "style" $style] set arrowList [MakeXMLList "path" -attrlist $attr] set markerAttr [list "id" %s "markerWidth" %s "markerHeight" %s \ "refX" %s "refY" %s "orient" "auto"] set defElemList [MakeXMLList "defs" -subtags \ [list [MakeXMLList "marker" -attrlist $markerAttr \ -subtags [list $arrowList] ] ] ] set formatArrowMarker $defElemList # ...and the last arrow marker. set dataLast "M 0 0, %s %s, 0 %s, %s %s Z" set attrLast [list "d" $dataLast "style" $style] set arrowLastList [MakeXMLList "path" -attrlist $attrLast] set defElemLastList [MakeXMLList "defs" -subtags \ [list [MakeXMLList "marker" -attrlist $markerAttr \ -subtags [list $arrowLastList] ] ] ] set formatArrowMarkerLast $defElemLastList } set idKey "arrowMarkerDef_${col}_${a}_${b}_${c}" set idKeyLast "arrowMarkerLastDef_${col}_${a}_${b}_${c}" # Figure out the order of all %s substitutions. set markerXML [format $formatArrowMarker $idKey \ $b [expr {2*$c}] 0 $c \ $c $b $a $c $b [expr {2*$c}] $col $col] set markerLastXML [format $formatArrowMarkerLast $idKeyLast \ $b [expr {2*$c}] $b $c \ $b $c [expr {2*$c}] [expr {$b-$a}] $c $col $col] return [list $markerXML $markerLastXML] } # can2svg::MakeGrayStippleDef -- # # proc can2svg::MakeGrayStippleDef {stipple} { variable stippleDataArr set pathList [MakeXMLList "path" -attrlist \ [list "d" $stippleDataArr($stipple) "style" "stroke: black; fill: none;"]] set patterAttr [list "id" "tile$stipple" "x" 0 "y" 0 "width" 4 "height" 4 \ "patternUnits" "userSpaceOnUse"] set defElemList [MakeXMLList "defs" -subtags \ [list [MakeXMLList "pattern" -attrlist $patterAttr \ -subtags [list $pathList] ] ] ] return $defElemList } # can2svg::MapEmptyToNone -- # # # Arguments: # elem # # Results: # proc can2svg::MapEmptyToNone {val} { if {[string length $val] == 0} { return "none" } else { return $val } } # can2svg::NormalizeRectCoords -- # # # Arguments: # elem # # Results: # proc can2svg::NormalizeRectCoords {coo} { foreach {x1 y1 x2 y2} $coo {} return [list [expr {$x2 > $x1 ? $x1 : $x2}] \ [expr {$y2 > $y1 ? $y1 : $y2}] \ [expr {abs($x1-$x2)}] \ [expr {abs($y1-$y2)}]] } # can2svg::makedocument -- # # Adds the prefix and suffix elements to make a complete XML/SVG # document. # # Arguments: # elem # # Results: # proc can2svg::makedocument {width height xml} { set pre "\n\ " set svgStart "" set svgEnd "" return "${pre}\n${svgStart}\n${xml}${svgEnd}" } # can2svg::canvas2file -- # # Takes everything on a canvas widget, translates it to XML/SVG, # and puts it on a file. # # Arguments: # wcan the canvas widget path # path the file path # args: -height # -width # # Results: # proc can2svg::canvas2file {wcan path args} { variable confopts variable defsArrowMarkerArr variable defsStipplePatternArr array set argsA [array get confopts] foreach {x y width height} [$wcan cget -scrollregion] break array set argsA [list -width $width -height $height] array set argsA $args set args [array get argsA] # Need to make a fresh start for marker def's. unset -nocomplain defsArrowMarkerArr defsStipplePatternArr set fd [open $path w] # This could have been done line by line. set xml "" foreach id [$wcan find all] { set type [$wcan type $id] set opts [$wcan itemconfigure $id] set opcmd {} foreach opt $opts { set op [lindex $opt 0] set val [lindex $opt 4] # Empty val's except -fill can be stripped off. if {![string equal $op "-fill"] && ([string length $val] == 0)} { continue } lappend opcmd $op $val } set co [$wcan coords $id] set cmd [concat "create" $type $co $opcmd] append xml "\t[eval {can2svg $cmd} $args]\n" } puts $fd [makedocument $argsA(-width) $argsA(-height) $xml] close $fd } # can2svg::MakeXML -- # # Creates raw xml data from a hierarchical list of xml code. # This proc gets called recursively for each child. # It makes also internal entity replacements on character data. # Mixed elements aren't treated correctly generally. # # Arguments: # xmlList a list of xml code in the format described in the header. # # Results: # raw xml data. proc can2svg::MakeXML {xmlList} { # Extract the XML data items. foreach {tag attrlist isempty chdata childlist} $xmlList {} set rawxml "<$tag" foreach {attr value} $attrlist { append rawxml " ${attr}='${value}'" } if {$isempty} { append rawxml "/>" return $rawxml } else { append rawxml ">" } # Call ourselves recursively for each child element. # There is an arbitrary choice here where childs are put before PCDATA. foreach child $childlist { append rawxml [MakeXML $child] } # Make standard entity replacements. if {[string length $chdata]} { append rawxml [XMLCrypt $chdata] } append rawxml "" return $rawxml } # can2svg::MakeXMLList -- # # Build an element list given the tag and the args. # # Arguments: # tagname: the name of this element. # args: # -empty 0|1 Is this an empty tag? If $chdata # and $subtags are empty, then whether # to make the tag empty or not is decided # here. (default: 1) # -attrlist {attr1 value1 attr2 value2 ..} Vars is a list # consisting of attr/value pairs, as shown. # -chdata $chdata ChData of tag (default: ""). # -subtags {$subchilds $subchilds ...} is a list containing xmldata # of $tagname's subtags. (default: no sub-tags) # # Results: # a list suitable for can2svg::MakeXML. proc can2svg::MakeXMLList {tagname args} { # Fill in the defaults. array set xmlarr {-isempty 1 -attrlist {} -chdata {} -subtags {}} # Override the defults with actual values. if {[llength $args] > 0} { array set xmlarr $args } if {!(($xmlarr(-chdata) eq "") && ($xmlarr(-subtags) eq ""))} { set xmlarr(-isempty) 0 } # Build sub elements list. set sublist [list] foreach child $xmlarr(-subtags) { lappend sublist $child } set xmlList [list $tagname $xmlarr(-attrlist) $xmlarr(-isempty) \ $xmlarr(-chdata) $sublist] return $xmlList } # can2svg::FileUriFromLocalFile -- # # Not foolproof! proc can2svg::FileUriFromLocalFile {path} { # Quote the disallowed characters according to the RFC for URN scheme. # ref: RFC2141 sec2.2 return file://[uriencode::quotepath $path] } # can2svg::HttpFromLocalFile -- # # Translates an absolute file path to an uri encoded http address. proc can2svg::HttpFromLocalFile {path} { variable confopts set relPath [::tfileutils::relative $confopts(-httpbasedir) $path] set relPath [uriencode::quotepath $relPath] return "http://$confopts(-httpaddr)/$relPath" } # can2svg::XMLCrypt -- # # Makes standard XML entity replacements. # # Arguments: # chdata: character data. # # Results: # chdata with XML standard entities replaced. proc can2svg::XMLCrypt {chdata} { foreach from {\& < > {"} {'}} \ to {{\&} {\<} {\>} {\"} {\'}} { regsub -all $from $chdata $to chdata } return $chdata } ## the following dummy is only here to undo the quoting error ## produced by some syntax-highlighters in the above function proc can2svg::dummy {} { puts {"} } #------------------------------------------------------------------------------- proc menu_export {mytoplevel} { if { ! [file isdirectory $::fileopendir]} {set ::fileopendir $::env(HOME)} set name [lookup_windowname $mytoplevel] # check if this is the default name 'Untitled' and if so, use 'pd.svg' # else strip the trailing .pd and add .svg set filename [tk_getSaveFile -initialfile ${name}.svg \ -defaultextension .svg \ -filetypes { {{Scalable Vector Graphics} {.svg}} } \ -initialdir $::fileopendir \ ] if {$filename ne ""} { set cnv [tkcanvas_name $mytoplevel] can2svg::canvas2file $cnv $filename set ::fileopendir [file dirname $filename] } } proc focus {winid state} { set menustate [expr $state?"normal":"disabled"] .menubar.file entryconfigure $::patch2svg::label -state $menustate } proc register {} { # create an entry for our "print2svg" in the "file" menu set ::patch2svg::label [_ "Export patch as SVG..."] set mymenu .menubar.file if {$::windowingsystem eq "aqua"} { set inserthere 8 } else { set inserthere 8 } #$mymenu insert $inserthere separator $mymenu insert $inserthere command \ -label $::patch2svg::label \ -state disabled \ -command {::patch2svg::menu_export $::focused_window} # bind all <$::modifier-Key-s> {::deken::open_helpbrowser .helpbrowser2} bind PatchWindow "+::patch2svg::focus %W 1" bind PdWindow "+::patch2svg::focus %W 0" set rpdr ::pd_connect::register_plugin_dispatch_receiver if {[info procs $rpdr] == $rpdr} { ${rpdr} ::patch2svg::exportall ::patch2svg::exportall } pdtk_post "loaded patch2svg-plugin\n" } } ::patch2svg::register iem_utils-0.0.20240903/patch2svg-plugin/po/0000700000000000000000000000000014665566711015015 5ustar00iem_utils-0.0.20240903/patch2svg-plugin/po/Makefile0000600000000000000000000000220614665566711016457 0ustar00 PACKAGE_NAME = patch to SVG PACKAGE_VERSION = 1.0 TCLFILES = patch2svg-plugin.tcl # we use all language files found here POFILES=$(wildcard *.po) MSGFILES=$(POFILES:.po=.msg) TEMPLATE = patch2svg.pot FILES = $(addprefix ../, $(TCLFILES)) # generate .msg files from the .po files all: $(TEMPLATE) $(MSGFILES) # refresh .po files from the template clean: -rm -f -- $(MSGFILES) -rm -f -- $(POFILES:=~) -rm -f -- $(TEMPLATE) distclean: clean po: $(TEMPLATE) $(POFILES) $(TEMPLATE): $(FILES) touch $(TEMPLATE) xgettext --join-existing \ --from-code=UTF-8 --language=Tcl --keyword=_ \ --sort-output --no-location --output=$(TEMPLATE) \ --package-name="$(PACKAGE_NAME)" \ --package-version=$(PACKAGE_VERSION) \ --copyright-holder='This file is put in the public domain' \ --foreign-user \ --msgid-bugs-address=http://bugs.puredata.info \ $(FILES) $(POFILES): $(TEMPLATE) touch $@ msgmerge --sort-output --no-fuzzy-matching --no-location --update $@ $(TEMPLATE) %.msg: %.po msgfmt --check --tcl --locale=$* -d . $< #install: $(MSGFILES) # install -d $(DESTDIR) # install $(MSGFILES) $(DESTDIR) install: @echo "nothing to install" iem_utils-0.0.20240903/patch2svg-plugin/po/de.po0000600000000000000000000000110314665566711015742 0ustar00msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.puredata.info\n" "POT-Creation-Date: 2016-02-17 22:39+0100\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.7\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # FIRST AUTHOR , YEAR. # msgid "Export patch as SVG..." msgstr "Patch als SVG exportieren..." iem_utils-0.0.20240903/punish/0000700000000000000000000000000014665566711012510 5ustar00iem_utils-0.0.20240903/punish/Makefile0000600000000000000000000000064514665566711014157 0ustar00subprojects=patcherize triggerize doublechord .PHONY: all $(subprojects) all: $(subprojects) $(subprojects): $(MAKE) -C $@-plugin .PHONY: clean $(subprojects%=%-clean) clean: $(subprojects:%=%-clean) $(subprojects:%=%-clean): $(MAKE) -C $(@:%-clean=%-plugin) clean .PHONY: install $(subprojects%=%-install) install: $(subprojects:%=%-install) $(subprojects:%=%-install): $(MAKE) -C $(@:%-install=%-plugin) install iem_utils-0.0.20240903/punish/README.md0000600000000000000000000000132014665566711013765 0ustar00punish - IEM's Pure Data User Interface Hacks ============================================= a collection of hacks for the Pd User Interface # BIG FAT WARNING This collection is intended to explore ideas on how to improve Pd's user interface (from a library perspective). There are known crasher bugs. # Contents ## [patcherize](patcherize-plugin) turn selected objects into a subpatch (or abstraction) ## [triggerize](triggerize-plugin) - replace fan-outs with [trigger]s - expand [trigger] to the *left* - insert [trigger] into wires ## [double-chord](doublechord-plugin) - duplicate connections between two multi-iolet objects # LICENSE each hack comes with its own license # AUTHORS - IOhannes m zmölnig iem_utils-0.0.20240903/punish/doublechord-plugin/0000700000000000000000000000000014665566711016276 5ustar00iem_utils-0.0.20240903/punish/doublechord-plugin/LICENSE.md0000600000000000000000000004364214665566711017715 0ustar00GNU GENERAL PUBLIC LICENSE ========================== Version 2, June 1991 > Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. # Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. # GNU GENERAL PUBLIC LICENSE # ## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ## - *0\.* This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - 1\. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2\. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3\. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 4\. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 5\. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - 6\. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - 7\. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 8\. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 9\. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - 10\. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. ## NO WARRANTY - 11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## END OF TERMS AND CONDITIONS ## --------------------------------------------------------------------------- ### How to Apply These Terms to Your New Programs ### If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. iem_utils-0.0.20240903/punish/doublechord-plugin/Makefile0000700000000000000000000000166114665566711017745 0ustar00#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) punish.name = doublechord lib.name = $(punish.name)-plugin # special file that does not provide a class lib.setup.sources = # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(punish.name).c datafiles = \ $(punish.name)-plugin.tcl \ $(wildcard *-help.pd) \ README.md LICENSE.md datadirs = ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, # or else from some user-defined folder PDLIBBUILDER_DIR=../pd-lib-builder include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder iem_utils-0.0.20240903/punish/doublechord-plugin/README.md0000600000000000000000000000267414665566711017570 0ustar00double chord ============ duplicate patch chords # Usage ### removing fan-outs - Select objects with fan-outs - Press Control+t - the (msg) fan-outs will be replaced by (connected) [t a a] objects # Installation ## Building Build the external: make If you have an unusual setup (and/or your Pd installation is at a place not found by the compiler), you can parameterize the build. Try this first: make help ## Installing TODO these instructions are generic and not necessarily correct Put both the externals (`doublechord.pd_linux` or similar) and the GUI plugin (`doublechord-plugin.tcl`) into a directory `doublechord-plugin`, and put that into a place where Pd can find it. make install E.g. $ ls ~/.local/lib/pd/extra/doublechord-plugin/ ~/.local/lib/pd/extra/doublechord-plugin/doublechord.pd_linux ~/.local/lib/pd/extra/doublechord-plugin/doublechord-plugin.tcl # BUGS ## none known TODO # AUTHORS IOhannes m zmölnig # LICENSE `doublechord` is released under the Gnu GPL version 2 (or later). See LICENSE.md for the full text of the GPLv2. ## Special license grant to Miller Puckette I hereby grant Miller S. Puckette the exclusive right to include `doublechord` into Pure Data (Pd) under the BSD 3-clause license under which Pd is currently released. Once it has been included into Pd it is of course re-distributable under that license. Until then, the Gnu GPL v2 (or later) applies. iem_utils-0.0.20240903/punish/doublechord-plugin/doublechord-help.pd0000600000000000000000000000447414665566711022056 0ustar00#N canvas 30 90 474 662 10; #X text 89 46 doublechord; #X text 89 57 ===========; #X text 25 88 an easy way to connect an object with many outlets and an object with many inlets.; #X text 30 150 usage:; #X text 111 152 1.) create two objects; #X text 111 168 2.) connect them; #X text 111 185 3.) select the *connection*; #X text 111 203 4.) press - (duplicate) to create a new connection right of the selected connection., f 43; #X text 111 247 5.) press - again to create more connections ; #X text 83 285 Pd will stop creating new connections once you've reached the rightmost inlet resp. outlet.; #X text 83 315 It will also stop \, if the outlet cannot be connected to the inlet because they are incompatible (e.g. you cannot connect a signal-outlet with a non-signal inlet); #X text 84 360 If there's already a connection in place \, Pd will skip it and proceed to the right.; #N canvas 180 311 450 300 \$0-try-it-out 0; #X obj 100 100 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X obj 100 150 pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; #X text 50 50 select the connection and click Ctrl-D (again).; #X connect 0 1 1 0; #X restore 136 460 pd \$0-try-it-out; #X text 268 461 <- try it!; #N canvas 202 208 969 430 try 0; #X obj 100 100 bng 20 250 50 0 \$0-try \$0-try empty 17 7 0 10 -262144 -1 -1; #X obj 168 125 r \$0-try; #X obj 168 147 t b b; #X obj 168 241 s pd-\$0-try-it-out; #X obj 310 102 loadbang; #X msg 168 199 vis 1 \, editmode 1; #X msg 80 199 clear; #X obj 310 124 t b b; #X msg 337 150 editmode 0 \, vis 0; #X msg 310 183 clear \, obj 100 100 unpack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \, obj 100 150 pack 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \, connect 0 1 1 0 \, text 50 50 select the connection and click Ctrl-D (again).; #X connect 1 0 2 0; #X connect 2 0 5 0; #X connect 2 1 9 0; #X connect 4 0 7 0; #X connect 5 0 3 0; #X connect 6 0 3 0; #X connect 7 0 9 0; #X connect 7 1 8 0; #X connect 8 0 3 0; #X connect 9 0 3 0; #X coords 0 -1 1 1 20 20 2 100 100; #X restore 243 457 pd try; #X text 18 544 installation instructions:; #X text 37 628 2.) Restart Pd; #X text 66 606 "Just say NO" \, if the plugin installer asks you to do so.; #X text 38 563 1.) put the doublechord-plugin/ folder somewhere in Pd's search path., f 69; #X text 37 586 1.1) DO NOT add the doublechord-plugin/ folder to the search path., f 66; iem_utils-0.0.20240903/punish/doublechord-plugin/doublechord-plugin.tcl0000600000000000000000000000144714665566711022600 0ustar00# META helper plugin for doublechord-selection # META DESCRIPTION adds menu to tell the 'doublechord' library to doit # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 namespace eval ::iem::punish::doublechord:: { proc register {} { # attempt to load the 'doublechord' library from iem::punish # (that does all the work) set lib [string map {" " "\\ "} [file join $::current_plugin_loadpath doublechord]] pdsend "pd-_float_template declare -lib $lib" ::pdwindow::post "loaded iem::punish::doublechord-plugin\n" } } if {[ expr $::PD_MAJOR_VERSION.$::PD_MINOR_VERSION < 0.49 ]} { ::iem::punish::doublechord::register } { ::pdwindow::debug "disabled iem::punish::doublechord on Pd>=0.49\n" } iem_utils-0.0.20240903/punish/doublechord-plugin/doublechord.c0000600000000000000000000000615214665566711020742 0ustar00/****************************************************** * * doublechord - implementation file * * copyleft (c) IOhannes m zmölnig * * 2017:forum::für::umläute:2017 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 (or later) * ******************************************************/ /* * * - doublechord: duplicate patch chords * * select a connection (aka 'patch chord'), and press Ctrl-D * the connection will be duplicated to the right (if possible), * connecting the same two objects but the next outlets/inlets * */ #include "m_pd.h" #include "m_imp.h" #include "g_canvas.h" static t_object* index2glist(const t_glist*glist, int index) { t_gobj*obj=glist->gl_list; while(index-->0 && obj) { obj=obj->g_next; } return (t_object*)obj; } static int is_connected(t_object*src, int nsrc, const t_object*dst, const int ndst) { t_outlet *out = 0; t_outconnect*conn=obj_starttraverseoutlet(src, &out, nsrc); while(conn) { int which = 0; t_inlet *in = 0; t_object *dest = 0; conn=obj_nexttraverseoutlet(conn, &dest, &in, &which); if ((dst == dest) && (ndst == which)) return 1; } return 0; } /* ------------------------- doublechord ---------------------------- */ static void canvas_doublechord(t_canvas *x) { if (x && x->gl_editor && x->gl_editor->e_selectedline) { t_atom ap[4]; int outno = x->gl_editor->e_selectline_outno + 1; int inno = x->gl_editor->e_selectline_inno + 1; t_object*outobj = index2glist(x, x->gl_editor->e_selectline_index1); t_object*inobj = index2glist(x, x->gl_editor->e_selectline_index2); while(is_connected(outobj, outno, inobj, inno)) { outno++; inno++; } if (!outobj || obj_noutlets(outobj) <= outno) return; if (!inobj || obj_ninlets (inobj ) <= inno ) return; if(obj_issignaloutlet(outobj, outno) && !obj_issignalinlet(inobj, inno)) return; SETFLOAT(ap+0, x->gl_editor->e_selectline_index1); SETFLOAT(ap+1, outno); SETFLOAT(ap+2, x->gl_editor->e_selectline_index2); SETFLOAT(ap+3, inno); pd_typedmess((t_pd*)x, gensym("connect"), 4, ap); x->gl_editor->e_selectline_outno = outno; x->gl_editor->e_selectline_inno = inno; } else { pd_typedmess((t_pd*)x, gensym("duplicate doublechord"), 0, 0); } } void doublechord_setup(void) { t_gotfn dupfun = 0; int major, minor, bugfix; sys_getversion(&major, &minor, &bugfix); if((major>0 || minor >= 49)) { pd_error(0, "double-chord built into Pd>=0.49, not enabling iem::punish::doublechord"); return; } if(NULL==canvas_class) { logpost(0, PD_VERBOSE, "double-chord detected class_new() @ %p", class_new); return; } dupfun = zgetfn(&canvas_class, gensym("duplicate")); if((t_method)canvas_doublechord != (t_method)dupfun) { post("double-chord - duplicate patch chords"); class_addmethod(canvas_class, (t_method)dupfun, gensym("duplicate doublechord"), 0); class_addmethod(canvas_class, (t_method)canvas_doublechord, gensym("duplicate"), 0); } } iem_utils-0.0.20240903/punish/patcherize-plugin/0000700000000000000000000000000014665566711016142 5ustar00iem_utils-0.0.20240903/punish/patcherize-plugin/LICENSE.md0000600000000000000000000004364214665566711017561 0ustar00GNU GENERAL PUBLIC LICENSE ========================== Version 2, June 1991 > Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. # Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. # GNU GENERAL PUBLIC LICENSE # ## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ## - *0\.* This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - 1\. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2\. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3\. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 4\. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 5\. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - 6\. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - 7\. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 8\. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 9\. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - 10\. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. ## NO WARRANTY - 11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## END OF TERMS AND CONDITIONS ## --------------------------------------------------------------------------- ### How to Apply These Terms to Your New Programs ### If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. iem_utils-0.0.20240903/punish/patcherize-plugin/Makefile0000700000000000000000000000166014665566711017610 0ustar00#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) punish.name = patcherize lib.name = $(punish.name)-plugin # special file that does not provide a class lib.setup.sources = # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(punish.name).c datafiles = \ $(punish.name)-plugin.tcl \ $(wildcard *-help.pd) \ README.md LICENSE.md datadirs = ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, # or else from some user-defined folder PDLIBBUILDER_DIR=../pd-lib-builder include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder iem_utils-0.0.20240903/punish/patcherize-plugin/README.md0000600000000000000000000000571214665566711017430 0ustar00patcherize ========== - connections to the containing patch will be kept (via inlets/outlets) - objects will keep their internal state # Usage - Select the objects you want to turn into a subpatch - Press Control+Shift+p to turn the selected objects into a subpatch. - the selection will be replaced by a subpatch `[pd /*patcherized*/]` - Alternatively, you can do this via the Menu: `Edit` -> `(Sub)patcherize Selection` You can also create an abstraction from the selection: - Select the objects you want to turn into a subpatch - Use the menu: `Edit` -> `Patcherize selection...` - a "Save As..." menu will appear, asking you where you want to save the patcherized selection (e.g. pick "foo.pd") - The selection will be replaced by an abstraction for the said name (e.g. `[foo]`). - If you saved the abstraction outside Pd's search path, the abstraction will be instantiated with its full name (e.g. `[/home/frodel/foo]`) # Installation ## Building Build the external: make If you have an unusual setup (and/or your Pd installation is at a place not found by the compiler), you can parameterize the build. Try this first: make help ## Installing Put both the externals (`patcherize.pd_linux` or similar) and the GUI plugin (`patcherize-plugin.tcl`) into a directory `patcherize-plugin`, and put that into a place where Pd can find it. make install E.g. $ ls ~/.local/lib/pd/extra/patcherize-plugin/ ~/.local/lib/pd/extra/patcherize-plugin/patcherize.pd_linux ~/.local/lib/pd/extra/patcherize-plugin/patcherize-plugin.tcl # BUGS ## Pd crashes when clicking on a patcherized msgbox Yes. Patcherization does not re-instantiate any object (or msgbox). Instead it just "moves" the selection to the new window, basically leaving the object unaware that it's context has changed. When clicking on the 'msgbox', the "flashing effect" will try to talk to the wrong window, resulting in a crash. This could be fixed by doing a Cut-n-Paste instead of sleekily migrating the objects, but this would result in objects losing their inner state (not a problem for a msgbox, that doesn't have any hidden inner state) ## GUI objects do not respond after being patcherized See above: the reason for this behaviour is the same (albeit less drastic) than the crashing msgbox. Unfortunately, generic GUI objects might (and most probably) will have a hidden inner state - which is the reason why i would rather not go the safe Cut-n-Paste route. # AUTHORS IOhannes m zmölnig # LICENSE `patcherize` is released under the Gnu GPL version 2 (or later). See LICENSE.md for the full text of the GPLv2. ## Special license grant to Miller Puckette I hereby grant Miller S. Puckette the exclusive right to include `patcherize` into Pure Data (Pd) under the BSD 3-clause license under which Pd is currently released. Once it has been included into Pd it is of course re-distributable under that license. Until then, the Gnu GPL v2 (or later) applies. iem_utils-0.0.20240903/punish/patcherize-plugin/patcherize-help.pd0000600000000000000000000000366514665566711021567 0ustar00#N canvas 30 90 472 613 10; #X declare -lib patcherize -path iemguts -stdpath iemguts; #N canvas 504 133 594 498 guts 0; #X obj 136 176 inlet; #X obj 207 262 sendcanvas 1; #X msg 207 242 patcherize; #X obj 207 222 t b; #X obj 136 380 canvasselect 1; #X msg 136 360 select \$1; #X obj 136 282 t b b; #X msg 215 356 deselect; #X obj 149 105 declare -lib patcherize -path iemguts -stdpath iemguts; #X obj 425 321 s \$0-on; #X msg 425 300 1; #X obj 425 231 t b; #X msg 188 176 init; #X obj 136 198 route select patcherize init; #X obj 188 154 loadbang; #X msg 136 308 1 \, 2; #X obj 136 330 + 8; #X connect 0 0 13 0; #X connect 2 0 1 0; #X connect 3 0 2 0; #X connect 5 0 4 0; #X connect 6 0 15 0; #X connect 6 1 7 0; #X connect 7 0 4 0; #X connect 10 0 9 0; #X connect 11 0 10 0; #X connect 12 0 13 0; #X connect 13 0 6 0; #X connect 13 1 3 0; #X connect 13 2 11 0; #X connect 14 0 12 0; #X connect 15 0 16 0; #X connect 16 0 5 0; #X restore 57 236 pd guts; #X obj 37 394 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000; #X obj 37 372 r \$0-beat; #X msg 57 170 select; #X msg 70 194 patcherize; #X text 114 383 objects will continue to work...; #X text 163 165 1st \, select a few objects; #X text 163 189 then turn selected objects into subpatch; #X obj 125 272 tgl 15 0 empty \$0-on empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; #X obj 125 316 s \$0-beat; #X obj 125 294 metro 500; #X text 40 26 patcherize; #X text 40 37 ==========; #X text 39 66 turn selected parts of your patch into a subpatch or an abstraction., f 69; #X text 18 454 installation instructions:; #X text 37 496 1.1) DO NOT add the patcherize-plugin/ folder to the search path., f 66; #X text 38 473 1.) put the patcherize-plugin/ folder somewhere in Pd's search path., f 68; #X text 37 538 2.) Restart Pd; #X text 66 516 "Just say NO" \, if the plugin installer asks you to do so.; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 0 0; #X connect 8 0 10 0; #X connect 10 0 9 0; iem_utils-0.0.20240903/punish/patcherize-plugin/patcherize-plugin.tcl0000600000000000000000000000621614665566711022307 0ustar00# META helper plugin for patcherize-selection # META DESCRIPTION adds menu to tell the 'patcherize' library to doit # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 if [catch { package require msgcat ::msgcat::mcload po }] { puts "iem::punish::patcherize: i18n failed" } namespace eval ::iem::punish::patcherize:: { variable label_sub variable label_abs proc focus {winid state} { set menustate [expr $state?"normal":"disabled"] .menubar.edit entryconfigure "$::iem::punish::patcherize::label_sub" -state $menustate .menubar.edit entryconfigure "$::iem::punish::patcherize::label_abs" -state $menustate } ## helper function to pick a filename for saving # (why isn't there something like this in Pd-GUI?) proc savepanel {initialdir {initialfile ""} {defaultextension ".pd"} {filetypes $::filetypes} } { if { "$filetypes" == {$::filetypes} } { set filetypes $::filetypes } if { ! [file isdirectory $initialdir]} {set initialdir $::env(HOME)} set filename [tk_getSaveFile \ -defaultextension $defaultextension \ -filetypes $filetypes \ -initialfile $initialfile \ -initialdir $initialdir] return $filename } proc patcherize2file {winid} { set filename [::iem::punish::patcherize::savepanel "." "" ".pd" [list [list [_ "Pd Files"] {.pd} ]]] if { $filename != "" } { menu_send $::focused_window "patcherize [enquote_path $filename]" } } proc register {} { # create an entry for our "print2svg" in the "file" menu set ::iem::punish::patcherize::label_sub [_ "SubPatcherize Selection"] set ::iem::punish::patcherize::label_abs [_ "Patcherize Selection..."] set accelerator $::pd_menus::accelerator set mymenu .menubar.edit if {$::windowingsystem eq "aqua"} { set inserthere 8 set accelerator "$accelerator+Shift" } else { set inserthere 8 set accelerator "Shift+$accelerator" } set accelerator "$accelerator+P" $mymenu insert $inserthere command \ -label $::iem::punish::patcherize::label_sub \ -state disabled \ -accelerator "$accelerator" \ -command { menu_send $::focused_window patcherize } $mymenu insert [incr inserthere] command \ -label $::iem::punish::patcherize::label_abs \ -state disabled \ -command { ::iem::punish::patcherize::patcherize2file $::focused_window } bind all <$::modifier-Key-P> {menu_send %W patcherize} bind PatchWindow "+::iem::punish::patcherize::focus %W 1" bind PdWindow "+::iem::punish::patcherize::focus %W 0" # attempt to load the 'patcherize' library from iem::punish # (that does all the work) set lib [string map {" " "\\ "} [file join $::current_plugin_loadpath patcherize]] pdsend "pd-_float_template declare -lib $lib" ::pdwindow::post "loaded iem::punish::patcherize-plugin\n" } } ::iem::punish::patcherize::register iem_utils-0.0.20240903/punish/patcherize-plugin/patcherize.c0000600000000000000000000005276014665566711020460 0ustar00/****************************************************** * * patcherize - implementation file * * copyleft (c) IOhannes m zmölnig * * 2016:forum::für::umläute:2016 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 (or later) * ******************************************************/ /* * * - patcherize selection * * send a 'patcherize' message to the canvas, and all currently selected objects will * be moved into a newly created subpatch * * TODO: * - subpatch label * + if the containing canvas is visible, go into edit-mode and let the user type a canvas-name immediately * * LATER: * - save selection to file * */ #include "m_pd.h" #include "g_canvas.h" #include "m_imp.h" #include #include #include /* ------------------------- patcherize ---------------------------- */ /* ------------ utilities ---------- */ void update_minmax_i(int value, int*min_value, int*max_value) { if(min_value && *min_value > value) *min_value = value; if(max_value && *max_value < value) *max_value = value; } static t_gobj*o2g(t_object*obj) { return &(obj->te_g); } static t_object*g2o(t_gobj*gobj) { return pd_checkobject(&gobj->g_pd); } static void print_glist(t_glist*glist) { t_gobj*obj = NULL; if(NULL == glist)return; post("\tglist=%p", glist); for(obj=glist->gl_list; obj; obj=obj->g_next) { post ("\t%p [%p]", obj, obj->g_next); } } static int glist_suspend_editor(t_glist*glist) { int wanteditor = (NULL != glist->gl_editor); canvas_destroy_editor(glist); return wanteditor; } static void glist_resume_editor(t_glist*glist, int wanteditor) { if(wanteditor) { canvas_create_editor(glist); } glist_redraw(glist); } static int object_isabstraction(t_object*obj) { if(!obj || !obj->te_g.g_pd)return 0; return (gensym("canvas") == obj->te_g.g_pd->c_name && canvas_isabstraction((t_canvas*)obj)); } static int object_issubpatch(t_object*obj) { if(!obj || !obj->te_g.g_pd)return 0; return (gensym("canvas") == obj->te_g.g_pd->c_name && !canvas_isabstraction((t_canvas*)obj)); } static void object_typedmess(t_object *x, t_symbol *s, int argc, t_atom *argv) { pd_typedmess(&x->te_g.g_pd, s, argc, argv); } /* returns 0 if the object is to be excluded from patcherization */ static t_symbol**s_excluded_classnames = 0; static void build_exclude_list(void) { int i=0; s_excluded_classnames=getbytes(5 * sizeof(*s_excluded_classnames)); s_excluded_classnames[i++]=gensym("inlet"); s_excluded_classnames[i++]=gensym("outlet"); s_excluded_classnames[i++]=gensym("inlet~"); s_excluded_classnames[i++]=gensym("outlet~"); s_excluded_classnames[i++]=0; } static int include_in_patcherization(const t_object*obj) { const t_symbol*c_name=obj->te_g.g_pd->c_name; t_symbol**excluded; if(!s_excluded_classnames)build_exclude_list(); for(excluded=s_excluded_classnames;*excluded; excluded++) { if(c_name == *excluded)return 0; } return 1; } struct _patcherize_connectto { t_object *object; /* object that we connect to */ unsigned int index; /* which inlet of the given object is this? */ struct _patcherize_connectto *next; }; /* connection between subpatch and surrounding environment */ typedef struct _patcherize_connection { int is_signal; /* is this a signal outlet? */ t_object*object; /* object that we connect from */ unsigned int index; /* which outlet of the given object is this? */ struct _patcherize_connectto*to; /* list of connections */ struct _patcherize_connection*next; } t_patcherize_connection; typedef struct _patcherize_connections { t_patcherize_connection*inlets; t_patcherize_connection*outlets; } t_patcherize_connections; static int patcherize_conn_leftof_ref(t_object*ref_obj, unsigned int ref_idx, t_object*obj, unsigned int idx) { if(obj->te_xpix < ref_obj->te_xpix) return 1; if(obj->te_xpix > ref_obj->te_xpix) return 0; if(idx < ref_idx) return 1; if(idx > ref_idx) return 0; if(obj->te_ypix < ref_obj->te_ypix) return 1; if(obj->te_ypix > ref_obj->te_ypix) return 0; return 0; } static void insert_connection_to(t_patcherize_connection*iolets,t_object*to_obj, unsigned int to_index) { struct _patcherize_connectto*dest=iolets->to, *last=NULL; while(dest) { if((dest->object == to_obj) && (dest->index == to_index)) /* already inserted */ return; last=dest; dest=dest->next; } dest=calloc(1, sizeof(*dest)); dest->object=to_obj; dest->index=to_index; if(last) last->next=dest; else iolets->to=dest; } static t_patcherize_connection*create_connection(t_object*from_obj, int from_index, t_object*to_obj, int to_index) { t_patcherize_connection*conn=calloc(1, sizeof(*conn)); conn->is_signal=obj_issignaloutlet(from_obj, from_index); conn->object=from_obj; conn->index=from_index; insert_connection_to(conn, to_obj, to_index); return conn; } static t_patcherize_connection*insert_connection(t_patcherize_connection*iolets, t_object*from_obj, unsigned int from_index, t_object*to_obj, unsigned int to_index) { /* check whether iolets already contains from_obj/from_index */ t_patcherize_connection*cur=iolets, *last=NULL, *conn=NULL; if(!cur) { return create_connection(from_obj, from_index, to_obj, to_index); } while(cur) { if((cur->object == from_obj) && (cur->index == from_index)) { /* found it; insert new 'to' */ insert_connection_to(cur, to_obj, to_index); return iolets; } cur=cur->next; } /* if we reach this, then we didn't find the output in our list; so create it */ /* LATER: insert the new connection at a sorted location */ conn=create_connection(from_obj, from_index, to_obj, to_index); /* inserted into sorted list */ cur=iolets; last=NULL; while(cur) { if(patcherize_conn_leftof_ref(cur->object, cur->index, from_obj, from_index)) { /* we sort before current element, so insert! */ conn->next=cur; if(last) { last->next=conn; } else { /* insert beginning */ iolets=conn; } return iolets; } last=cur; cur=cur->next; } /* if we reached this, then the new outlet sorts last */ last->next=conn; return iolets; } static void print_conns(const char*name, t_patcherize_connection*conn) { post("%s: %p", name, conn); while(conn) { struct _patcherize_connectto *to=conn->to; while(to) { post("%s%p[%d] -> %p[%d]", name, conn->object, conn->index, to->object, to->index); to=to->next; } conn=conn->next; } } static t_patcherize_connection*get_object_connections(t_patcherize_connection*iolets, t_glist*cnv, t_object*obj) { int sel=glist_isselected(cnv,&obj->te_g); int obj_nout=obj_noutlets(obj); int nout=0; for(nout=0; noutte_g)) != sel) { /* this is a connection crossing the selection boundary; insert it */ iolets=insert_connection(iolets, obj, nout, dest, which); } } } return iolets; } static t_patcherize_connections*get_connections(t_glist*cnv) { t_patcherize_connections*connections=calloc(1, sizeof(*connections)); /* 1. iterate over all the objects in the canvas, and store any connecting objects */ t_gobj*gobj=NULL; for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { t_object*obj=pd_checkobject(&gobj->g_pd); if(!obj)continue; if(glist_isselected(cnv, gobj)) { connections->outlets=get_object_connections(connections->outlets, cnv, obj); } else { connections->inlets=get_object_connections(connections->inlets, cnv, obj); } } return connections; } static unsigned int object_getmaxdollar(t_object*obj, unsigned int intermediate) { t_binbuf*b=obj->te_binbuf; int argc=binbuf_getnatom(b); t_atom*argv=binbuf_getvec(b); while(argc--) { t_atom*a=argv++; unsigned int dollarg=0; if(A_DOLLAR == a->a_type) dollarg=a->a_w.w_index; else if(A_DOLLSYM == a->a_type) { const char*s=a->a_w.w_symbol->s_name; while(*s){ if('$' == *s) { char*endptr=0; unsigned int v=(unsigned int)strtol(s+1, &endptr, 10); s=endptr; if(v>dollarg)dollarg=v; } else s++; } } if(dollarg>intermediate)intermediate=dollarg; } return intermediate; } static unsigned int get_maxdollarg(t_object*obj) { unsigned int result=0; if(object_issubpatch(obj)) { // a subpatch! recurse t_gobj*gobj; for(gobj=((t_glist*)obj)->gl_list; gobj; gobj=gobj->g_next) { unsigned int subdollar=get_maxdollarg(g2o(gobj)); if(subdollar>result)result=subdollar; } } return(object_getmaxdollar(obj, result)); } static void free_connectto(struct _patcherize_connectto*conn) { struct _patcherize_connectto*next=0; while(conn) { next=conn->next; conn->object=NULL; conn->index=0; conn->next=NULL; free(conn); conn=next; } } static void free_connection(t_patcherize_connection*conn) { t_patcherize_connection*next=0; while(conn) { next=conn->next; free_connectto(conn->to); conn->object=NULL; conn->index=0; conn->to=NULL; conn->next=NULL; free(conn); conn=next; } } static void free_connections(t_patcherize_connections*conns) { free_connection(conns->inlets); free_connection(conns->outlets); conns->inlets=conns->outlets=NULL; free(conns); } static void patcherize_boundary_disconnect(t_patcherize_connection*from) { while(from) { struct _patcherize_connectto*to=from->to; while(to) { obj_disconnect(from->object, from->index, to->object, to->index); to=to->next; } from=from->next; } } static void patcherize_boundary_reconnect(t_canvas*cnv,t_patcherize_connections*connections) { unsigned int index=0; t_gobj*gobj=cnv->gl_list; t_patcherize_connection*conns=connections->inlets; while(conns) { struct _patcherize_connectto*to=conns->to; /* connect outside objects with new subpatch */ obj_connect(conns->object, conns->index, (t_object*)cnv, index); while(to) { /* connect [inlet]s with inside objects */ obj_connect((t_object*)gobj, 0, to->object, to->index); to=to->next; } index++; gobj=gobj->g_next; conns=conns->next; } conns=connections->outlets; index=0; while(conns) { struct _patcherize_connectto*to=conns->to; /* connect inside objects with [outlet]s */ obj_connect(conns->object, conns->index, (t_object*)gobj, 0); while(to) { /* connect subpatch with outside objects */ obj_connect((t_object*)cnv, index, to->object, to->index); to=to->next; } index++; conns=conns->next; gobj=gobj->g_next; } } static void patcherize_fixcoordinates(unsigned int argc, t_gobj**argv, int xmin, int ymin) { unsigned int i; for(i=0; ig_pd); if(obj) { int x = obj->te_xpix; int y = obj->te_ypix; obj->te_xpix = x - xmin + 30; obj->te_ypix = y - ymin + 60; } } } static int patcherize_single_canvas(t_gobj*gobj, const char*name, int save2file) { /* sub-patcherizing abstraction: turn abstraction into subpatch * filepatcherizing sub-patch : turn sub-patch into abstraction */ t_object*obj=g2o(gobj); if(save2file && object_issubpatch(obj)) { post("patcherizing subpatch"); } else if(!save2file && object_isabstraction(obj)) { if (!name) { t_atom*argv=binbuf_getvec(obj->te_binbuf); name=atom_getsymbol(argv)->s_name; } post("sub-patcherizing abstraction: %s", name); } return 0; } static t_glist*patcherize_makesub(t_canvas*cnv, const char* name, /* subpatch name of filename */ int*save2file_, int X, int Y, int xmin, int ymin, int xmax, int ymax, int xwin, int ywin, t_patcherize_connections*connections, unsigned int maxdollarg); static t_glist* patcherize_makesub_tryagain(t_canvas*cnv, const char*name, int*save2file, int X, int Y, int xmin, int ymin, int xmax, int ymax, int xwin, int ywin, t_patcherize_connections*connections, unsigned int maxdollarg, t_binbuf*b, t_pd *boundx, t_pd *boundn) { /* things went wrong, try again as subpatch */ t_glist*res=patcherize_makesub(cnv, name, 0, X, Y, xmin, ymin, xmax, ymax, xwin, ywin, connections, maxdollarg); if(save2file)*save2file=0; s__X.s_thing = boundx; s__N.s_thing = boundn; binbuf_free(b); return res; } static t_glist*patcherize_makesub(t_canvas*cnv, const char* name, /* subpatch name of filename */ int*save2file_, int X, int Y, int xmin, int ymin, int xmax, int ymax, int xwin, int ywin, t_patcherize_connections*connections, unsigned int maxdollarg) { t_binbuf*b=NULL; t_gobj*result=NULL; t_patcherize_connection*iolets=NULL; int x, y; int width=xmax-xmin; int height=ymax-ymin; int save2file=(save2file_)?*save2file_:0; /* save and clear bindings to symbols #a, $N, $X; restore when done */ t_pd *boundx = s__X.s_thing, *boundn = s__N.s_thing; s__X.s_thing = &cnv->gl_pd; s__N.s_thing = &pd_canvasmaker; if(width <200) width=200; if(height<100)height=100; if (!name || !*name)save2file=0; if(save2file && strcmp(name + strlen(name) - 3, ".pd")) { /* not a Pd patch */ save2file=0; } b=binbuf_new(); if (save2file) { // #N canvas 4 49 450 300 10; binbuf_addv(b, "ssiiiii;", gensym("#N"), gensym("canvas"), xwin+xmin, ywin+ymin, width, height, 10); } else { binbuf_addv(b, "ssiiiisi;", gensym("#N"), gensym("canvas"), xwin+xmin, ywin+ymin, width, height, gensym(name), 0); } iolets=connections->inlets; x=20; y=20; while(iolets) { binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), x, y, obj_issignaloutlet(iolets->object, iolets->index)?gensym("inlet~"):gensym("inlet")); x+=50; iolets=iolets->next; } iolets=connections->outlets; x=20; y=height-30; while(iolets) { binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), x, y, obj_issignaloutlet(iolets->object, iolets->index)?gensym("outlet~"):gensym("outlet")); x+=50; iolets=iolets->next; } if(save2file) { } else { binbuf_addv(b, "ssiiss;", gensym("#X"), gensym("restore"), X, Y, gensym("pd"), gensym(name)); } if(save2file) { /* save the binbuf to file */ char dirbuf[MAXPDSTRING]; const char*nameptr; char*nameptr_res; char objname[MAXPDSTRING]; int fd; int len=strlen(name) -3 ; unsigned int i; strncpy(objname, name, MAXPDSTRING-1); objname[MAXPDSTRING-1]=0; if(len>0 && len= 0) { sys_close(fd); nameptr_res[-1]='/'; if(!strcmp(dirbuf, name)) { strncpy(objname, nameptr_res, MAXPDSTRING-2); objname[strlen(nameptr_res)-3]=0; // strip away ".pd".extension } } binbuf_clear(b); binbuf_addv(b, "ssiis", gensym("#X"), gensym("obj"), X, Y, gensym(objname)); for(i=1; i<=maxdollarg; i++) { t_atom a; char dollstring[MAXPDSTRING]; snprintf(dollstring, MAXPDSTRING-1, "$%d", i); dollstring[MAXPDSTRING-1]=0; SETSYMBOL(&a, gensym(dollstring)); binbuf_add(b, 1, &a); } binbuf_addsemi(b); } binbuf_eval(b, 0,0,0); binbuf_free(b); s__X.s_thing = boundx; s__N.s_thing = boundn; /* the new object is the last in the parent's glist */ for(result=cnv->gl_list; result->g_next;) result=result->g_next; if(save2file_)*save2file_=save2file; return pd_checkglist(&(result->g_pd)); } static void canvas_patcherize(t_glist*cnv, t_symbol*s) { /* migrate selected objects from one canvas to another without re-instantiating them */ int dspstate = 0; int editFrom = 0; t_gobj*gobj = NULL, *last=NULL; int objcount=0; t_gobj**gobjs=0; t_glist*to; int i=0; int xpos=0, ypos=0; int xmin, ymin, xmax, ymax; int numins=0, numouts=0; t_patcherize_connections*connections; const char*name = 0; int save2file=0; int maxdollarg=0; if(NULL == cnv)return; xmin=ymin=INT_MAX; xmax=ymax=INT_MIN; if (s && s->s_name && *s->s_name) { name=s->s_name; save2file=1; } /* store all the selected objects. * this needs to be done because the GUI-cleanup in glist_suspend_editor() * will undo any selection... */ gobjs=getbytes(0*sizeof(*gobjs)); for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { if(glist_isselected(cnv, gobj)) { t_object*obj=pd_checkobject(&gobj->g_pd); if(!include_in_patcherization(obj)){ /* deselect excluded objects */ glist_deselect(cnv, gobj); continue; } if(obj) { int dollarg=get_maxdollarg(obj); int x=obj->te_xpix; int y=obj->te_ypix; xpos+=x; ypos+=y; update_minmax_i(x, &xmin, &xmax); update_minmax_i(y, &ymin, &ymax); if(dollarg>maxdollarg)maxdollarg=dollarg; } gobjs=resizebytes(gobjs, (objcount)*sizeof(*gobjs), (objcount+1)*sizeof(*gobjs)); gobjs[objcount]=gobj; objcount++; } } /* if nothing is selected, we are done... */ if(!objcount) { freebytes(gobjs,objcount * sizeof(*gobjs)); return; } if(1==objcount && patcherize_single_canvas(gobjs[0], name, save2file)) { post("single canvas patcherization"); } else { t_patcherize_connection*iolets; connections=get_connections(cnv); iolets=connections->inlets; if(!name)name="/*patcherized*/"; numins=0; while(iolets) { iolets=iolets->next; numins++; } iolets=connections->outlets; numouts=0; while(iolets) { iolets=iolets->next; numouts++; } dspstate=canvas_suspend_dsp(); /* disconnect the boundary connections */ patcherize_boundary_disconnect(connections->inlets); patcherize_boundary_disconnect(connections->outlets); /* create a new sub-patch to patcherize into */ to=patcherize_makesub(cnv, name, &save2file, xpos/objcount, ypos/objcount, xmin, ymin, xmax+50, ymax+150, cnv->gl_screenx1,cnv->gl_screeny1, connections, maxdollarg); if(!to) goto cleanup; editFrom=glist_suspend_editor(cnv); /* move the objects to the new subcanvas */ for(i=0; igl_list; gobj2; last=gobj2, gobj2=gobj2->g_next) { if (gobj == gobj2) { doit=1; break; } } if (!doit)continue; /* remove the object from the 'from'-canvas */ if (last) last->g_next = gobj->g_next; else cnv->gl_list = gobj->g_next; /* append it to the 'to'-canvas */ if(to->gl_list) { for(gobj2=to->gl_list; gobj2 && gobj2->g_next;) gobj2=gobj2->g_next; gobj2->g_next = gobj; } else { to->gl_list = gobj; } gobj->g_next = 0; } patcherize_fixcoordinates(objcount, gobjs, xmin, ymin); /* reconnect the boundary connections */ //print_conns("inlets :",connections->inlets); //print_conns("outlets:",connections->outlets); patcherize_boundary_reconnect(to, connections); } if(save2file) { object_typedmess(&to->gl_obj, gensym("menusave"), 0, 0); } canvas_dirty(cnv, 1); cleanup: /* cleanup */ free_connections(connections); freebytes(gobjs,objcount * sizeof(*gobjs)); /* restore state */ glist_resume_editor(cnv, editFrom); canvas_redraw(cnv); canvas_resume_dsp(dspstate); } void patcherize_setup(void) { if(NULL==canvas_class) { logpost(0, PD_VERBOSE, "patcherize detected class_new() @ %p", class_new); return; } //iemguts_boilerplate("patcherize - turn objects into a subpatch", 0); post("patcherize - turn objects into a subpatch"); if(NULL==zgetfn(&canvas_class, gensym("patcherize"))) class_addmethod(canvas_class, (t_method)canvas_patcherize, gensym("patcherize"), A_DEFSYM, 0); if(0) { print_glist(NULL); print_conns("", NULL); o2g(NULL); } } iem_utils-0.0.20240903/punish/pd-lib-builder/0000700000000000000000000000000014665566711015303 5ustar00iem_utils-0.0.20240903/punish/pd-lib-builder/CHANGELOG.txt0000600000000000000000000000740114665566711017337 0ustar00Changelog for Makefile.pdlibbuilder. v0.7.0, dated 2023-07-06 - build double-precision externals with the 'floatsize' variable - allow building multiple flavours of an external side-by-side (#78) - facilitate multiple platform co-installation of shared lib (#58) - fix use of shared.ldflags with helper-library (#64) - fix broken armv6l platform detection (#71) - improve documentation v0.6.0, dated 2019-12-21 - detect target platform (OS and architecture) rather than build platform (#55) - introduce optional user variable 'PLATFORM' for cross compilation - no longer build OSX/MacOS fat binaries by default (#21, #50) - do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS - fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6 v0.5.1, dated 2018-03-15 Fixes and improvements for Windows builds: - properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll - define default path of 32 bit Pd on 64 bit Windows - link C++ externals with standard C libs on Windows, they don't load otherwise - strip installed Windows binaries by default (issues #34, #39, #41, #42 respectively) Warning for all platforms: variable 'PD_PATH' is no longer supported, use the equivalent 'PDDIR'. v0.5.0, dated 2018-01-23 Implement target architecture detection for Windows builds, and set appropriate options for 32 and 64 bit (used to be for 32 bit only). (feature, issue #37 #38, merge commit 215bf3e) v0.4.4, dated 2016-11-22 Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}' (bugfix, issue #31, commit 2c14110) v0.4.3, dated 2016-11-02 Replace flags '-fpic' by 'fPIC'. (bugfix, issue #29, commit 426b38b) v0.4.2, dated 2016-10-30 Fix issue where incorrect message about m_pd.h is given. (bugfix, commit 2e13d8f) v0.4.1, dated 2016-10-27 Respect cflag for minimum OSX version when defined by lib makefile. (bugfix, pull request #22, commit 48c4127) v0.4.0, dated 2016-10-14 Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can also be defined in environment. (feature, issue #27, commit b0dab72) v0.3.1, dated 2016-10-13 Fix bug where pd.dll wouldn't be found. (bugfix, commit a0c87be) v0.3.0, dated 2016-10-09 Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility. (feature, issue #26, commit 41e9743) v0.2.8, dated 2016-10-09 Allow installed files to contain weird characters (notably '$'). (bugfix, pull request #20, commit 5b920b1) v0.2.7, dated 2016-10-04 Remove all default pd search paths except vanilla's. (discussion, issue #25, commit a6a89dc) v0.2.6, dated 2016-09-20 Redefined dependency checking so it won't stall rebuilds on OSX. (bugfix, issue #16, commit 9fd1795) v0.2.5, dated 2016-06-26 Fixed dependency checking for object files in other directories. (bugfix, commit f06e550) v0.2.4, dated 2016-06-25 Fixed regression bug that disabled all dependency checking. (bugfix, commit 1d7bb5e) v0.2.3, dated 2016-03-29 Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds. (bugfix, issue #16, commit eb614fd) v0.2.2, dated 2016-03-28 Removed target 'pre' because it forced rebuild of everything in 'all'. (bugfix, issue #17, commit c989c8e) v0.2.1, dated 2015-12-27 Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'. (bugfix, issue #5, commit 98f3582) v0.2.0, dated 2015-12-19 Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'. (feature, pull request #9, commit 3946ea5) v0.1.0, dated 2015-12-08 Added targets 'pre' and 'post' to automatically run before and after 'all'. (feature, pull request #4, commit a5678ac) v0.0.2, dated 2015-12-06 Improved methods for searching pd paths. (bugfix, commit ed37e6b) v0.0.1, dated 2015-10-31 Fixed expansion of variable 'lib.version'. (bugfix, issue #1, commit 974b617) v0.0.0, dated 2015-06-24 Initial version. (commit 16517a2) iem_utils-0.0.20240903/punish/pd-lib-builder/Makefile.pdlibbuilder0000600000000000000000000013145214665566711021413 0ustar00# Makefile.pdlibbuilder dated 2019-12-21 version = 0.7.0 # Helper makefile for Pure Data external libraries. # Written by Katja Vetter March-June 2015 for the public domain. No warranties. # Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's # ShakeNMake. # # Grab the newest version of Makefile.pdlibbuilder from # https://github.com/pure-data/pd-lib-builder/ # # GNU make version >= 3.81 required. # # #=== characteristics =========================================================== # # # - defines build settings based on autodetected OS and architecture # - defines rules to build Pd class- or lib executables from C or C++ sources # - defines rules for libdir installation # - defines convenience targets for developer and user # - evaluates implicit dependencies for non-clean builds # # #=== basic usage =============================================================== # # # In your Makefile, define your Pd lib name and class files, and include # Makefile.pdlibbuilder at the end of the Makefile. Like so: # # ________________________________________________________________________ # # # Makefile for mylib # # lib.name = mylib # # class.sources = myclass1.c myclass2.c # # datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt # # include Makefile.pdlibbuilder # ________________________________________________________________________ # # # For files in class.sources it is assumed that class basename == source file # basename. The default target builds all classes as individual executables # with Pd's default extension for the platform. For anything more than the # most basic usage, continue reading. # # #=== list of Makefile.pdlibbuilder API variables =============================== # # # Variables available for definition in your library Makefile: # # - lib.name # - lib.setup.sources # - class.sources # - common.sources # - shared.sources # - .class.sources # - .class.ldflags # - .class.ldlibs # - cflags # - ldflags # - ldlibs # - datafiles # - datadirs # - makefiles # - makefiledirs # - externalsdir # # Optional multiline defines evaluated per operating system: # # - forLinux # - forDarwin # - forWindows # # Variables available for your makefile or make command line: # # - make-lib-executable # - suppress-wunused # # Path variables for make command line or environment: # # - PDDIR # - PDINCLUDEDIR # - PDBINDIR # - PDLIBDIR # # Standard make variables for make command line or environment: # # - CPPFLAGS # - CFLAGS # - LDFLAGS # - CC # - CXX # - INSTALL # - STRIP # - DESTDIR # # Optional user variables for make command line or environment: # # - PLATFORM # - extension # - floatsize # # Deprecated path variables: # # - pdincludepath # - pdbinpath # - objectsdir # # #=== descriptions of Makefile.pdlibbuilder API variables ======================= # # # lib.name: # Name of the library directory as it will be installed / distributed. Also the # name of the lib executable in the case where all classes are linked into # a single binary. # # lib.setup.sources: # Source file(s) (C or C++) which must be compiled only when linking all classes # into a single lib binary. # # class.sources: # All sources files (C or C++) for which the condition holds that # class name == source file basename. # # .class.sources: # Source file(s) (C or C++) specific to class . Use this for # multiple-source classes or when class name != source file basename. # # common.sources: # Source file(s) which must be statically linked to each class in the library. # # shared.sources: # Source file(s) (C or C++) to build a shared dynamic link lib, to be linked # with all class executables. # # cflags, ldflags, ldlibs: # Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic # link libs) for the whole library. These flags are added to platform-specific # flags defined by Makefile.pdlibbuilder. # # .class.ldflags and .class.ldlibs: # Define ldflags resp. ldlibs specific to class . These flags are # added to platform-specific flags defined by Makefile.pdlibbuilder, and flags # defined in your Makefile for the whole library. Note: cflags can not be # defined per class in the current implementation. # # datafiles and datadirs: # All extra files you want to include in binary distributions of the # library: abstractions and help patches, example patches, meta patch, readme # and license texts, manuals, sound files, etcetera. Use 'datafiles' for all # files that should go into your lib rootdir and 'datadirs' for complete # directories you want to copy from source to distribution. # # forLinux, forDarwin, forWindows: # Shorthand for 'variable definitions for Linux only' etc. Use like: # define forLinux # cflags += -DLINUX # class.sources += linuxthing.c # endef # # makefiles and makefiledirs: # Extra makefiles or directories with makefiles that should be made in sub-make # processes. # # make-lib-executable: # When this variable is defined 'yes' in your makefile or as command argument, # Makefile.pdlibbuilder will try to build all classes into a single library # executable (but it will force exit if lib.setup.sources is undefined). # If your makefile defines 'make-lib-executable=yes' as the library default, # this can still be overridden with 'make-lib-executable=no' as command argument # to build individual class executables (the Makefile.pdlibbuilder default.) # # suppress-wunused: # When this variable is defined ('yes' or any other value), -Wunused-variable, # -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed, # but the other warnings from -Wall are retained. # # PDDIR: # Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and # PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. # # PDINCLUDEDIR: # Directory where Pd API m_pd.h should be found, and other Pd header files. # Overrides the default search path. # # PDBINDIR: # Directory where pd.dll should be found for linking (Windows only). Overrides # the default search path. # # PDLIBDIR: # Root directory for installation of Pd library directories. Overrides the # default install location. # # DESTDIR: # Prepended path component for staged install. # # PLATFORM: # Target platform for cross compilation in the form of GNU triplet: # cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that # pdlibbuilder will use, if installed and locatable. System and architecture # will then be autodefined accordingly. In most cases no other variables need to # be overridden. # # extension: # Extension for the external to use. Example: m_amd64 # A sane default is picked, but it is useful if you want to provide # co-installable externals for multiple platforms (for the same operating # systems) # # floatsize: # the size of the t_float in bits. Example: 32 # t_float are usually single precision (32bit), which is the default. # For double precision use floatsize=64 # When building double precision externals, you will want to set the extension # as well, e.g. extension=windows-amd64-64.dll (--.) # # CPPFLAGS: # Preprocessor flags which are not strictly required for building. # # CFLAGS: # Compiler flags which are not strictly required for building. Compiler flags # defined by Makefile.pdlibbuilder for warning, optimization and architecture # specification are overriden by CFLAGS. # # LDFLAGS: # Linker flags which are not strictly required for building. Linker flags # defined by Makefile.pdlibbuilder for architecture specification are overriden # by LDFLAGS. # # CC and CXX: # C and C++ compiler programs as defined in your build environment. # # INSTALL # Definition of install program. # # STRIP # Name of strip program. Default 'strip' can be overridden in cross compilation # environments. # # objectsdir: # Root directory for installation of Pd library directories, like PDLIBDIR but # not overridable by environment. Supported for compatibility with pd-extended # central makefile, but deprecated otherwise. # # pdincludepath, pdbinpath: # As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated # as user variables. # # #=== paths ===================================================================== # # # Source files in directories other than current working directory must be # prefixed with their relative path. Do not rely on VPATH or vpath. # Object (.o) files are built in the directory of their source files. # Executables are built in current working directory. # # Default search path for m_pd.h and other API header files is platform # dependent, and overridable by PDINCLUDEDIR: # # Linux: /usr/include/pd # # OSX: /Applications/Pd*.app/Contents/Resources/src # # Windows: %PROGRAMFILES%/Pd/src # %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows) # # Default search path for binary pd.dll (Windows), overridable by PDBINDIR # # %PROGRAMFILES%/Pd/bin # %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows) # # Default location to install pd libraries is platform dependent, and # overridable by PDLIBDIR: # # Linux: /usr/local/lib/pd-externals # OSX: ~/Library/Pd # Windows: %APPDATA%/Pd # # https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files # The rationale for not installing to ~/pd-externals by default on Linux # is that some people share the home dir between 32 and 64 bit installations. # # #=== targets =================================================================== # # # all: build $(executables) plus optional post target # post: target to build after $(executables) # alldebug: build all with -g option turned on for debug symbols # : force clean build of an individual class # .pre: make preprocessor output file in current working directory # .lst: make asm/source output file in current working directory # # install: install executables and data files # clean: remove build products from source tree # # help: print help text # vars: print makefile variables # allvars: print all variables # depend: print generated prerequisites # dumpmachine: print compiler output of option '-dumpmachine' # coffee: dummy target # # Variable $(executables) expands to class executables plus optional shared lib, # or alternatively to single lib executable when make-lib-executable=true. # Targets pre and post can be defined by library makefile. Make sure to include # Makefile.pdlibbuilder first so default target all will not be redefined. # # #=== Pd-extended libdir concept ================================================ # # # For libdir layout as conceived by Hans-Christoph Steiner, see: # # https://puredata.info/docs/developer/Libdir # # Files README.txt, LICENSE.txt and -meta.pd are part of the libdir # convention. Help patches for each class and abstraction are supposed to be # available. Makefile.pdlibbuilder does not force the presence of these files # however. It does not automatically include such files in libdir installations. # Data files you want to include in distributions must be defined explicitly in # your Makefile. # # #=== Makefile.pdlibbuilder syntax conventions ================================== # # # Makefile.pdlibbuilder variable names are lower case. Default make variables, # environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR) # are upper case. Use target 'allvars' to print all variables and their values. # # 'Fields' in data variables are separated by dots, like in 'foo.class.sources'. # Words in variables expressing a function or command are separated by dashes, # like in 'make-lib-executable'. # # #=== useful make options ======================================================= # # # Use 'make -d ' to print debug details of the make process. # Use 'make -p ' to print make's database. # # #=== TODO ====================================================================== # # # - decide whether to use -static-libgcc or shared dll in MinGW # - cygwin support # - android support # - figure out how to handle '$' in filenames # - add makefile template targets dpkg-source dist libdir distclean tags? # # #=== end of documentation sections ============================================= # # ################################################################################ ################################################################################ ################################################################################ # GNU make version 3.81 (2006) or higher is required because of the following: # - function 'info' # - variable '.DEFAULT_GOAL' # force exit when make version is < 3.81 ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81) $(error GNU make version 3.81 or higher is required) endif # Relative path to externals root dir in multi-lib source tree like # pd-extended SVN. Default is parent of current working directory. May be # defined differently in including makefile. externalsdir ?= .. # variable you can use to check if Makefile.pdlibbuilder is already included Makefile.pdlibbuilder = true ################################################################################ ### target platform detection ################################################## ################################################################################ #=== target platform =========================================================== # PLATFORM: optional user variable to define target platform for cross # compilation. Redefine build tools accordingly. PLATFORM should match # the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32, # x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes # will get the same. ifneq ($(PLATFORM),) ifneq ($(findstring darwin, $(PLATFORM)),) export CC = $(PLATFORM)-cc export CXX = $(PLATFORM)-c++ export CPP = $(PLATFORM)-cc else export CC = $(PLATFORM)-gcc export CXX = $(PLATFORM)-g++ export CPP = $(PLATFORM)-cpp endif STRIP = $(PLATFORM)-strip endif # Let (native or cross-) compiler report target triplet and isolate individual # words therein to facilitate later processing. target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine)) #=== operating system ========================================================== # The following systems are defined: Linux, Darwin, Windows. GNU and # GNU/kFreeBSD are treated as Linux to get the same options. ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),) system = Linux endif ifneq ($(filter darwin%, $(target.triplet)),) system = Darwin endif ifneq ($(filter mingw% cygwin%, $(target.triplet)),) system = Windows endif # evaluate possible system-specific multiline defines from library makefile $(eval $(for$(system))) # TODO: Cygwin, Android #=== architecture ============================================================== # The following CPU names can be processed by pdlibbuilder: # i*86 Intel 32 bit # x86_64 Intel 64 bit # arm ARM 32 bit # aarch64 ARM 64 bit target.arch := $(firstword $(target.triplet)) ################################################################################ ### variables per platform ##################################################### ################################################################################ #=== flags per floatsize == ==================================================== floatsize = 32 ifneq ($(filter-out 32,$(floatsize)),) floatsize.flags = -DPD_FLOATSIZE=$(floatsize) else floatsize.flags = endif #=== flags per architecture ==================================================== # Set architecture-dependent cflags, mainly for Linux. For Mac and Windows, # arch.c.flags are overriden below. To see gcc's default architecture flags: # $ gcc -Q --help=target # ARMv6: Raspberry Pi 1st gen, not detectable from target.arch ifeq ($(shell uname -m), armv6l) arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard # ARMv7: Beagle, Udoo, RPi2 etc. else ifeq ($(target.arch), arm) arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard # ARMv8 64 bit, not tested yet else ifeq ($(target.arch), aarch64) arch.c.flags = -mcpu=cortex-a53 # Intel 32 bit, build with SSE and SSE2 instructions else ifneq ($(filter i%86, $(target.arch)),) arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2 # Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions else ifeq ($(target.arch), x86_64) arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3 # if none of the above architectures detected else arch.c.flags = endif #=== flags and paths for Linux ================================================= ifeq ($(system), Linux) prefix = /usr/local libdir := $(prefix)/lib pkglibdir = $(libdir)/pd-externals pdincludepath := $(wildcard /usr/include/pd) extension = pd_linux cpp.flags := -DUNIX c.flags := -fPIC c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags c.ldlibs := -lc -lm cxx.flags := -fPIC -fcheck-new cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags cxx.ldlibs := -lc -lm -lstdc++ shared.extension = so shared.ldflags = -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib) endif #=== flags and paths for Darwin ================================================ # LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when # compiling with g++. ifeq ($(system), Darwin) pkglibdir = $(HOME)/Library/Pd pdincludepath := $(firstword $(wildcard \ /Applications/Pd*.app/Contents/Resources/src)) extension = pd_darwin cpp.flags := -DUNIX -DMACOSX -I /sw/include c.flags := c.ldflags := -undefined suppress -flat_namespace -bundle c.ldlibs := -lc cxx.ldflags := -undefined suppress -flat_namespace -bundle cxx.ldlibs := -lc shared.extension = dylib shared.ldflags = -dynamiclib -undefined dynamic_lookup \ -install_name @loader_path/$(shared.lib) \ -compatibility_version 1 -current_version 1.0 ifneq ($(filter %g++, $(CXX)),) cxx.flags := -fcheck-new endif ifeq ($(extension), d_fat) arch := i386 x86_64 else arch := $(target.arch) endif ifneq ($(filter -mmacosx-version-min=%, $(cflags)),) version.flag := $(filter -mmacosx-version-min=%, $(cflags)) else version.flag = -mmacosx-version-min=10.6 endif arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag) arch.ld.flags := $(arch.c.flags) endif #=== flags and paths for Windows =============================================== # Standard paths on Windows contain spaces, and GNU make functions treat such # paths as lists, with unintended effects. Therefore we must use shell function # ls instead of make's wildcard when probing for a path, and use double quotes # when specifying a path in a command argument. # Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard # location for builds with native architecture, 'ProgramFiles(x86)' for i686 # builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces # required because of parentheses in variable name. ifeq ($(system), Windows) pkglibdir := $(APPDATA)/Pd ifeq ($(target.arch), i686) programfiles := ${ProgramFiles(x86)} else programfiles := $(PROGRAMFILES) endif pdbinpath := $(programfiles)/Pd/bin pdincludepath := $(programfiles)/Pd/src endif # Store default path to pd.dll in PDBINDIR if the latter is not user-defined. # For include path this is done in the platform-independent paths section below, # but for PDBINDIR it is done here so ld flags can be evaluated as immediate # variables. ifeq ($(system), Windows) ifdef PDDIR PDBINDIR := $(PDDIR)/bin endif PDBINDIR ?= $(pdbinpath) endif # TODO: decide whether -mms-bitfields should be specified. ifeq ($(system), Windows) cpp.flags := -DMSW -DNT ifeq ($(target.arch), i686) arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse else ifeq ($(target.arch), x86_64) cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64 arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse else arch.c.flags = endif extension = dll c.flags := c.ldflags := -static-libgcc -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" c.ldlibs := cxx.flags := -fcheck-new cxx.ldflags := -static-libgcc -static-libstdc++ -shared \ -Wl,--enable-auto-import "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" cxx.ldlibs := shared.extension = dll shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll" stripflags = --strip-all endif #=== paths ===================================================================== # Platform-dependent default paths are specified above, but overridable. # Path variables in upper case can be defined as make command argument or in the # environment. Variable 'objectsdir' is supported for compatibility with # the build system that pd-l2ork has inherited from pd-extended. PDINCLUDEDIR ?= $(pdincludepath) PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir)) ifdef PDDIR PDINCLUDEDIR := $(wildcard $(PDDIR)/src) endif # base path where all components of the lib will be installed by default installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name) # check if include path contains spaces (as is often the case on Windows) # if so, store the path so we can later do checks with it pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR)) #=== accumulated build flags =================================================== # From GNU make docs: 'Users expect to be able to specify CFLAGS freely # themselves.' So we use CFLAGS to define options which are not strictly # required for compilation: optimizations, architecture specifications, and # warnings. CFLAGS can be safely overriden using a make command argument. # Variables cflags, ldflags and ldlibs may be defined in including makefile. optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing # suppress -Wunused-variable & Co if you don't want to clutter a build log ifdef suppress-wunused warn.flags += $(addprefix -Wno-unused-, function parameter value variable) endif CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags) # preprocessor flags cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(floatsize.flags) $(cpp.flags) $(CPPFLAGS) # flags for dependency checking (cflags from makefile may define -I options) depcheck.flags := $(cpp.flags) $(cflags) # architecture specifications for linker are overridable by LDFLAGS LDFLAGS := $(arch.ld.flags) # now add the same ld flags to shared dynamic lib shared.ldflags += $(LDFLAGS) # accumulated flags for C compiler / linker c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS) c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS) c.ldlibs := $(c.ldlibs) $(ldlibs) # accumulated flags for C++ compiler / linker cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS) cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS) cxx.ldlibs := $(cxx.ldlibs) $(ldlibs) ################################################################################ ### variables: library name and version ######################################## ################################################################################ # strip possibles spaces from lib.name, they mess up calculated file names lib.name := $(strip $(lib.name)) # if meta file exists, check library version metafile := $(wildcard $(lib.name)-meta.pd) ifdef metafile lib.version := $(shell sed -n \ 's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \ $(metafile)) endif ################################################################################ ### variables: files ########################################################### ################################################################################ object.extension = $(extension).o #=== sources =================================================================== # (re)define .class.sources using file names in class.sources define add-class-source $(notdir $(basename $v)).class.sources += $v endef $(foreach v, $(class.sources), $(eval $(add-class-source))) # derive class names from .class.sources variables sourcevariables := $(filter %.class.sources, $(.VARIABLES)) classes := $(basename $(basename $(sourcevariables))) # accumulate all source files specified in makefile classes.sources := $(sort $(foreach v, $(sourcevariables), $($v))) all.sources := $(classes.sources) $(lib.setup.sources) \ $(shared.sources) $(common.sources) #=== object files ============================================================== # construct object filenames from all C and C++ source file names classes.objects := $(addsuffix .$(object.extension), $(basename $(classes.sources))) common.objects := $(addsuffix .$(object.extension), $(basename $(common.sources))) shared.objects := $(addsuffix .$(object.extension), $(basename $(shared.sources))) lib.setup.objects := $(addsuffix .$(object.extension), $(basename $(lib.setup.sources))) all.objects = $(classes.objects) $(common.objects) $(shared.objects) \ $(lib.setup.objects) #=== executables =============================================================== # construct class executable names from class names classes.executables := $(addsuffix .$(extension), $(classes)) # Construct shared lib executable name if shared sources are defined. # If extension does not end with shared extension, use both to facilitate co- # installation for different platforms, like .m_i386.dll and .linux-amd64-32.so ifdef shared.sources ifneq ($(filter %.$(shared.extension), .$(extension)), ) # $(extension) already ends with $(shared.extension), no need to duplicate it shared.lib = lib$(lib.name).$(extension) else shared.lib = lib$(lib.name).$(extension).$(shared.extension) endif else shared.lib := endif ################################################################################ ### variables: tools ########################################################### ################################################################################ # aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument compile-c := $(CC) compile-cxx := $(CXX) ################################################################################ ### checks ##################################################################### ################################################################################ # At this point most variables are defined. Now do some checks and info's # before rules begin. # print Makefile.pdlibbuilder version before possible termination $(info ++++ info: using Makefile.pdlibbuilder version $(version)) # Terminate if target triplet remained empty, to avoid all sorts of confusing # scenarios and spurious bugs. ifeq ($(target.triplet),) $(error Command "$(CC) -dumpmachine" did not return a target triplet, \ needed for a build. \ Is compiler "$(CC)" installed in your PATH? ($(PATH)). \ Does compiler "$(CC)" support option "-dumpmachine"?) endif # 'forward declaration' of default target, needed to do checks all: # To avoid unpredictable results, make sure the default target is not redefined # by including makefile. ifneq ($(.DEFAULT_GOAL), all) $(error Default target must be 'all'.) endif # find out which target(s) will be made ifdef MAKECMDGOALS goals := $(MAKECMDGOALS) else goals := all endif # store path to Pd API m_pd.h if it is found ifdef PDINCLUDEDIR mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h") endif # store path to pd.dll; if not found, ls will give a useful error ifeq ($(system), Windows) pddll := $(shell ls "$(PDBINDIR)/pd$(filter-out 32,$(floatsize)).dll") endif # when making target all, check if m_pd.h is found and print info about it ifeq ($(goals), all) $(if $(mpdh), \ $(info ++++ info: using Pd API $(mpdh)), \ $(warning Where is Pd API m_pd.h? Do 'make help' for info.)) endif # print target info $(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name))) # when installing, print installpath info $(if $(filter install install-lib, $(goals)), $(info ++++ info: \ installpath is '$(installpath)')) #=== define executables ======================================================== # By default we build class executables, and optionally a shared dynamic link # lib. When make-lib-executable=yes we build all classes into a single lib # executable, on the condition that variable lib.setup.sources is defined. ifeq ($(make-lib-executable),yes) $(if $(lib.setup.sources), ,\ $(error Can not build library blob because lib.setup.sources is undefined)) executables := $(lib.name).$(extension) else executables := $(classes.executables) $(shared.lib) endif ################################################################################ ### rules: special targets ##################################################### ################################################################################ # Disable built-in rules. If some target can't be built with the specified # rules, it should not be built at all. MAKEFLAGS += --no-builtin-rules .PRECIOUS: .SUFFIXES: .PHONY: all post build-lib \ $(classes) $(makefiledirs) $(makefiles) \ install install-executables install-datafiles install-datadirs \ force clean vars allvars depend help ################################################################################ ### rules: build targets ####################################################### ################################################################################ # Target all forces the build of targets [$(executables) post] in # deterministic order. Target $(executables) builds class executables plus # optional shared lib or alternatively a single lib executable when # make-lib-executable=true. Target post is optionally defined by # library makefile. all: post post: $(executables) all: $(info ++++info: target all in lib $(lib.name) completed) # build all with -g option turned on for debug symbols alldebug: c.flags += -g alldebug: cxx.flags += -g alldebug: all #=== class executable ========================================================== # recipe for linking objects in class executable # argument $1 = compiler type (c or cxx) # argument $2 = class basename define link-class $(compile-$1) \ $($1.ldflags) $($2.class.ldflags) \ -o $2.$(extension) \ $(addsuffix .$(object.extension), $(basename $($2.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) \ $($1.ldlibs) $($2.class.ldlibs) $(shared.lib) endef # general rule for linking object files in class executable %.$(extension): $(shared.lib) $(info ++++ info: linking objects in $@ for lib $(lib.name)) $(if $(filter %.cc %.cpp, $($*.class.sources)), \ $(call link-class,cxx,$*), \ $(call link-class,c,$*)) #=== library blob ============================================================== # build all classes into single executable build-lib: $(lib.name).$(extension) $(info ++++ info: library blob $(lib.name).$(extension) completed) # recipe for linking objects in lib executable # argument $1 = compiler type (c or cxx) define link-lib $(compile-$1) \ $($1.ldflags) $(lib.ldflags) \ -o $(lib.name).$(extension) $(all.objects) \ $($1.ldlibs) $(lib.ldlibs) endef # rule for linking objects in lib executable # declared conditionally to avoid name clashes ifeq ($(make-lib-executable),yes) $(lib.name).$(extension): $(all.objects) $(if $(filter %.cc %.cpp, $(all.sources)), \ $(call link-lib,cxx), \ $(call link-lib,c)) endif #=== shared dynamic lib ======================================================== # recipe for linking objects in shared executable # argument $1 = compiler type (c or cxx) define link-shared $(compile-$1) \ $(shared.ldflags) \ -o $(shared.lib) $(shared.objects) \ $($1.ldlibs) $(shared.ldlibs) endef # rule for linking objects in shared executable # build recipe is in macro 'link-shared' $(shared.lib): $(shared.objects) $(info ++++ info: linking objects in shared lib $@) $(if $(filter %.cc %.cpp, $(shared.sources)), \ $(call link-shared,cxx), \ $(call link-shared,c)) #=== object files ============================================================== # recipe to make .o file from source # argument $1 is compiler type (c or cxx) define make-object-file $(info ++++ info: making $@ in lib $(lib.name)) $(compile-$1) \ $($1.flags) \ -o $@ -c $< endef # Three rules to create .o files. These are double colon 'terminal' rules, # meaning they are the last in a rules chain. %.$(object.extension):: %.c $(call make-object-file,c) %.$(object.extension):: %.cc $(call make-object-file,cxx) %.$(object.extension):: %.cpp $(call make-object-file,cxx) #=== explicit prerequisites for class executables ============================== # For class executables, prerequisite rules are declared in run time. Target # 'depend' prints these rules for debugging purposes. # declare explicit prerequisites rule like 'class: class.extension' # argument $v is class basename define declare-class-target $v: $v.$(extension) endef # declare explicit prerequisites rule like 'class.extension: object1.o object2.o' # argument $v is class basename define declare-class-executable-target $v.$(extension): $(addsuffix .$(object.extension), $(basename $($v.class.sources))) \ $(addsuffix .$(object.extension), $(basename $(common.sources))) endef # evaluate explicit prerequisite rules for all classes $(foreach v, $(classes), $(eval $(declare-class-target))) $(foreach v, $(classes), $(eval $(declare-class-executable-target))) #=== implicit prerequisites for class executables ============================== # Evaluating implicit prerequisites (header files) with help from the # preprocessor is 'expensive' so this is done conditionally and selectively. # Note that it is also possible to trigger a build via install targets, in # which case implicit prerequisites are not checked. # When the Pd include path contains spaces it will mess up the implicit # prerequisites rules. disable-dependency-tracking := $(strip $(pdincludepathwithspaces)) ifndef disable-dependency-tracking must-build-everything := $(filter all, $(goals)) must-build-class := $(filter $(classes), $(goals)) must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources)) endif # declare implicit prerequisites rule like 'object.o: header1.h header2.h ...' # argument $1 is input source file(s) # dir is explicitly added because option -MM strips it by default define declare-object-target $(dir $1)$(patsubst %.o:,%.$(object.extension):,$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1))) $(MAKEFILE_LIST) endef # evaluate implicit prerequisite rules when rebuilding everything ifdef must-build-everything $(if $(wildcard $(all.objects)), \ $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \ $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v)))) endif # evaluate implicit prerequisite rules when selectively building classes ifdef must-build-class $(foreach v, $(must-build-sources), \ $(eval $(call declare-object-target, $v))) $(foreach v, $(shared.sources), \ $(eval $(call declare-object-target, $v))) endif ################################################################################ ### rules: preprocessor and assembly files ##################################### ################################################################################ # Preprocessor and assembly output files for bug tracing etc. They are not part # of the build processes for executables. By default these files are created in # the current working directory. Dependency tracking is not performed, the build # is forced instead to make sure it's up to date. force: #=== preprocessor file ========================================================= # make preprocessor output file with extension .pre # argument $1 = compiler type (c or cxx) define make-preprocessor-file $(info ++++ info: making preprocessor output file $(notdir $*.pre) \ in current working directory) $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre) endef %.pre:: %.c force $(call make-preprocessor-file,c) %.pre:: %.cc force $(call make-preprocessor-file,cxx) %.pre:: %.cpp force $(call make-preprocessor-file,cxx) #=== assembly file ============================================================= # make C / assembly interleaved output file with extension .lst # argument $1 = compiler type (c or cxx) define make-assembly-file $(info ++++ info: making assembly output file $(notdir $*.lst) \ in current working directory) $(compile-$1) \ -c -Wa,-a,-ad -fverbose-asm \ $($1.flags) \ $< > $(notdir $*.lst) endef %.lst:: %.c force $(call make-assembly-file,c) %.lst:: %.cc force $(call make-assembly-file,cxx) %.lst:: %.cpp force $(call make-assembly-file,cxx) ################################################################################ ### rules: installation targets ################################################ ################################################################################ #=== strip ===================================================================== # Stripping of installed binaries will only be done when variable 'stripflags' # is defined non-empty. No default definition is provided except for Windows # where the unstripped binaries are large, especially in the case of Mingw-w64. # Note: while stripping all symbols ('-s' or '--strip-all') is possible for # Linux and Windows, in the case of OSX only non-global symbols can be stripped # (option '-x' or '--discard-all'). # Make definition of strip command overridable so it can be defined in an # environment for cross-compilation. STRIP ?= strip # Commands in 'strip-executables' will be executed conditionally in the rule for # target 'install-executables'. strip-executables = cd "$(installpath)" && \ $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';) #=== install =================================================================== # Install targets depend on successful exit status of target all because nothing # must be installed in case of a build error. # -p = preserve time stamps # -m = set permission mode (as in chmod) # -d = create all components of specified directories INSTALL = install INSTALL_PROGRAM := $(INSTALL) -p -m 644 INSTALL_DATA := $(INSTALL) -p -m 644 INSTALL_DIR := $(INSTALL) -m 755 -d # strip spaces from file names executables := $(strip $(executables)) datafiles := $(strip $(datafiles)) datadirs := $(strip $(datadirs)) # Do not make any install sub-target with empty variable definition because the # install program would exit with an error. install: $(if $(executables), install-executables) install: $(if $(datafiles), install-datafiles) install: $(if $(datadirs), install-datadirs) install-executables: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(executables), \ $(INSTALL_PROGRAM) '$v' "$(installpath)";) $(info ++++ info: executables of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) $(if $(stripflags), $(strip-executables),) install-datafiles: all $(INSTALL_DIR) -v "$(installpath)" $(foreach v, $(datafiles), \ $(INSTALL_DATA) '$(v)' "$(installpath)";) $(info ++++ info: data files of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) install-datadirs: all $(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";) $(foreach v, $(datadirs), \ $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";) $(info ++++ info: data directories of lib $(lib.name) installed \ from $(CURDIR) to $(installpath)) ################################################################################ ### rules: distribution targets ################################################ ################################################################################ # TODO # These targets are implemented in Makefile Template, but I have to figure out # how to do it under the not-so-strict conditions of Makefile.pdlibbuilder. # make source package dist: @echo "target dist not yet implemented" # make Debian source package dpkg-source: @echo "target dpkg-source not yet implemented" $(ORIGDIR): $(DISTDIR): ################################################################################ ### rules: clean targets ####################################################### ################################################################################ # delete build products from build tree clean: rm -f $(all.objects) rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib) rm -f *.pre *.lst # remove distribution directories and tarballs from build tree distclean: clean @echo "target distclean not yet implemented" ################################################################################ ### rules: submake targets ##################################################### ################################################################################ # Iterate over sub-makefiles or makefiles in other directories. # When 'continue-make=yes' is set, sub-makes will report 'true' to the parent # process regardless of their real exit status. This prevents the parent make # from being aborted by a sub-make error. Useful when you want to quickly find # out which sub-makes from a large set will succeed. ifeq ($(continue-make),yes) continue = || true endif # These targets will trigger sub-make processes for entries in 'makefiledirs' # and 'makefiles'. all alldebug install clean distclean dist dkpg-source: \ $(makefiledirs) $(makefiles) # this expands to identical rules for each entry in 'makefiledirs' $(makefiledirs): $(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue) # this expands to identical rules for each entry in 'makefiles' $(makefiles): $(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue) ################################################################################ ### rules: convenience targets ################################################# ################################################################################ #=== show variables ============================================================ # Several 'function' macro's cause errors when expanded within a rule or without # proper arguments. Variables which are set with the define directive are only # shown by name for that reason. functions = \ add-class-source \ declare-class-target \ declare-class-executable-target \ declare-object-target \ link-class \ link-lib \ link-shared \ make-object-file \ make-preprocessor-file \ make-assembly-file # show variables from makefiles vars: $(info ++++ info: showing makefile variables:) $(foreach v,\ $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\ $(if $(filter file, $(origin $v)),\ $(info variable $v = $($v)))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo # show all variables allvars: $(info ++++ info: showing default, automatic and makefile variables:) $(foreach v, \ $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \ $(info variable ($(origin $v)) $v = $($v))) $(foreach v, $(functions), $(info 'function' name: $v)) @echo #=== show dependencies ========================================================= # show generated prerequisites rules depend: $(info ++++ info: generated prerequisite rules) $(foreach v, $(classes), $(info $(declare-class-target))) $(foreach v, $(classes), $(info $(declare-class-executable-target))) $(foreach v, $(all.sources), $(info $(call declare-object-target, $v))) @echo #=== show help text ============================================================ # brief info about targets and paths ifdef mpdh mpdhinfo := $(mpdh) else mpdhinfo := m_pd.h was not found. Is Pd installed? endif help: @echo @echo " Main targets:" @echo " all: build executables (default target)" @echo " install: install all components of the library" @echo " vars: print makefile variables for troubleshooting" @echo " allvars: print all variables for troubleshooting" @echo " help: print this help text" @echo @echo " Pd API m_pd.h:" @echo " $(mpdhinfo)" @echo " You may specify your preferred Pd include directory as argument" @echo " to the make command, like 'PDINCLUDEDIR=path/to/pd/src'." @echo @echo " Path for installation of your libdir(s):" @echo " $(PDLIBDIR)" @echo " Alternatively you may specify your path for installation as argument" @echo " to the make command, like 'PDLIBDIR=path/to/pd-externals'." @echo @echo " Default paths are listed in the doc sections in Makefile.pdlibbuilder." @echo #=== platform test ============================================================= # This target can be used to test if the compiler for specified PLATFORM is # correctly defined and available. dumpmachine: @$(CC) -dumpmachine #=== dummy target ============================================================== coffee: @echo "Makefile.pdlibbuilder: Can not make coffee. Sorry." ################################################################################ ### end of rules sections ###################################################### ################################################################################ # for syntax highlighting in vim and github # vim: set filetype=make: iem_utils-0.0.20240903/punish/pd-lib-builder/README.md0000600000000000000000000001314614665566711016571 0ustar00 ### Makefile.pdlibbuilder ### Helper makefile for Pure Data external libraries. Written by Katja Vetter March-June 2015 for the public domain and since then developed as a Pd community project. No warranties. Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's ShakeNMake. GNU make version >= 3.81 required. ### characteristics ### * defines build settings based on autodetected target platform * defines rules to build Pd class- or lib executables from C or C++ sources * defines rules for libdir installation * defines convenience targets for developer and user * evaluates implicit dependencies for non-clean builds ### basic usage ### In your Makefile, define your Pd lib name and class files, and include Makefile.pdlibbuilder at the end of the Makefile. Like so: # Makefile for mylib lib.name = mylib class.sources = myclass1.c myclass2.c datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder For files in class.sources it is assumed that class name == source file basename. The default target builds all classes as individual executables with Pd's default extension for the platform. For anything more than the most basic usage, read the documentation sections in Makefile.pdlibbuilder. ### paths ### Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be defined not only as make command argument but also in the environment, to override platform-dependent defaults: PDDIR: Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin. PDINCLUDEDIR: Directory where Pd API m_pd.h should be found, and other Pd header files. Overrides the default search path. PDBINDIR: Directory where pd.dll should be found for linking (Windows only). Overrides the default search path. PDLIBDIR: Root directory for installation of Pd library directories. Overrides the default install location. ### platform detection and predefined variables ### Makefile.pdlibbuilder tries to detect architecture and operating system in order to define platform-specific variables. Since v0.6.0 we let the compiler report target platform, rather than taking the build machine as reference. This simplifies cross compilation. The kind of build options that are predefined: - optimizations useful for realtime DSP processing - options strictly required for the platform - options to make the build work accross a range of CPU's and OS versions The exact choice and definition predefined variables changes over time, as new platforms arrive and older platforms become obsolete. The easiest way to get an overview for your platform is by checking the flags categories in the output of target `vars`. Variables written in capitals (like `CFLAGS`) are intentionally exposed as user variables, although technically all makefile variables can be overridden by make command arguments. ### specific language versions ### Makefile.pdlibbuilder handles C and C++, but can not detect if your code uses features of a specific version (like C99, C++11, C++14 etc.). In such cases your makefile should specify that version as compiler option: cflags = -std=c++11 Also you may need to be explicit about minimum OSX version. For example, C++11 needs OSX 10.9 or higher: define forDarwin cflags = -mmacosx-version-min=10.9 endef ### documentation ### This README.md provides only basic information. A large comment section inside Makefile.pdlibbuilder lists and explains the available user variables, default paths, and targets. The internal documentation reflects the exact functionality of the particular version. For suggestions about project maintenance and advanced compilation see tips-tricks.md. ### versioning ### The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org), and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers are invited to regulary check for updates, and to contribute and discuss improvements here. If you really need to distribute a personalized version with your library, rename Makefile.pdlibbuilder to avoid confusion. ### examples ### The list of projects using pd-lib-builder can be helpful if you are looking for examples, from the simplest use case to more complex implementations. - helloworld: traditional illustration of simplest use case - pd-windowing: straightforward real world use case of a small library - pd-nilwind / pd-cyclone: more elaborate source tree - zexy: migrated from autotools to pd-lib-builder ### projects using pd-lib-builder ### non-exhaustive list https://github.com/pure-data/helloworld https://github.com/electrickery/pd-nilwind https://github.com/electrickery/pd-maxlib https://github.com/electrickery/pd-sigpack https://github.com/electrickery/pd-tof https://github.com/electrickery/pd-windowing https://github.com/electrickery/pd-smlib https://github.com/porres/pd-cyclone https://github.com/porres/pd-else https://github.com/porres/pd-psycho https://git.iem.at/pd/comport https://git.iem.at/pd/hexloader https://git.iem.at/pd/iemgui https://git.iem.at/pd/iemguts https://git.iem.at/pd/iemlib https://git.iem.at/pd/iemnet https://git.iem.at/pd/iem_ambi https://git.iem.at/pd/iem_tab https://git.iem.at/pd/iem_adaptfilt https://git.iem.at/pd/iem_roomsim https://git.iem.at/pd/iem_spec2 https://git.iem.at/pd/mediasettings https://git.iem.at/pd/zexy https://git.iem.at/pd-gui/punish https://github.com/residuum/PuRestJson https://github.com/libpd/abl_link https://github.com/wbrent/timbreID https://github.com/MetaluNet/moonlib iem_utils-0.0.20240903/punish/pd-lib-builder/tips-tricks.md0000600000000000000000000002101214665566711020077 0ustar00pd-lib-builder cheatsheet ========================= # Creating special builds ## Building for non-native platform Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a target triplet for cross-compilation. Assuming a W32 package for Pd is unzipped into path `${PDWIN32}`, to build for Windows 32 bit: make PLATFORM=i686-w64-mingw32 PDDIR="${PDWIN32}" #### Older pd-lib-builder versions Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would instead override variables `system`, `target.arch`, `CC` and / or `CXX`, `STRIP`. Example: make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}" #### Toolchains To build for non-native OS and/or architecture you need a cross toolchain. On Linux such toolchains are relatively easy to get. For example Debian Buster amd64 provides them for the following platforms (install g++ with dependencies for a given platform to get the whole toolchain): - `arm-linux-gnueabihf` - `aarch64-linux-gnu` - `i686-linux-gnu` - `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`) Cross toolchains for OSX/MacOS are not generally distributed. Project `osxcross` from Thomas Poechtraeger can create them for Linux. ## Universal binaries on macOS The compiler, by default, builds for the native architecture of the build machine. To make a "universal" multi-arch build, specify the desired archtectures on the command line using the "arch" pd-lib-builder Makefile variable. For example, to build a "fat" external for both 64-bit Intel and Arm (Apple Silicon): make arch="x86_64 arm64" If the build is successful, the compiled architectures in the built external can be confirmed via the `file` command: ~~~sh % file vbap.pd_darwin vbap.pd_darwin: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit bundle x86_64] [arm64:Mach-O 64-bit bundle arm64] vbap.pd_darwin (for architecture x86_64): Mach-O 64-bit bundle x86_64 vbap.pd_darwin (for architecture arm64): Mach-O 64-bit bundle arm64 ~~~ Note: The available architectures depend on which macOS version & command line tools/Xcode combination the build system has. For example, any newer macOS 10.15+ will support both x86_64 (Intel 64-bit) and arm64 (Apple Silicon) while OSX 10.6 - macOS 10.14 can build for x86_64 and i386 (Intel 32-bit). ## Building double-precision externals At the time of writing (2023-07-06) there is no official Pd that supports double-precision numbers yet. However, if you do get hold of an experimental double-precision Pd, you can easily build your externals for 64-bit numbers, by passing `floatsize=64` as an argument to `make`. Starting with Pd>=0.54, double precision externals use different extensions from traditional (single-precision) externals. The extension consists of the OS ("linux", "darwin", "windows"), the CPU architecture ("amd64" (x86_64), "i386" (x86), "arm64",...) and the floatsize in bits ("64" for double-precision), followed by the system's native extension for dynamic libraries (".dll" on Windows, ".so" on macOS/Linux/un*xes). As of pd-lib-builder==0.7.0, you have to manually pass this extension: make floatsize=64 extension=windows-amd64-64.dll make floatsize=64 extension=linux-arm64-64.so make floatsize=64 extension=darwin-fat-64.so arch="x86_64 arm64" # Project management In general it is advised to put the `Makefile.pdlibbuilder` into a separate subdirectory (e.g. `pd-lib-builder/`). This makes it much easier to update the `Makefile.pdlibbuilder` later You *should* also use a variable to the actual path of the Makefile.pdlibbuilder (even if you keep it in the root-directory), as this allows easy experimenting with newer (or older) (or site-specific) versions of the pd-lib-builder Makefile. ~~~make PDLIBBUILDER_DIR=pd-lib-builder/ include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder ~~~ ## Keeping pd-lib-builder up-to-date ### `git subtree` With git-subtrees, you make the pd-lib-builder repository (or any other repository for that matter) part of your own repository - with full history and everything - put nicely into a distinct subdirectory. Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012). The nice thing however is, that from "outside" the subtree is part of your repository like any other directory. E.g. older versions of Git can clone your repository with the full subtree (and all it's history) just fine. You can also use git-archive to make a complete snapshot of your repository (including the subtree) - nice, if you e.g. want self-contained downloads of your project from git hosting platforms (like Github, Gitlab, Bitbucket,...) In short, `git subtree` is the better `git submodule`. So here's how to do it: #### Initial setup/check-out This will create a `pd-lib-builder/` directory containing the full history of the pd-lib-builder repository up to its release `v0.5.0` ~~~sh git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0 ~~~ This will automatically merge the `pd-lib-builder/` history into your current branch, so everything is ready to go. #### Cloning your repository with the subtree Nothing special, really. Just clone your repository as always: ~~~sh git clone https://git.example.org/pd/superbonk~.git ~~~ #### Updating the subtree Time passes and sooner or later you will find, that there is a shiny new pd-lib-builder with plenty of bugfixes and new features. To update your local copy to pd-lib-builder's current `master`, simply run: ~~~sh git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master ~~~ #### Pulling the updated subtree into existing clones Again, nothing special. Just pull as always: ~~~sh git pull ~~~ #### Further reading More on the power of `git subtree` can be found online - https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree - ... ### ~~`git submodule`~~ [DISCOURAGED] #### Initial setup/check-out To add a new submodule to your repository, just run `git submodule add` and commit the changes: ~~~sh git submodule add https://github.com/pure-data/pd-lib-builder git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule" ~~~ #### Cloning your repository with the submodule When doing a fresh clone of your repository, pass the `--recursive` option to automatically fetch all submodules: ~~~sh git clone --recursive https://git.example.org/pd/superbonk~.git ~~~ If you've cloned non-recursively, you can initialize and update the submodules manually: ~~~sh git submodule init git submodule update ~~~ #### Updating the submodule Submodules are usually fixed to a given commit in their repository. To update the `pd-lib-builder` submodule to the current `master` do something like: ~~~sh cd pd-lib-builder git checkout master git pull cd .. git status pd-lib-builder git commit pd-lib-builder -m "Updated pd-lib-builder to current master" ~~~ #### Pulling the updated submodule into existing clones After you have pushed the submodule updates in your repository, other clones of the repository can be updated as follows: ~~~sh git pull ~~~ The above will make your repository aware, that the submodule is out-of-sync. ~~~sh $ LANG=C git status pd-lib-builder On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: pd-lib-builder (new commits) $ ~~~ In order to sync the submodule to the correct commit, run the following: ~~~sh git submodule update ~~~ #### Drawbacks `git submodule` has a number of drawbacks: - it requires special commands to synchronize the submodules, in addition to synching your repository. - you must make sure to use an URL for the submodule that is accessible to your potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad, because it requires everybody who wants to checkout your sources to have a github-account - even if they could checkout *your* repository anonymously. - submodules will be excluded from `git archive`. This means, that if you use a mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases by creating a `git tag`, the automatically generated zipfiles with the sources will lack the submodule - and your users will not be able to compile your source code. In general, I would suggest to **avoid** `git submodule`, and instead use the better `git subtree` (above). iem_utils-0.0.20240903/punish/triggerize-plugin/0000700000000000000000000000000014665566711016157 5ustar00iem_utils-0.0.20240903/punish/triggerize-plugin/LICENSE.md0000600000000000000000000004364214665566711017576 0ustar00GNU GENERAL PUBLIC LICENSE ========================== Version 2, June 1991 > Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. # Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. # GNU GENERAL PUBLIC LICENSE # ## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ## - *0\.* This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - 1\. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2\. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3\. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - 4\. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 5\. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - 6\. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - 7\. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 8\. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 9\. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - 10\. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. ## NO WARRANTY - 11\. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 12\. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ## END OF TERMS AND CONDITIONS ## --------------------------------------------------------------------------- ### How to Apply These Terms to Your New Programs ### If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. iem_utils-0.0.20240903/punish/triggerize-plugin/Makefile0000700000000000000000000000166014665566711017625 0ustar00#!/usr/bin/make -f # Makefile for pure data externals in lib creb. # Needs Makefile.pdlibbuilder to work (https://github.com/pure-data/pd-lib-builder) punish.name = triggerize lib.name = $(punish.name)-plugin # special file that does not provide a class lib.setup.sources = # all other C and C++ files in subdirs are source files per class # (alternatively, enumerate them by hand) class.sources = $(punish.name).c datafiles = \ $(punish.name)-plugin.tcl \ $(wildcard *-help.pd) \ README.md LICENSE.md datadirs = ################################################################################ ### pdlibbuilder ############################################################### ################################################################################ # Include Makefile.pdlibbuilder from this directory, # or else from some user-defined folder PDLIBBUILDER_DIR=../pd-lib-builder include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder iem_utils-0.0.20240903/punish/triggerize-plugin/README.md0000600000000000000000000000443614665566711017447 0ustar00triggerize ========== - replace fan-outs with [t a a ...] - when selecting a single line: insert [t a] - when selecting a [trigger]: insert "a" at the beginning # Usage ### removing fan-outs - Select objects with fan-outs - Press Control+t - the (msg) fan-outs will be replaced by (connected) [t a a] objects ### removing all fan-outs - Select All objects (Control-a) - Press Control+t - all fan-outs will be replaced by (connected) [t a a] objects ### adding new left-hand outlet to [trigger] - Select a [trigger] object - Press Control+t - a new (unconnected) left-most outlet of type "a" will be created. ### inserting triggers - Select a single (msg) connection - Press Control+t - the connection will be replaced by a (connected) `[t a]` object ### inserting nop~ for signals - Select a single signal connection - Press Control+t - the connection will be replaced by a (connected) `[pd nop~]` object You can also use the menu: - `Edit` -> `Triggerize` OSX users should use Cmd instead of Control # Installation ## Building Build the external: make If you have an unusual setup (and/or your Pd installation is at a place not found by the compiler), you can parameterize the build. Try this first: make help ## Installing Put both the externals (`triggerize.pd_linux` or similar) and the GUI plugin (`triggerize-plugin.tcl`) into a directory `triggerize-plugin`, and put that into a place where Pd can find it. make install E.g. $ ls ~/.local/lib/pd/extra/triggerize-plugin/ ~/.local/lib/pd/extra/triggerize-plugin/triggerize.pd_linux ~/.local/lib/pd/extra/triggerize-plugin/triggerize-plugin.tcl # BUGS ## none known TODO # AUTHORS IOhannes m zmölnig # LICENSE `triggerize` is released under the Gnu GPL version 2 (or later). See LICENSE.md for the full text of the GPLv2. ## Special license grant to Miller Puckette I hereby grant Miller S. Puckette the exclusive right to include `triggerize` into Pure Data (Pd) under the BSD 3-clause license under which Pd is currently released. Once it has been included into Pd it is of course re-distributable under that license. Until then, the Gnu GPL v2 (or later) applies. iem_utils-0.0.20240903/punish/triggerize-plugin/triggerize-help.pd0000600000000000000000000000412114665566711021605 0ustar00#N canvas 30 90 692 704 10; #X obj 21 159 cnv 15 350 160 empty empty empty 20 12 0 14 -233017 -66577 0; #X obj 331 339 cnv 15 250 160 empty empty empty 20 12 0 14 -233017 -66577 0; #X obj 21 339 cnv 15 200 160 empty empty empty 20 12 0 14 -233017 -66577 0; #X text 105 104 1st \, select a few objects; #X floatatom 391 411 5 0 0 0 - - -, f 5; #X floatatom 391 467 5 0 0 0 - - -, f 5; #X text 369 372 select coord; #X floatatom 105 393 5 0 0 0 - - -, f 5; #X obj 105 412 t b f; #X obj 119 448 i; #X floatatom 119 470 5 0 0 0 - - -, f 5; #X text 90 369 select [trigger]; #X obj 488 411 sig~ 3; #X obj 488 466 osc~; #X text 469 371 select coord; #X text 104 123 then press + (+ on OSX) to add [trigger] objects ad lib., f 75; #X text 33 346 expand [t] to the left::; #X text 342 347 insert objects into coord::; #X text 18 534 installation instructions:; #X text 37 618 2.) Restart Pd; #X text 66 596 "Just say NO" \, if the plugin installer asks you to do so.; #X text 38 553 1.) put the triggerize-plugin/ folder somewhere in Pd's search path., f 68; #X text 37 576 1.1) DO NOT add the triggerize-plugin/ folder to the search path., f 66; #X text 38 27 ==========; #X text 38 16 triggerize; #X text 37 48 all things trigger: get rid of fan-outs \, insert triggers into connections \, add new inlets to triggers \, ..., f 69; #X text 41 94 usage:; #X floatatom 45 219 5 0 0 0 - - -, f 5; #X obj 45 268 *; #X floatatom 45 290 5 0 0 0 - - -, f 5; #X floatatom 95 219 5 0 0 0 - - -, f 5; #X obj 95 268 *; #X floatatom 95 290 5 0 0 0 - - -, f 5; #X text 35 196 select numbox; #X floatatom 249 235 5 0 0 0 - - -, f 5; #X obj 253 276 + 1; #X obj 249 254 t b f; #X floatatom 284 279 5 0 0 0 - - -, f 5; #X text 239 208 select [trigger]; #X text 37 167 getting rid of fan-out::; #X connect 4 0 5 0; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 8 1 9 1; #X connect 9 0 10 0; #X connect 12 0 13 0; #X connect 27 0 28 0; #X connect 27 0 28 1; #X connect 28 0 29 0; #X connect 30 0 31 1; #X connect 30 0 31 0; #X connect 31 0 32 0; #X connect 34 0 36 0; #X connect 36 0 35 0; #X connect 36 1 35 1; #X connect 36 1 37 0; iem_utils-0.0.20240903/punish/triggerize-plugin/triggerize-plugin.tcl0000600000000000000000000000377714665566711022352 0ustar00# META helper plugin for triggerize-selection # META DESCRIPTION adds menu to tell the 'triggerize' library to doit # META AUTHOR IOhannes m zmölnig # META VERSION 0.1 package require pdwindow 0.1 if [catch { package require msgcat ::msgcat::mcload po }] { puts "iem::punish::triggerize: i18n failed" } namespace eval ::iem::punish::triggerize:: { variable label proc focus {winid state} { set menustate [expr $state?"normal":"disabled"] .menubar.edit entryconfigure "$::iem::punish::triggerize::label" -state $menustate } proc register {} { # create an entry for our "triggerize" in the "edit" menu set ::iem::punish::triggerize::label [_ "Triggerize Selection"] set accelerator $::pd_menus::accelerator set mymenu .menubar.edit if {$::windowingsystem eq "aqua"} { set inserthere 8 set accelerator "$accelerator" } else { set inserthere 8 set accelerator "$accelerator" } set accelerator "$accelerator+T" $mymenu insert $inserthere command \ -label $::iem::punish::triggerize::label \ -state disabled \ -accelerator "$accelerator" \ -command { menu_send $::focused_window triggerize } bind all <$::modifier-Key-t> {menu_send %W triggerize} bind PatchWindow "+::iem::punish::triggerize::focus %W 1" bind PdWindow "+::iem::punish::triggerize::focus %W 0" # attempt to load the 'triggerize' library from iem::punish # (that does all the work) set lib [string map {" " "\\ "} [file join $::current_plugin_loadpath triggerize]] pdsend "pd-_float_template declare -lib $lib" ::pdwindow::post "loaded iem::punish::triggerize-plugin\n" } } if {[ expr $::PD_MAJOR_VERSION.$::PD_MINOR_VERSION < 0.49 ]} { ::iem::punish::triggerize::register } { ::pdwindow::debug "disabled iem::punish::triggerize on Pd>=0.49\n" } iem_utils-0.0.20240903/punish/triggerize-plugin/triggerize.c0000600000000000000000000003211414665566711020501 0ustar00/****************************************************** * * triggerize - implementation file * * copyleft (c) IOhannes m zmölnig * * 2016:forum::für::umläute:2016 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 (or later) * ******************************************************/ #include "m_pd.h" #include "g_canvas.h" #include "m_imp.h" #define MARK() post("%s:%d\t%s", __FILE__, __LINE__, __FUNCTION__) /* ------------ utilities ---------- */ static t_gobj*o2g(t_object*obj) { return &(obj->te_g); } static t_object*g2o(t_gobj*gobj) { return pd_checkobject(&gobj->g_pd); } t_gobj*glist_getlast(t_glist*cnv) { t_gobj*result=NULL; for(result=cnv->gl_list; result->g_next;) result=result->g_next; return result; } static void dereconnect(t_glist*cnv, t_object*org, t_object*replace) { t_gobj*gobj; for(gobj=cnv->gl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); int obj_nout=0; int nout; if(!obj)continue; obj_nout=obj_noutlets(obj); for(nout=0; noutgl_pd; s__N.s_thing = &pd_canvasmaker; binbuf_eval(b, 0, 0, 0); s__X.s_thing = boundx; s__N.s_thing = boundn; return g2o(glist_getlast(x)); } static void stack_conn(t_object*new, int*newoutlet, t_object*org, int orgoutlet, t_outconnect*conn){ t_object*dest=0; t_inlet *in =0; int which; conn=obj_nexttraverseoutlet(conn, &dest, &in, &which); if(conn) stack_conn(new, newoutlet, org, orgoutlet, conn); obj_disconnect(org, orgoutlet, dest, which); obj_connect(new, *newoutlet, dest, which); (*newoutlet)++; } static int has_fanout(t_object*obj) { int obj_nout=obj_noutlets(obj); int nout; /* check if we actually do have a fan out */ for(nout=0; noutgl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); if(obj && glist_isselected(cnv, gobj) && (s_trigger != obj->te_g.g_pd->c_name)) { return 0; } } return 1; } /* ------------------------- triggerize ---------------------------- */ static int triggerize_fanout_inplace(t_glist*x, t_object*obj) { /* avoid fanouts in [t] objects by adding additional outlets */ int posX=obj->te_xpix; int posY=obj->te_ypix; t_atom*argv=binbuf_getvec(obj->te_binbuf); int argc=binbuf_getnatom(obj->te_binbuf); int obj_nout=obj_noutlets(obj); int nout, newout; t_binbuf*b=0; t_object*stub=0; /* check if we actually do have a fan out */ if(!has_fanout(obj))return 0; /* create a new trigger object, that has outlets for the fans */ b=binbuf_new(); binbuf_addv(b, "ssii", gensym("#X"), gensym("obj"), posX, posY); binbuf_add(b, 1, argv); argc--; argv++; for(nout=0; noutte_xpix-10; int posY=obj->te_ypix+20; t_binbuf*b=binbuf_new(); int didit=0; /* if the object is a [trigger], we just insert new outlets */ if(s_trigger == obj->te_g.g_pd->c_name) { return triggerize_fanout_inplace(x, obj); } /* for other objects, we create a new [trigger a a] object and replace the fan-out with that */ for(nout=0; nout1) { /* fan out */ int i; t_object*stub=0; binbuf_clear(b); binbuf_addv(b, "ssiis", gensym("#X"), gensym("obj"), posX, posY, gensym("t")); for(i=0; igl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); if(obj && glist_isselected(cnv, gobj) && triggerize_fanout(cnv, obj)) count++; } return count; } static int triggerize_line(t_glist*x) { /* triggerize a single selected line, by inserting a [t a] object * (or it's signal equivalen) */ t_editor*ed=x->gl_editor; int src_obj, src_out, dst_obj ,dst_in; t_gobj *src = 0, *dst = 0; t_binbuf*b=0; int posx=100, posy=100; t_object*stub=0; if(!ed->e_selectedline) return 0; src_obj=ed->e_selectline_index1; src_out=ed->e_selectline_outno; dst_obj=ed->e_selectline_index2; dst_in =ed->e_selectline_inno; for (src = x->gl_list; src_obj; src = src->g_next, src_obj--) if (!src->g_next) goto bad; for (dst = x->gl_list; dst_obj; dst = dst->g_next, dst_obj--) if (!dst->g_next) goto bad; src_obj=ed->e_selectline_index1; dst_obj=ed->e_selectline_index2; if(1) { t_object*obj1=g2o(src); t_object*obj2=g2o(dst); if(obj1 && obj2) { posx=(obj1->te_xpix+obj2->te_xpix)>>1; posy=(obj1->te_ypix+obj2->te_ypix)>>1; } } b=binbuf_new(); if(obj_issignaloutlet(g2o(src), src_out)) { binbuf_addv(b, "ssiiiisi;", gensym("#N"), gensym("canvas"), 200, 100, 190, 200, gensym("nop~"), 0); binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), 50, 70, gensym("inlet~")); binbuf_addv(b, "ssiis;", gensym("#X"), gensym("obj"), 50,140, gensym("outlet~")); binbuf_addv(b, "ssiiii;", gensym("#X"), gensym("connect"), 0,0,1,0); binbuf_addv(b, "ssiiss", gensym("#X"), gensym("restore"), posx, posy, gensym("pd"), gensym("nop~")); } else { binbuf_addv(b,"ssii", gensym("#X"), gensym("obj"), posx, posy); binbuf_addv(b,"ss", gensym("t"), gensym("a")); } binbuf_addsemi(b); stub=triggerize_createobj(x, b); binbuf_free(b);b=0; obj_disconnect(g2o(src), src_out, g2o(dst), dst_in); obj_connect(g2o(src), src_out, stub, 0); obj_connect(stub, 0, g2o(dst), dst_in); glist_select(x, o2g(stub)); return 1; bad: return 0; } static int minimize_trigger(t_glist*cnv, t_object*obj) { /* remove all unused outlets from [trigger] */ t_binbuf*b=binbuf_new(); t_atom*argv=binbuf_getvec(obj->te_binbuf); t_object*stub=0; int obj_nout=obj_noutlets(obj); int nout; int count = 0; binbuf_addv(b, "ssii", gensym("#X"), gensym("obj"), obj->te_xpix, obj->te_ypix); binbuf_add(b, 1, argv); /* go through all the outlets, and add those that have connections */ for(nout = 0; nout < obj_nout; nout++) { t_outlet*out=0; t_outconnect*conn = obj_starttraverseoutlet(obj, &out, nout); if(conn) { binbuf_add(b, 1, argv + 1 + nout); } else { count++; } } if(!count || count == obj_nout) { /* either no outlet to delete or all: skip this object */ binbuf_free(b); return 0; } /* create the replacement object (which only has outlets that are going to be connected) */ stub=triggerize_createobj(cnv, b); /* no go through the original object's outlets, and duplicate the connection * of each to the new object */ for(nout=0, count=0; noutte_binbuf); t_atom*argv=binbuf_getvec(obj->te_binbuf); t_object*stub=0; int obj_nout=obj_noutlets(obj); int nout; binbuf_addv(b, "ssii", gensym("#X"), gensym("obj"), obj->te_xpix, obj->te_ypix); binbuf_add(b, 1, argv); binbuf_addv(b, "s", gensym("a")); binbuf_add(b, argc-1, argv+1); stub=triggerize_createobj(cnv, b); for(nout=0; noutgl_list; gobj; gobj=gobj->g_next) { t_object*obj=g2o(gobj); if(obj && glist_isselected(cnv, gobj)) { const t_symbol*c_name=obj->te_g.g_pd->c_name; if((s_trigger == c_name) && fun(cnv, obj)) count++; } } return count; } static int triggerize_triggers(t_glist*cnv) { /* cleanup [trigger] objects */ int count=0; /* nothing to do, if the selection is not exclusively [trigger] objects */ if(!only_triggers_selected(cnv)) return 0; /* TODO: here's the place to merge multiple connected triggers */ /* * remove all unused outlets from (selected) triggers */ count = with_triggers(cnv, minimize_trigger); if(count) return count; /* * expand each (selected) trigger to the left */ count = with_triggers(cnv, expand_trigger); if(count) return count; /* nothing more to do */ return 0; } static void canvas_do_triggerize(t_glist*cnv) { /* * selected msg-connection: insert [t a] * selected sig-connection: insert [pd nop~] * selected [trigger]s with fan-outs: remove them (by inserting new outlets of the correct type) * selected objects with fan-outs: remove fan-outs * selected [trigger]: remove unused outlets * selected [trigger]: else, add left-most "a" outlet */ if(triggerize_line(cnv))return; if(triggerize_fanouts(cnv))return; if(triggerize_triggers(cnv))return; } static void canvas_triggerize(t_glist*cnv) { int dspstate; if(NULL == cnv)return; /* suspend system */ dspstate = canvas_suspend_dsp(); canvas_do_triggerize(cnv); /* restore state */ canvas_redraw(cnv); glist_redraw(cnv); canvas_resume_dsp(dspstate); } void triggerize_setup(void) { int major, minor, bugfix; sys_getversion(&major, &minor, &bugfix); if((major>0 || minor >= 49)) { pd_error(0, "triggerize built into Pd>=0.49, not enabling iem::punish::triggerize"); return; } if(NULL==canvas_class) { logpost(0, PD_VERBOSE, "triggerize detected class_new() @ %p", class_new); return; } post("triggerize - insert [trigger] ad lib."); if(NULL==zgetfn(&canvas_class, gensym("triggerize"))) class_addmethod(canvas_class, (t_method)canvas_triggerize, gensym("triggerize"), 0); } iem_utils-0.0.20240903/tclprompt-plugin/0000700000000000000000000000000014665566711014522 5ustar00iem_utils-0.0.20240903/tclprompt-plugin/LICENSE0000600000000000000000000000271414665566711015535 0ustar00Copyright (c) 2015, pure-data All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of tclprompt-plugin nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. iem_utils-0.0.20240903/tclprompt-plugin/README.md0000600000000000000000000000115214665566711016002 0ustar00interactive Tcl/Tk prompt === When developing GUI-plugins (or debugging Pd) it often helps to have a little interactive Tcl/Tk prompt within Pd. This plugin enables one for you. For Pd versions that come with their own implementation of a TclPrompt (that's Pd-0.43..0.46) it will simply enable that one. For newer versions of Pd that lack a built-in TclPrompt, the plugin provides one. ## Installing simply copy the [tclprompt-plugin.tcl](https://raw.githubusercontent.com/pure-data/tclprompt-plugin/master/tclprompt-plugin.tcl) into your Pd searchpath. ## AUTHORS - IOhannes m zmölnig - Hans-Christoph Steiner iem_utils-0.0.20240903/tclprompt-plugin/tclprompt-plugin.tcl0000600000000000000000000001036414665566711020554 0ustar00# META TCL/TK prompt plugin # META DESCRIPTION enables a wee Tcl/Tk cmdline within the Pd-console # META AUTHOR IOhannes m zmölnig , Hans-Christoph Steiner # META VERSION 0.1 package require pdwindow 0.1 namespace eval ::tclprompt:: { } proc ::tclprompt_disable_menu {} { # disable the TclPrompt menu (as gives an error if we re-create) set mymenu .menubar.help if {[catch {$mymenu entryconfigure [_ "Tcl prompt"] -state disabled}]} { } } ## first check if the Pd-runtime provides a tcl_entry (and use it) if {[catch XXX::pdwindow::create_tcl_entry errorname]} { ## if that fails, we need to provide our own (code shamelessly taken from Pd-0.46) namespace eval ::tclprompt:: { variable tclentry {} variable tclentry_history {"console show"} variable history_position 0 variable show 1 } proc ::tclprompt::eval_tclentry {} { variable tclentry variable tclentry_history variable history_position 0 if {$tclentry eq ""} {return} ;# no need to do anything if empty if {[catch {uplevel #0 $tclentry} errorname]} { global errorInfo switch -regexp -- $errorname { "missing close-brace" { ::pdwindow::error [concat [_ "(Tcl) MISSING CLOSE-BRACE '\}': "] $errorInfo]\n } "missing close-bracket" { ::pdwindow::error [concat [_ "(Tcl) MISSING CLOSE-BRACKET '\]': "] $errorInfo]\n } "^invalid command name" { ::pdwindow::error [concat [_ "(Tcl) INVALID COMMAND NAME: "] $errorInfo]\n } default { ::pdwindow::error [concat [_ "(Tcl) UNHANDLED ERROR: "] $errorInfo]\n } } } lappend tclentry_history $tclentry set tclentry {} } proc ::tclprompt::get_history {direction} { variable tclentry_history variable history_position incr history_position $direction if {$history_position < 0} {set history_position 0} if {$history_position > [llength $tclentry_history]} { set history_position [llength $tclentry_history] } .pdwindow.tclprompt.entry delete 0 end .pdwindow.tclprompt.entry insert 0 \ [lindex $tclentry_history end-[expr $history_position - 1]] } proc ::tclprompt::validate_tcl {} { variable tclentry if {[info complete $tclentry]} { .pdwindow.tclprompt.entry configure -background "white" } else { .pdwindow.tclprompt.entry configure -background "#FFF0F0" } } #--create tcl entry-----------------------------------------------------------# proc ::tclprompt::create {} { # Tcl entry box frame frame .pdwindow.tclprompt -borderwidth 0 pack .pdwindow.tclprompt -side bottom -fill x -before .pdwindow.text label .pdwindow.tclprompt.label -text [_ "Tcl:"] -anchor e pack .pdwindow.tclprompt.label -side left entry .pdwindow.tclprompt.entry -width 200 \ -exportselection 1 -insertwidth 2 -insertbackground blue \ -textvariable ::tclprompt::tclentry -font {$::font_family -12} pack .pdwindow.tclprompt.entry -side left -fill x # bindings for the Tcl entry widget bind .pdwindow.tclprompt.entry <$::modifier-Key-a> "%W selection range 0 end; break" bind .pdwindow.tclprompt.entry "::tclprompt::eval_tclentry" bind .pdwindow.tclprompt.entry "::tclprompt::get_history 1" bind .pdwindow.tclprompt.entry "::tclprompt::get_history -1" bind .pdwindow.tclprompt.entry +"::tclprompt::validate_tcl" bind .pdwindow.text "focus .pdwindow.tclprompt.entry; break" # pack .pdwindow.tclprompt } proc ::tclprompt::destroy {} { ::destroy .pdwindow.tclprompt } ::tclprompt_disable_menu set mymenu .menubar.help $mymenu add separator $mymenu add check -label [_ "Tcl prompt"] -variable ::tclprompt::show \ -command {::tclprompt::toggle $::tclprompt::show} # bind all <$::modifier-Key-s> {::deken::open_helpbrowser .helpbrowser2} ::tclprompt::create } else { puts "built-in TclPrompt" ::tclprompt_disable_menu proc ::tclprompt::create {} {} proc ::tclprompt::destroy {} { # actually we *can* destroy it, but we cannot re-create it ::pdwindow::error "cannot destroy built-in TclPrompt" } } proc ::tclprompt::toggle {state} { if { $state } { ::tclprompt::create } { ::tclprompt::destroy } } proc ::tclprompt::test {} { after 1000 ::tclprompt::create ::tclprompt::destroy } pdtk_post "loaded tclprompt-plugin\n"